From c4974495497bfda595e22aa759ab43ab17cb51d7 Mon Sep 17 00:00:00 2001 From: zarzet Date: Sun, 26 Jul 2026 17:56:38 +0700 Subject: [PATCH] feat(library): M3U8 playlist import and export The playlist import picker now also accepts .m3u/.m3u8; EXTINF entries feed the same Deezer enrichment pipeline as CSV. Collection screens (wishlist, loved, playlists) gain an export action that resolves each track to its local file, writes SAF entries relative to the download tree root so external players and DAP copies resolve them, skips tracks without a file, and shares the .m3u8 via the system sheet. --- lib/l10n/app_localizations.dart | 67 +- lib/l10n/app_localizations_ar.dart | 4659 ------ lib/l10n/app_localizations_de.dart | 14 + lib/l10n/app_localizations_en.dart | 18 +- lib/l10n/app_localizations_es.dart | 16 +- lib/l10n/app_localizations_fr.dart | 14 + lib/l10n/app_localizations_hi.dart | 4659 ------ lib/l10n/app_localizations_id.dart | 14 + lib/l10n/app_localizations_ja.dart | 14 + lib/l10n/app_localizations_ko.dart | 4530 ----- lib/l10n/app_localizations_nl.dart | 4659 ------ lib/l10n/app_localizations_pt.dart | 16 +- lib/l10n/app_localizations_ru.dart | 14 + lib/l10n/app_localizations_tr.dart | 14 + lib/l10n/app_localizations_uk.dart | 14 + lib/l10n/app_localizations_zh.dart | 13676 ---------------- lib/l10n/arb/app_ar.arb | 5887 ------- lib/l10n/arb/app_en.arb | 30 +- lib/l10n/arb/app_hi.arb | 5887 ------- lib/l10n/arb/app_ko.arb | 5887 ------- lib/l10n/arb/app_nl.arb | 5887 ------- lib/l10n/arb/app_zh.arb | 4283 ----- lib/l10n/arb/app_zh_CN.arb | 5887 ------- lib/l10n/arb/app_zh_TW.arb | 5887 ------- lib/l10n/supported_locales.dart | 8 +- lib/providers/playback_provider.dart | 5 + lib/screens/library_tracks_folder_screen.dart | 73 + lib/services/csv_import_service.dart | 11 +- lib/services/m3u_playlist_service.dart | 149 + test/m3u_playlist_service_test.dart | 96 + 30 files changed, 533 insertions(+), 71842 deletions(-) delete mode 100644 lib/l10n/app_localizations_ar.dart delete mode 100644 lib/l10n/app_localizations_hi.dart delete mode 100644 lib/l10n/app_localizations_ko.dart delete mode 100644 lib/l10n/app_localizations_nl.dart delete mode 100644 lib/l10n/app_localizations_zh.dart delete mode 100644 lib/l10n/arb/app_ar.arb delete mode 100644 lib/l10n/arb/app_hi.arb delete mode 100644 lib/l10n/arb/app_ko.arb delete mode 100644 lib/l10n/arb/app_nl.arb delete mode 100644 lib/l10n/arb/app_zh.arb delete mode 100644 lib/l10n/arb/app_zh_CN.arb delete mode 100644 lib/l10n/arb/app_zh_TW.arb create mode 100644 lib/services/m3u_playlist_service.dart create mode 100644 test/m3u_playlist_service_test.dart diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index efe0fee1..762f86c9 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -5,21 +5,16 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; -import 'app_localizations_ar.dart'; import 'app_localizations_de.dart'; import 'app_localizations_en.dart'; import 'app_localizations_es.dart'; import 'app_localizations_fr.dart'; -import 'app_localizations_hi.dart'; import 'app_localizations_id.dart'; import 'app_localizations_ja.dart'; -import 'app_localizations_ko.dart'; -import 'app_localizations_nl.dart'; import 'app_localizations_pt.dart'; import 'app_localizations_ru.dart'; import 'app_localizations_tr.dart'; import 'app_localizations_uk.dart'; -import 'app_localizations_zh.dart'; // ignore_for_file: type=lint @@ -107,25 +102,18 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('ar'), Locale('de'), Locale('en'), Locale('es'), Locale('es', 'ES'), Locale('fr'), - Locale('hi'), Locale('id'), Locale('ja'), - Locale('ko'), - Locale('nl'), Locale('pt'), Locale('pt', 'PT'), Locale('ru'), Locale('tr'), Locale('uk'), - Locale('zh'), - Locale('zh', 'CN'), - Locale('zh', 'TW'), ]; /// App name - DO NOT TRANSLATE @@ -1235,7 +1223,7 @@ abstract class AppLocalizations { /// Dialog message - import playlist confirmation /// /// In en, this message translates to: - /// **'Found {count} tracks in CSV. Add them to download queue?'** + /// **'Found {count} tracks in the playlist file. Add them to download queue?'** String dialogImportPlaylistMessage(int count); /// Label shown in quality picker for CSV import @@ -1244,6 +1232,30 @@ abstract class AppLocalizations { /// **'{count} tracks from CSV'** String csvImportTracks(int count); + /// Tooltip on the collection screen action that exports the track list as an M3U8 playlist file + /// + /// In en, this message translates to: + /// **'Export as M3U8'** + String get collectionExportM3u; + + /// Snackbar after M3U8 export; tracks without a local file are not exported + /// + /// In en, this message translates to: + /// **'Exported {exported} of {total} tracks'** + String collectionExportM3uDone(int exported, int total); + + /// Snackbar when an M3U8 export finds no local files + /// + /// In en, this message translates to: + /// **'No downloaded files to export'** + String get collectionExportM3uNone; + + /// Snackbar when writing or sharing the M3U8 export fails + /// + /// In en, this message translates to: + /// **'Export failed'** + String get collectionExportM3uFailed; + /// Snackbar - track added to download queue /// /// In en, this message translates to: @@ -6106,10 +6118,10 @@ abstract class AppLocalizations { /// **'Search with {providerName}...'** String homeSearchHintProvider(String providerName); - /// Tooltip for importing a CSV file into Home search + /// Tooltip for importing a CSV or M3U playlist file into Home search /// /// In en, this message translates to: - /// **'Import CSV'** + /// **'Import playlist (CSV, M3U)'** String get homeImportCsvTooltip; /// Tooltip for the Home search provider picker @@ -7664,21 +7676,16 @@ class _AppLocalizationsDelegate @override bool isSupported(Locale locale) => [ - 'ar', 'de', 'en', 'es', 'fr', - 'hi', 'id', 'ja', - 'ko', - 'nl', 'pt', 'ru', 'tr', 'uk', - 'zh', ].contains(locale.languageCode); @override @@ -7704,22 +7711,10 @@ AppLocalizations lookupAppLocalizations(Locale locale) { } break; } - case 'zh': - { - switch (locale.countryCode) { - case 'CN': - return AppLocalizationsZhCn(); - case 'TW': - return AppLocalizationsZhTw(); - } - break; - } } // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'ar': - return AppLocalizationsAr(); case 'de': return AppLocalizationsDe(); case 'en': @@ -7728,16 +7723,10 @@ AppLocalizations lookupAppLocalizations(Locale locale) { return AppLocalizationsEs(); case 'fr': return AppLocalizationsFr(); - case 'hi': - return AppLocalizationsHi(); case 'id': return AppLocalizationsId(); case 'ja': return AppLocalizationsJa(); - case 'ko': - return AppLocalizationsKo(); - case 'nl': - return AppLocalizationsNl(); case 'pt': return AppLocalizationsPt(); case 'ru': @@ -7746,8 +7735,6 @@ AppLocalizations lookupAppLocalizations(Locale locale) { return AppLocalizationsTr(); case 'uk': return AppLocalizationsUk(); - case 'zh': - return AppLocalizationsZh(); } throw FlutterError( diff --git a/lib/l10n/app_localizations_ar.dart b/lib/l10n/app_localizations_ar.dart deleted file mode 100644 index 421d24a6..00000000 --- a/lib/l10n/app_localizations_ar.dart +++ /dev/null @@ -1,4659 +0,0 @@ -// ignore: unused_import -import 'package:intl/intl.dart' as intl; -import 'app_localizations.dart'; - -// ignore_for_file: type=lint - -/// The translations for Arabic (`ar`). -class AppLocalizationsAr extends AppLocalizations { - AppLocalizationsAr([String locale = 'ar']) : super(locale); - - @override - String get appName => 'SpotiFLAC Mobile'; - - @override - String get navHome => 'الرئيسية'; - - @override - String get navLibrary => 'المكتبة'; - - @override - String get navSettings => 'الإعدادات'; - - @override - String get navStore => 'المستودع'; - - @override - String get homeTitle => 'الصفحة الرئيسية'; - - @override - String get homeSubtitle => 'ألصق عنوان URL مدعوم أو ابحث بالاسم'; - - @override - String get homeEmptyTitle => 'لا يوجد مزودي بحث بعد'; - - @override - String get homeEmptySubtitle => 'قم بتثبيت مكون إضافي للمتابعة.'; - - @override - String get homeSupports => - 'يدعم: الأغنية، الألبوم، قائمة التشغيل، عناوين URL للفنان'; - - @override - String get homeRecent => 'الأخيرة'; - - @override - String get historyFilterAll => 'الكل'; - - @override - String get historyFilterAlbums => 'الألبومات'; - - @override - String get historyFilterSingles => 'الأغاني'; - - @override - String get historySearchHint => 'سجل البحث...'; - - @override - String get settingsTitle => 'الإعدادات'; - - @override - String get settingsDownload => 'إعدادات التحميل'; - - @override - String get settingsAppearance => 'المظهر'; - - @override - String get settingsExtensions => 'الإضافات'; - - @override - String get settingsAbout => 'حول البرنامج'; - - @override - String get downloadTitle => 'إعدادات التحميل'; - - @override - String get downloadAskQualitySubtitle => 'إظهار منتقي الجودة لكل تنزيل'; - - @override - String get downloadFilenameFormat => 'تنسيق اسم الملف'; - - @override - String get downloadSingleFilenameFormat => 'تنسيق اسم الملف الفردي'; - - @override - String get downloadSingleFilenameFormatDescription => - 'نمط اسم الملف للعازفين و EPs. يستخدم نفس العلامات مثل تنسيق الألبوم.'; - - @override - String get downloadFolderOrganization => 'تنظيم المجلدات'; - - @override - String get appearanceTitle => 'المظهر'; - - @override - String get appearanceThemeSystem => 'النظام'; - - @override - String get appearanceThemeLight => 'فاتح'; - - @override - String get appearanceThemeDark => 'مظلم'; - - @override - String get appearanceDynamicColor => 'لون ديناميكي'; - - @override - String get appearanceDynamicColorSubtitle => 'استخدام الألوان من الخلفية'; - - @override - String get appearanceHistoryView => 'عرض السجل'; - - @override - String get appearanceHistoryViewList => 'قائمة'; - - @override - String get appearanceHistoryViewGrid => 'شبكة'; - - @override - String get optionsPrimaryProvider => 'المزود الرئيسي'; - - @override - String get optionsPrimaryProviderSubtitle => - 'الخدمة المستخدمة للبحث عن طريق اسم الأغنية أو الألبوم'; - - @override - String optionsUsingExtension(String extensionName) { - return 'استخدام الإضافة: $extensionName'; - } - - @override - String get optionsDefaultSearchTab => 'تبويب البحث الافتراضي'; - - @override - String get optionsDefaultSearchTabSubtitle => - 'اختر علامة التبويب التي تفتح أولاً لنتائج البحث الجديدة.'; - - @override - String get optionsAutoFallback => 'التراجع التلقائي'; - - @override - String get optionsAutoFallbackSubtitle => 'تجربة خدمات أخرى إذا فشل التنزيل'; - - @override - String get optionsEmbedLyrics => 'تضمين كلمات الأغنية'; - - @override - String get optionsEmbedLyricsSubtitle => - 'حفظ كلمات الأغاني المتزامنة جنبا إلى جنب مع المسارات التي تم تنزيلها'; - - @override - String get optionsMaxQualityCover => 'اختيار أعلى جودة للغلاف'; - - @override - String get optionsMaxQualityCoverSubtitle => 'تنزيل أعلى دقة لغلاف الأغنية'; - - @override - String get optionsReplayGain => 'ReplyGain'; - - @override - String get optionsReplayGainSubtitleOn => - 'مسح الصوت و تضمين علامات ReplayGain (EBU R128)'; - - @override - String get optionsReplayGainSubtitleOff => 'معطل: لا توجد علامات تطبيع للصوت'; - - @override - String get trackReplayGain => 'إعادة مسح ReplyGain'; - - @override - String get trackReplayGainScanning => 'تحليل الصوت...'; - - @override - String get trackReplayGainSuccess => 'تم إضافة وسم ReplyGain'; - - @override - String get trackReplayGainFailed => 'فشل في إضافة علامات ReplayGain'; - - @override - String selectionReplayGainCount(int count) { - return 'ٌReplyGain ($count)'; - } - - @override - String get replayGainBatchConfirmTitle => 'إضافة ReplyGain'; - - @override - String replayGainBatchConfirmMessage(int count) { - return 'تحليل الصوت وكتابة وسوم ReplayGain إلى مسار(مسارات) $count؟'; - } - - @override - String get replayGainBatchAnalyzing => 'تحليل ReplyGain...'; - - @override - String replayGainBatchSuccess(int success, int total) { - return 'تمت إضافة وسوم ReplyGain ل $success أغنية من أصل $total'; - } - - @override - String get optionsArtistTagMode => 'وضع وسم الفنان'; - - @override - String get optionsArtistTagModeDescription => - 'اختر كيف يتم كتابة العديد من الفنانين في العلامات المضمنة.'; - - @override - String get optionsArtistTagModeJoined => 'قيمة مشتركة واحدة'; - - @override - String get optionsArtistTagModeJoinedSubtitle => - 'اكتب قيمة ARTIST واحدة مثل \"الفنان A، الفنان B\" لتحقيق التوافق الأقصى لمشغل الأغاني.'; - - @override - String get optionsArtistTagModeSplitVorbis => 'تقسيم العلامات على FLAC/Opus'; - - @override - String get optionsArtistTagModeSplitVorbisSubtitle => - 'اكتب علامة فنان لكل فنان لـ FLAC و Opus؛ تبقى MP3 و M4A منضمة.'; - - @override - String get optionsExtensionStore => 'مستودع الإضافات'; - - @override - String get optionsExtensionStoreSubtitle => - 'إظهار صفحة المستودع في شريط التنقل'; - - @override - String get optionsCheckUpdates => 'التحقق من وجود تحديثات'; - - @override - String get optionsCheckUpdatesSubtitle => 'إعلام عند توفر إصدار جديد'; - - @override - String get optionsUpdateChannel => 'قناة التحديث'; - - @override - String get optionsUpdateChannelStable => 'الإصدارات المستقرة فقط'; - - @override - String get optionsUpdateChannelPreview => 'الحصول على إصدارات تجريبية'; - - @override - String get optionsUpdateChannelWarning => - 'قد تحتوي الإصدارات التجريبية أخطاءً أو ميزات غير مكتملة'; - - @override - String get optionsClearHistory => 'مسح سجل التحميلات'; - - @override - String get optionsClearHistorySubtitle => - 'إزالة جميع الأغاني التي تم تنزيلها من السجل'; - - @override - String get optionsDetailedLogging => 'تسجيل تفصيلي'; - - @override - String get optionsDetailedLoggingOn => 'يتم تسجيل السجلات التفصيلية'; - - @override - String get optionsDetailedLoggingOff => 'تمكين لتقارير الأخطاء'; - - @override - String get extensionsTitle => 'الإضافات'; - - @override - String get extensionsDisabled => 'معطَّل'; - - @override - String extensionsVersion(String version) { - return 'الإصدار $version'; - } - - @override - String get extensionsUninstall => 'إلغاء التثبيت'; - - @override - String get storeTitle => 'مستودع الإضافات'; - - @override - String get storeSearch => 'البحث في الإضافات...'; - - @override - String get storeInstall => 'تثبيت'; - - @override - String get storeInstalled => 'مثبت'; - - @override - String get storeUpdate => 'تحديث'; - - @override - String get aboutTitle => 'حول'; - - @override - String get aboutContributors => 'المساهمون'; - - @override - String get aboutMobileDeveloper => 'مطور نسخة الهاتف'; - - @override - String get aboutOriginalCreator => 'منشئ SpotiFLAC'; - - @override - String get aboutLogoArtist => 'الفنان الموهوب الذي أنشأ شعار التطبيق الجميل!'; - - @override - String get aboutTranslators => 'المترجمون'; - - @override - String get aboutSpecialThanks => 'شكر خاص لِ'; - - @override - String get aboutLinks => 'روابط'; - - @override - String get aboutMobileSource => 'كود مصدر برنامج الهاتف'; - - @override - String get aboutPCSource => 'كود مصدر برنامج الكمبيوتر'; - - @override - String get aboutKeepAndroidOpen => 'ابقي اندرويد مفتوحا'; - - @override - String get aboutReportIssue => 'الإبلاغ عن خطأ'; - - @override - String get aboutReportIssueSubtitle => 'الإبلاغ عن أي مشكلة تواجهك'; - - @override - String get aboutFeatureRequest => 'اقتراح ميزة'; - - @override - String get aboutFeatureRequestSubtitle => 'اقتراح ميزات جديدة للتطبيق'; - - @override - String get aboutTelegramChannel => 'قناة تيليجرام'; - - @override - String get aboutTelegramChannelSubtitle => 'الإعلانات والتحديثات'; - - @override - String get aboutTelegramChat => 'مجتمع تليجرام'; - - @override - String get aboutTelegramChatSubtitle => 'الدردشة مع المستخدمين الآخرين'; - - @override - String get aboutSocial => 'التواصل الإجتماعي'; - - @override - String get aboutApp => 'التطبيق'; - - @override - String get aboutVersion => 'الإصدار'; - - @override - String get aboutBinimumDesc => - 'منشئ API QQDL و HiFi. ساعد هذا المشروع في تشكيل دعم تحميل غير فاقد للجودة.'; - - @override - String get aboutSachinsenalDesc => - 'منشئ مشروع HiFi الأصلي. مؤسسة للتكامل بدون مصدر.'; - - @override - String get aboutSjdonadoDesc => - 'منشئ ل I Don\'t Have Spotify (IHDS). محلل الروابط الذي ينقذ اليوم!'; - - @override - String get aboutAppDescription => - 'البحث عن بيانات التعريف الموسيقي، وإدارة الملحقات، وتنظيم مكتبتك.'; - - @override - String get artistAlbums => 'الألبومات'; - - @override - String get artistSingles => 'الأغاني و ال EPs'; - - @override - String get artistCompilations => 'التجميع'; - - @override - String get artistPopular => 'الأكثر شعبية'; - - @override - String artistMonthlyListeners(String count) { - return '$count مستمع شهري'; - } - - @override - String get trackMetadataService => 'الخدمة'; - - @override - String get trackMetadataPlay => 'تشغيل'; - - @override - String get trackMetadataShare => 'مشاركة'; - - @override - String get trackMetadataDelete => 'حذف'; - - @override - String get setupGrantPermission => 'منح الصلاحيات'; - - @override - String get setupSkip => 'التخطي الآن'; - - @override - String get setupStorageAccessRequired => 'إذن دخول وحدة التخزين مطلوب'; - - @override - String get setupStorageAccessMessageAndroid11 => - 'يتطلب أندرويد 11+ إذن \"الوصول إلى جميع الملفات\" لحفظ الملفات في مجلد التحميل الذي اخترته.'; - - @override - String get setupOpenSettings => 'فتح الإعدادات'; - - @override - String get setupPermissionDeniedMessage => - 'تم رفض الإذن. الرجاء منح كافة الصلاحيات للمتابعة.'; - - @override - String setupPermissionRequired(String permissionType) { - return '$permissionType مطلوب الإذن'; - } - - @override - String setupPermissionRequiredMessage(String permissionType) { - return 'الإذن $permissionType مطلوب لأفضل التجربة. يمكنك تغيير هذا لاحقاً في الإعدادات.'; - } - - @override - String get setupUseDefaultFolder => 'استخدام المجلد الافتراضي؟'; - - @override - String get setupNoFolderSelected => - 'لم يتم تحديد مجلد. هل ترغب في استخدام مجلد الموسيقى الافتراضي؟'; - - @override - String get setupUseDefault => 'استخدم الافتراضي'; - - @override - String get setupDownloadLocationTitle => 'موقع حفظ التنزيلات'; - - @override - String get setupDownloadLocationIosMessage => - 'على iOS، يتم حفظ التحميلات إلى مجلد مستندات التطبيق. يمكنك الوصول إليها عبر تطبيق الملفات.'; - - @override - String get setupAppDocumentsFolder => 'مجلد مستندات التطبيق'; - - @override - String get setupAppDocumentsFolderSubtitle => - 'موصى به - يمكن الوصول إليه عبر تطبيق الملفات'; - - @override - String get setupChooseFromFiles => 'اختر من الملفات'; - - @override - String get setupChooseFromFilesSubtitle => 'حدد iCloud أو موقع آخر'; - - @override - String get setupIosEmptyFolderWarning => - 'حدود iOS: لا يمكن تحديد مجلدات فارغة. اختر مجلدا مع ملف واحد على الأقل.'; - - @override - String get setupIcloudNotSupported => - 'iCloud Drive غير مدعوم. الرجاء استخدام مجلد مستندات التطبيق.'; - - @override - String get setupDownloadInFlac => 'تحميل اغاني Spotify بصيغة FLAC'; - - @override - String get setupStorageGranted => 'تم منح إذن التخزين!'; - - @override - String get setupStorageRequired => 'الإذن مطلوب للتخزين'; - - @override - String get setupStorageDescription => - 'SpotiFLAC يحتاج إلى إذن تخزين لحفظ ملفات الموسيقى الخاصة بك التي تم تنزيلها.'; - - @override - String get setupNotificationGranted => 'تم منح إذن الإشعارات!'; - - @override - String get setupNotificationEnable => 'تمكين الإشعارات'; - - @override - String get setupFolderChoose => 'اختر مجلد التحميل'; - - @override - String get setupFolderDescription => - 'حدد مجلد حيث سيتم حفظ الموسيقى التي تم تنزيلها.'; - - @override - String get setupSelectFolder => 'حدد الملف'; - - @override - String get setupEnableNotifications => 'تمكين الإشعارات'; - - @override - String get setupNotificationBackgroundDescription => - 'الحصول على إشعار حول تقدم التحميل وإكماله. هذا يساعدك على تتبع التنزيلات عندما يكون التطبيق في الخلفية.'; - - @override - String get setupSkipForNow => 'التخطي الآن'; - - @override - String get setupNext => 'التالي'; - - @override - String get setupGetStarted => 'إبدأ الآن'; - - @override - String get setupAllowAccessToManageFiles => - 'الرجاء تمكين \"السماح بالوصول لإدارة جميع الملفات\" في الشاشة التالية.'; - - @override - String get setupLanguageTitle => 'اِختر اللغة'; - - @override - String get setupLanguageDescription => - 'حدد لغتك المفضلة للتطبيق. يمكنك تغيير هذا لاحقًا من الإعدادات.'; - - @override - String get setupLanguageSystemDefault => 'الوضع الافتراضي للنظام'; - - @override - String get dialogCancel => 'إلغاء'; - - @override - String get dialogSave => 'حفظ'; - - @override - String get dialogDelete => 'حذف'; - - @override - String get dialogRetry => 'إعادة المحاولة'; - - @override - String get dialogClear => 'محو'; - - @override - String get dialogDone => 'تم'; - - @override - String get dialogImport => 'استيراد'; - - @override - String get dialogDownload => 'تنزيل'; - - @override - String get previewPlay => 'تشغيل المعاينة'; - - @override - String get previewStop => 'إيقاف المعاينة'; - - @override - String get previewUnavailable => 'المعاينة غير متوفرة'; - - @override - String get dialogDiscard => 'تجاهل'; - - @override - String get dialogRemove => 'إزالة'; - - @override - String get dialogUninstall => 'إلغاء التثبيت'; - - @override - String get dialogDiscardChanges => 'تجاهل التغييرات؟'; - - @override - String get dialogUnsavedChanges => - 'لديك تغييرات غير محفوظة. هل تريد المتابعة دون حفظها؟'; - - @override - String get dialogClearAll => 'مسح الكل'; - - @override - String get dialogRemoveExtension => 'إزالة إضافة'; - - @override - String get dialogRemoveExtensionMessage => - 'هل أنت متأكد من أنك تريد إزالة هذه الإضافة؟ لا يمكن التراجع عن ذلك.'; - - @override - String get dialogUninstallExtension => 'إلغاء تثبيت الإضافة؟'; - - @override - String dialogUninstallExtensionMessage(String extensionName) { - return 'هل أنت متأكد من أنك تريد إزالة $extensionName؟'; - } - - @override - String get dialogClearHistoryTitle => 'مسح السجل'; - - @override - String get dialogClearHistoryMessage => - 'هل أنت متأكد من أنك تريد مسح كل سجل التنزيلات؟ لا يمكن التراجع عن هذا.'; - - @override - String get dialogDeleteSelectedTitle => 'حذف المحدد'; - - @override - String dialogDeleteSelectedMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'الأغاني', - one: 'أغنية', - ); - return 'حذف $count $_temp0 من التاريخ؟\n\nسيؤدي هذا أيضا إلى حذف الملفات من وحدة التخزين.'; - } - - @override - String get dialogImportPlaylistTitle => 'استيراد قائمة تشغيل'; - - @override - String dialogImportPlaylistMessage(int count) { - return 'تم العثور على $count مسارات في CSV. إضافتها إلى قائمة انتظار التنزيل؟'; - } - - @override - String csvImportTracks(int count) { - return '$count مسارات من CSV'; - } - - @override - String snackbarAddedToQueue(String trackName) { - return 'تمت إضافة $trackName إلى قائمة الانتظار'; - } - - @override - String snackbarAddedTracksToQueue(int count) { - return 'تم إضافة $count أغانٍ إلى قائمة الانتظار'; - } - - @override - String snackbarAlreadyDownloaded(String trackName) { - return 'تم تنزيل $trackName بالفعل'; - } - - @override - String snackbarAlreadyInLibrary(String trackName) { - return '$trackName موجود بالفعل في مكتبتك'; - } - - @override - String get snackbarHistoryCleared => 'تم مسح السجل.'; - - @override - String snackbarDeletedTracks(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'أغانٍ', - one: 'أغنية', - ); - return 'تم حذف $count $_temp0'; - } - - @override - String snackbarCannotOpenFile(String error) { - return 'تعذر فتح الملف: $error'; - } - - @override - String get snackbarViewQueue => 'عرض قائمة الانتظار'; - - @override - String snackbarUrlCopied(String platform) { - return 'رابط $platform تم نسخه إلى الحافظة'; - } - - @override - String get snackbarFileNotFound => 'لم يتم العثور على الملف'; - - @override - String get snackbarSelectExtFile => 'الرجاء تحديد ملف .spotiflac-ext'; - - @override - String get snackbarProviderPrioritySaved => 'تم حفظ أولوية المزود'; - - @override - String get snackbarMetadataProviderSaved => - 'تم حفظ أولوية مزود البيانات الوصفية (metadata)'; - - @override - String snackbarExtensionInstalled(String extensionName) { - return 'تم تثبيت $extensionName.'; - } - - @override - String snackbarExtensionUpdated(String extensionName) { - return 'تم تحديث $extensionName.'; - } - - @override - String get snackbarFailedToInstall => 'فشل تثبيت الإضافة'; - - @override - String get snackbarFailedToUpdate => 'فشل تحديث الإضافة'; - - @override - String get errorRateLimited => 'تم الوصول للحد الأقصى'; - - @override - String get errorRateLimitedMessage => - 'طلبات كثيرة جداً. الرجاء الانتظار قليلاً قبل البحث مرة أخرى.'; - - @override - String get errorNoTracksFound => 'لم يتم العثور على الأغنية'; - - @override - String get searchEmptyResultSubtitle => 'جرّب كلمة مفتاحية أخرى'; - - @override - String get errorUrlNotRecognized => 'رابط غير معروف'; - - @override - String get errorUrlNotRecognizedMessage => - 'هذا الرابط غير مدعوم. تأكد من أن الرابط صحيح وتثبيت إضافة متوافق.'; - - @override - String get errorUrlFetchFailed => - 'فشل تحميل المحتوى من هذا الرابط. الرجاء المحاولة مرة أخرى.'; - - @override - String errorMissingExtensionSource(String item) { - return 'لا يمكن تحميل $item: مصدر الإضافة مفقود'; - } - - @override - String get actionPause => 'إيقاف مؤقت'; - - @override - String get actionResume => 'استئناف'; - - @override - String get actionCancel => 'إلغاء'; - - @override - String get actionSelectAll => 'تحديد الكل'; - - @override - String get actionDeselect => 'إلغاء التحديد'; - - @override - String selectionSelected(int count) { - return 'تم تحديد $count'; - } - - @override - String get selectionAllSelected => 'تم اختيار جميع الأغاني'; - - @override - String get selectionSelectToDelete => 'حدد الأغاني المراد حذفها'; - - @override - String progressFetchingMetadata(int current, int total) { - return 'جلب البيانات الوصفية (metadata)... $current/$total'; - } - - @override - String get progressReadingCsv => 'جاري قراءة CSV...'; - - @override - String get searchSongs => 'أغاني'; - - @override - String get searchArtists => 'فنانون'; - - @override - String get searchAlbums => 'ألبومات'; - - @override - String get searchPlaylists => 'قوائم التشغيل'; - - @override - String get searchSortTitle => 'فرز النتائج'; - - @override - String get searchSortDefault => 'افتراضي'; - - @override - String get searchSortTitleAZ => 'العنوان (أ-ي)'; - - @override - String get searchSortTitleZA => 'العنوان (ي-أ)'; - - @override - String get searchSortArtistAZ => 'الفنان (أ-ي)'; - - @override - String get searchSortArtistZA => 'الفنان (ي-أ)'; - - @override - String get searchSortDurationShort => 'المدة (الأقصر)'; - - @override - String get searchSortDurationLong => 'المدة (الأطول)'; - - @override - String get searchSortDateOldest => 'تاريخ الإصدار (الأقدم)'; - - @override - String get searchSortDateNewest => 'تاريخ الإصدار (الأحدث)'; - - @override - String get tooltipPlay => 'تشغيل'; - - @override - String get filenameFormat => 'صيغة الملف'; - - @override - String get filenameShowAdvancedTags => 'إظهار العلامات المتقدمة'; - - @override - String get filenameShowAdvancedTagsDescription => - 'تمكين العلامات المنسقة لحشو المقطع الصوتي وأنماط التاريخ'; - - @override - String get folderOrganizationNone => 'لا توجد منظمة'; - - @override - String get folderOrganizationByPlaylist => 'حسب قائمة التشغيل'; - - @override - String get folderOrganizationByPlaylistSubtitle => - 'مجلد منفصل لكل قائمة تشغيل'; - - @override - String get folderOrganizationByArtist => 'حسب الفنان'; - - @override - String get folderOrganizationByAlbum => 'حسب الألبوم'; - - @override - String get folderOrganizationByArtistAlbum => 'ألبوم/الفنان'; - - @override - String get folderOrganizationDescription => - 'تنظيم الملفات التي تم تنزيلها في المجلدات'; - - @override - String get folderOrganizationNoneSubtitle => 'جميع الملفات في مجلد التحميل'; - - @override - String get folderOrganizationByArtistSubtitle => 'مجلد منفصل لكل فنان'; - - @override - String get folderOrganizationByAlbumSubtitle => 'مجلد منفصل لكل قائمة تشغيل'; - - @override - String get folderOrganizationByArtistAlbumSubtitle => - 'مجلدات متداخلة للفنان و الألبوم'; - - @override - String get updateAvailable => 'هناك تحديث متاح'; - - @override - String get updateLater => 'ذكرني لاحقا'; - - @override - String get updateStartingDownload => 'جاري بدء التنزيل...'; - - @override - String get updateDownloadFailed => 'فشل التنزيل'; - - @override - String get updateFailedMessage => 'فشل تنزيل التحديث'; - - @override - String get updateNewVersionReady => 'إصدار جديد جاهز'; - - @override - String get updateRequiredTitle => 'Update required'; - - @override - String updateRequiredNotice(int count) { - return 'This version is $count releases behind and is no longer supported. Update to keep using the app.'; - } - - @override - String get updateCurrent => 'الحالي'; - - @override - String get updateNew => 'جديد'; - - @override - String get updateDownloading => 'جاري التنزيل...'; - - @override - String get updateWhatsNew => 'ما الجديد'; - - @override - String get updateDownloadInstall => 'تحميل وتثبيت'; - - @override - String get updateDontRemind => 'لا تذكّرني'; - - @override - String get providerPriorityTitle => 'أولوية مقدم الخدمة'; - - @override - String get providerPriorityDescription => - 'اسحب لإعادة ترتيب مزودي التحميل. سيجرب التطبيق مزودي الخدمات من الأعلى إلى الأسفل عند تحميل المسار.'; - - @override - String get providerPriorityInfo => - 'إذا كانت الأغنية غير متوفرة عند أول مزود، فإن التطبيق سيجرب تلقائياً المزود التالي.'; - - @override - String get providerPriorityFallbackExtensionsDescription => - 'اختر إضافات التحميل المثبتة التي يمكن استخدامها أثناء الرجوع التلقائي للمزود الاحتياطي.'; - - @override - String get providerPriorityFallbackExtensionsHint => - 'الإضافات المفعلة فقط مع قدرة توفير التنزيل مدرجة هنا.'; - - @override - String get providerExtension => 'الإضافة'; - - @override - String get metadataProviderPriorityTitle => - 'أولوية البيانات الوصفية (metadata)'; - - @override - String get metadataProviderPriorityDescription => - 'اسحب لإعادة ترتيب موفري البيانات الوصفية (metadata). سيحاول التطبيق موفري البيانات الوصفية (metadata) من الأعلى إلى الأسفل عند البحث عن المسارات وجلب البيانات الوصفية (metadata).'; - - @override - String get metadataProviderPriorityInfo => - 'Deezer ليس لديه حدود للطلبات ومُوصى به كأساسي. Spotify لديه حد للطلبات وقد لا يعمل بعد عدة عمليات.'; - - @override - String get logTitle => 'السجلات'; - - @override - String get logCopied => 'تم نسخ السجلات إلى الحافظة'; - - @override - String get logSearchHint => 'البحث في السجلات...'; - - @override - String get logFilterLevel => 'المستوى'; - - @override - String get logFilterSection => 'فرز'; - - @override - String get logShareLogs => 'مشاركة السجلات'; - - @override - String get logClearLogs => 'حذف السجل'; - - @override - String get logClearLogsTitle => 'حذف السجل'; - - @override - String get logClearLogsMessage => - 'هل أنت متأكد من رغبتك في مسح جميع السجلات؟'; - - @override - String get logFilterBySeverity => 'تصفية السجلات حسب الخطورة'; - - @override - String get logNoLogsYet => 'لا توجد سجلات بعد'; - - @override - String get logNoLogsYetSubtitle => 'ستظهر السجلات هنا عند استخدام التطبيق'; - - @override - String logEntriesFiltered(int count) { - return 'الإدخالات ($count تم تصفيتها)'; - } - - @override - String logEntries(int count) { - return 'الإدخالات ($count)'; - } - - @override - String get channelStable => 'مستقر'; - - @override - String get channelPreview => 'تجريبي'; - - @override - String get sectionSearchSource => 'مصدر البحث'; - - @override - String get sectionDownload => 'التحميل'; - - @override - String get sectionPerformance => 'الأداء'; - - @override - String get sectionApp => 'التطبيق'; - - @override - String get sectionData => 'البيانات'; - - @override - String get sectionDebug => 'تصحيح الأخطاء'; - - @override - String get sectionService => 'الخدمة'; - - @override - String get sectionAudioQuality => 'جودة الصوت'; - - @override - String get sectionFileSettings => 'إعدادات الملف'; - - @override - String get sectionLyrics => 'كلمات الاغنية'; - - @override - String get lyricsMode => 'وضع كلمات الأغنية'; - - @override - String get lyricsModeDescription => - 'اختر كيفية حفظ كلمات الأغاني مع التنزيلات الخاصة بك'; - - @override - String get lyricsModeEmbed => 'تضمين في الملف'; - - @override - String get lyricsModeEmbedSubtitle => - 'كلمات الأغاني مخزنة داخل بيانات تعريف FLAC'; - - @override - String get lyricsModeExternal => 'ملف .lrc منفصل'; - - @override - String get lyricsModeExternalSubtitle => - 'فصل ملف .lrc لمشغلي الأغاني مثل Samsung Music'; - - @override - String get lyricsModeBoth => 'كلاهما'; - - @override - String get lyricsModeBothSubtitle => 'تضمين وحفظ ملف .lrc'; - - @override - String get sectionColor => 'اللون'; - - @override - String get sectionTheme => 'الثيم'; - - @override - String get sectionLayout => 'التخطيط'; - - @override - String get sectionLanguage => 'اللّغة'; - - @override - String get appearanceLanguage => 'لغة التطبيق'; - - @override - String get settingsAppearanceSubtitle => 'السمة والألوان والعرض'; - - @override - String get settingsDownloadSubtitle => 'الخدمة والجودة الأحتياطات'; - - @override - String get settingsExtensionsSubtitle => 'إدارة موفري التحميل'; - - @override - String get settingsLogsSubtitle => 'عرض سجلات التطبيقات لتصحيح الأخطاء'; - - @override - String get loadingSharedLink => 'تحميل الرابط المشترك...'; - - @override - String get pressBackAgainToExit => 'اضغط رجوع مجددًا للخروج'; - - @override - String downloadAllCount(int count) { - return 'تنزيل الكل ($count)'; - } - - @override - String tracksCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count أغانٍ', - one: 'أغنية واحدة', - zero: 'لا توجد أغاني محددة', - ); - return '$_temp0'; - } - - @override - String get trackCopyFilePath => 'نسخ مسار الملف'; - - @override - String get trackRemoveFromDevice => 'حذف من الجهاز'; - - @override - String get trackLoadLyrics => 'تحميل كلمات الأغاني'; - - @override - String get trackMetadata => 'البيانات الوصفية (Metadata)'; - - @override - String get trackFileInfo => 'معلومات الملف'; - - @override - String get trackLyrics => 'كلمات الاغنية'; - - @override - String get trackFileNotFound => 'لم يتم العثور على الملف'; - - @override - String get trackOpenInDeezer => 'فتح في Deezer'; - - @override - String get trackOpenInSpotify => 'فتح في Spotify'; - - @override - String get trackTrackName => 'اسم الأغنية'; - - @override - String get trackArtist => 'الفنان'; - - @override - String get trackAlbumArtist => 'فنان الألبوم'; - - @override - String get trackAlbum => 'الألبوم'; - - @override - String get trackTrackNumber => 'رقم الأغنية'; - - @override - String get trackDiscNumber => 'رقم القرص'; - - @override - String get trackDuration => 'المدة'; - - @override - String get trackAudioQuality => 'جودة الصوت'; - - @override - String get trackReleaseDate => 'تاريخ الإصدار'; - - @override - String get trackGenre => 'النوع'; - - @override - String get trackLabel => 'تصنيف'; - - @override - String get trackCopyright => 'حقوق الطبع و النشر'; - - @override - String get trackDownloaded => 'تم التنزيل'; - - @override - String get trackCopyLyrics => 'نسخ كلمات الأغنية'; - - @override - String trackLyricsSource(String source) { - return 'المصدر: $source'; - } - - @override - String get trackLyricsNotAvailable => 'كلمات الأغنية غير متوفرة لهذه الأغنية'; - - @override - String get trackLyricsNotInFile => - 'لم يتم العثور على كلمات الأغاني في هذا الملف'; - - @override - String get trackFetchOnlineLyrics => 'جلب من الإنترنت'; - - @override - String get trackLyricsTimeout => 'انتهت مهلة الطلب. حاول مرة أخرى لاحقاً.'; - - @override - String get trackLyricsLoadFailed => 'فشل تحميل كلمات الأغاني'; - - @override - String get trackEmbedLyrics => 'تضمين كلمات الأغنية'; - - @override - String get trackLyricsEmbedded => 'تمت إضافة كلمات الأغنية بنجاح'; - - @override - String get trackInstrumental => 'المسار الآلي'; - - @override - String get trackCopiedToClipboard => 'تم النسخ إلى الحافظة'; - - @override - String get trackDeleteConfirmTitle => 'حذف من الجهاز؟'; - - @override - String get trackDeleteConfirmMessage => - 'سيؤدي هذا إلى حذف الملف الذي تم تنزيله وإزالته من السجل الخاص بك بشكل دائم.'; - - @override - String get dateToday => 'اليوم'; - - @override - String get dateYesterday => 'الأمس'; - - @override - String dateDaysAgo(int count) { - return 'قبل $count أيام'; - } - - @override - String dateWeeksAgo(int count) { - return 'قبل $count أسابيع'; - } - - @override - String dateMonthsAgo(int count) { - return 'منذ $count أشهر'; - } - - @override - String get storeFilterAll => 'الكل'; - - @override - String get storeFilterMetadata => 'البيانات الوصفية (Metadata)'; - - @override - String get storeFilterDownload => 'التحميل'; - - @override - String get storeFilterUtility => 'الأدوات'; - - @override - String get storeFilterLyrics => 'كلمات الأغنية'; - - @override - String get storeFilterIntegration => 'التكامل'; - - @override - String get storeClearFilters => 'حذف الفلاتر'; - - @override - String get storeAddRepoTitle => 'إضافة مستودع إضافات'; - - @override - String get storeAddRepoDescription => - 'أدخل عنوان مستودع GitHub الذي يحتوي على ملف registry.json لتصفح وتثبيت الإضافات.'; - - @override - String get storeRepoUrlLabel => 'رابط المستودع'; - - @override - String get storeRepoUrlHint => 'https://github.com/user/repo'; - - @override - String get storeAddRepoButton => 'أضف مستودعًا'; - - @override - String get storeChangeRepoTooltip => 'تغيير المستودع'; - - @override - String get storeRepoDialogTitle => 'مستودع الإضافات'; - - @override - String get storeRepoDialogCurrent => 'المستودع الحالي:'; - - @override - String get storeNewRepoUrlLabel => 'رابط المستودع'; - - @override - String get storeLoadError => 'فشل تحميل المستودع'; - - @override - String get storeEmptyNoExtensions => 'لا توجد إضافات متاحة'; - - @override - String get storeEmptyNoResults => 'لم يتم العثور على إضافات'; - - @override - String get extensionId => 'ID'; - - @override - String get extensionError => 'خطأ'; - - @override - String get extensionCapabilities => 'الإمكانيات'; - - @override - String get extensionMetadataProvider => 'مزود بيانات التعريف'; - - @override - String get extensionDownloadProvider => 'مزود التحميل'; - - @override - String get extensionLyricsProvider => 'موفر كلمات الأغاني'; - - @override - String get extensionUrlHandler => 'معالج الروابط'; - - @override - String get extensionQualityOptions => 'خيارات الجودة'; - - @override - String get extensionPostProcessingHooks => 'روابط المعالجة اللاحقة'; - - @override - String get extensionPermissions => 'الصلاحيات'; - - @override - String get extensionSettings => 'الإعدادات'; - - @override - String get extensionRemoveButton => 'حذف الإضافة'; - - @override - String get extensionUpdated => 'تاريخ التحديث'; - - @override - String get extensionMinAppVersion => 'اصدار التطبيق الأدنى'; - - @override - String get extensionCustomTrackMatching => 'مطابقة المسار المخصص'; - - @override - String get extensionPostProcessing => 'مرحلة ما بعد المعالجة'; - - @override - String extensionHooksAvailable(int count) { - return 'متاح $count روابط'; - } - - @override - String extensionPatternsCount(int count) { - return '$count أنماط'; - } - - @override - String extensionStrategy(String strategy) { - return 'الاستراتيجية: $strategy'; - } - - @override - String get extensionsProviderPrioritySection => 'أولوية مزود الخدمة'; - - @override - String get extensionsInstalledSection => 'الإضافات المُثبّتة'; - - @override - String get extensionsNoExtensions => 'لا توجد إضافات مثبتة'; - - @override - String get extensionsNoExtensionsSubtitle => - 'تثبيت ملفات .spotiflac-ext لإضافة موفرين جدد'; - - @override - String get extensionsInstallButton => 'تثبيت الإضافة'; - - @override - String get extensionsInfoTip => - 'يمكن للإضافات تزويدك بموفري بيانات التعريف الجديدة وتحميلها. ثبت الإضافات من مصادر موثوق بها فقط.'; - - @override - String get extensionsInstalledSuccess => 'تم تثبيت الإضافة بنجاح'; - - @override - String extensionsInstalledCount(int count) { - return 'تم تثبيت $count إضافات بنجاح'; - } - - @override - String extensionsInstallPartialSuccess(int installed, int attempted) { - return 'تم تثبيت $installed من أصل $attempted إضافات'; - } - - @override - String get extensionsDownloadPriority => 'أولوية التحميل'; - - @override - String get extensionsDownloadPrioritySubtitle => 'تعيين ترتيب خدمة التحميل'; - - @override - String get extensionsFallbackTitle => 'الإضافات الاحتياطية'; - - @override - String get extensionsFallbackSubtitle => - 'اختر إضافات التحميل المثبتة التي يمكن استخدامها أثناء الرجوع التلقائي للمزود الاحتياطي'; - - @override - String get extensionsNoDownloadProvider => - 'لا توجد إضافات مع إمكانية مزود التحميل'; - - @override - String get extensionsMetadataPriority => 'أولوية البيانات الوصفية (metadata)'; - - @override - String get extensionsMetadataPrioritySubtitle => - 'تعيين ترتيب مصدر البحث والبيانات الوصفية'; - - @override - String get extensionsNoMetadataProvider => - 'لا توجد إضافات مع إمكانية مزود البيانات الوصفية'; - - @override - String get extensionsSearchProvider => 'Search Provider'; - - @override - String get extensionsNoCustomSearch => 'No extensions with custom search'; - - @override - String get extensionsSearchProviderDescription => - 'Choose which service to use for searching tracks'; - - @override - String get extensionsCustomSearch => 'Custom search'; - - @override - String get extensionsErrorLoading => 'Error loading extension'; - - @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 بت / ما يصل إلى 96 كيلو هرتز'; - - @override - String get qualityHiResFlacMax => 'Hi-Res FLAC Max'; - - @override - String get qualityHiResFlacMaxSubtitle => '24 بت / ما يصل إلى 192 كيلو هرتز'; - - @override - String get downloadLossy320 => '320kbps مضغوط'; - - @override - String get downloadLossyFormat => 'تنسيق مضغوط'; - - @override - String get downloadLossy320Format => 'تنسيق 320kbps مضغوط'; - - @override - String get downloadLossy320FormatDesc => - 'اختر التنسيق النهائي للتنزيلات المضغوطة 320kbps. سيتم تحويل البث الأصلي إلى التنسيق المحدد عند الحاجة.'; - - @override - String get downloadLossyMp3 => 'MP3 320kbps'; - - @override - String get downloadLossyMp3Subtitle => 'أفضل توافق، ~10 ميغابايت لكل أغنية'; - - @override - String get downloadLossyAac => 'AAC/M4A 320kbps'; - - @override - String get downloadLossyAacSubtitle => 'أفضل توافق للجوال، صيغة M4A'; - - @override - String get downloadLossyOpus256 => 'Opus 256kbps'; - - @override - String get downloadLossyOpus256Subtitle => - 'أفضل جودة Opus, حوالي 8 ميغابايت لكل أغنية'; - - @override - String get downloadLossyOpus128 => 'Opus 128kbps'; - - @override - String get downloadLossyOpus128Subtitle => 'أصغر حجم, ~4 ميغابايت لكل مسار'; - - @override - String get downloadAskBeforeDownload => 'اسأل قبل التحميل'; - - @override - String get downloadDirectory => 'مسار التنزيل'; - - @override - String get downloadSeparateSinglesFolder => 'فصل مجلد الفرديات'; - - @override - String get downloadAlbumFolderStructure => 'هيكل مجلد الألبوم'; - - @override - String get albumFolderStructureDescription => - 'Choose how album folders are structured'; - - @override - String get downloadUseAlbumArtistForFolders => - 'استخدام فنان الألبوم للمجلدات'; - - @override - String get downloadUsePrimaryArtistOnly => 'الفنان الأساسي فقط للمجلدات'; - - @override - String get downloadUsePrimaryArtistOnlyEnabled => - 'الفنانين المتميزين الذين تمت إزالتهم من اسم المجلد (على سبيل المثال جاستين بيبر، كويفو -> جاستين بيبر)'; - - @override - String get downloadUsePrimaryArtistOnlyDisabled => - 'اسم الفنان الكامل المستخدمة لاسم المجلد'; - - @override - String get downloadSelectQuality => 'تحديد الجودة'; - - @override - String get downloadFrom => 'تحميل من'; - - @override - String get appearanceAmoledDark => 'الوضع الداكن AMOLED'; - - @override - String get appearanceAmoledDarkSubtitle => 'خلفية سوداء تامة'; - - @override - String get appearanceHeroAnimations => 'Hero animations'; - - @override - String get appearanceHeroAnimationsSubtitle => - 'Fly covers between screens, e.g. when opening the player'; - - @override - String get queueClearAll => 'مسح الكل'; - - @override - String get queueClearAllMessage => - 'هل أنت متأكد من أنك تريد مسح جميع التنزيلات؟'; - - @override - String get settingsAutoExportFailed => 'فشل التصدير التلقائي للتنزيلات'; - - @override - String get settingsAutoExportFailedSubtitle => - 'حفظ التنزيلات التي فشلت إلى ملف TXT تلقائيًا'; - - @override - String get settingsDownloadNetwork => 'تحميل الشبكة'; - - @override - String get settingsDownloadNetworkAny => 'WiFi + بيانات الجوال'; - - @override - String get settingsDownloadNetworkWifiOnly => 'WiFi فقط'; - - @override - String get settingsDownloadNetworkSubtitle => - 'اختر الشبكة التي تريد استخدامها للتنزيلات. عند تعيين WiFi فقط، التنزيلات لن تعمل على بيانات الجوال.'; - - @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 => 'ألبوم / الفنان'; - - @override - String get albumFolderArtistAlbumSubtitle => - 'الألبومات / اسم الفنان / اسم الألبوم'; - - @override - String get albumFolderArtistYearAlbum => 'الفنان / [Year] ألبوم'; - - @override - String get albumFolderArtistYearAlbumSubtitle => - 'الألبومات/اسم الفنان /[2005] اسم الألبوم/'; - - @override - String get albumFolderAlbumOnly => 'الألبوم فقط'; - - @override - String get albumFolderAlbumOnlySubtitle => 'الألبومات/اسم الألبوم/'; - - @override - String get albumFolderYearAlbum => '[Year] الألبوم'; - - @override - String get albumFolderYearAlbumSubtitle => 'الألبومات/[2005] اسم الألبوم/'; - - @override - String get albumFolderArtistAlbumSingles => 'الفنان / الألبوم + المفردات'; - - @override - String get albumFolderArtistAlbumSinglesSubtitle => - 'الفنان/الألبوم و الفنان / المفردات'; - - @override - String get albumFolderArtistAlbumFlat => 'فنان / ألبوم (منفردات سطحية)'; - - @override - String get albumFolderArtistAlbumFlatSubtitle => - 'الفنان / الألبوم والفنان / الأغنية.flac'; - - @override - String get downloadedAlbumDeleteSelected => 'Delete Selected'; - - @override - String downloadedAlbumDeleteMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0 from this album?\n\nThis will also delete the files from storage.'; - } - - @override - String downloadedAlbumSelectedCount(int count) { - return '$count selected'; - } - - @override - String get downloadedAlbumTapToSelect => 'Tap tracks to select'; - - @override - String downloadedAlbumDeleteCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0'; - } - - @override - String get downloadedAlbumSelectToDelete => 'Select tracks to delete'; - - @override - String downloadedAlbumDiscHeader(int discNumber) { - return 'Disc $discNumber'; - } - - @override - String get recentTypeArtist => 'Artist'; - - @override - String get recentTypeAlbum => 'Album'; - - @override - String get recentTypeSong => 'Song'; - - @override - String get recentTypePlaylist => 'Playlist'; - - @override - String get recentEmpty => 'No recent items yet'; - - @override - String get recentShowAllDownloads => 'Show All Downloads'; - - @override - String recentPlaylistInfo(String name) { - return 'Playlist: $name'; - } - - @override - String get discographyDownload => 'Download Discography'; - - @override - String get discographyDownloadAll => 'Download All'; - - @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 => - 'Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.'; - - @override - String libraryTracksUnit(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$_temp0'; - } - - @override - String 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 => 'Welcome to SpotiFLAC!'; - - @override - String get tutorialWelcomeDesc => - 'Let\'s learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.'; - - @override - String get tutorialWelcomeTip1 => - 'Download music from Spotify, Deezer, or paste any supported URL'; - - @override - String get tutorialWelcomeTip2 => - 'Get FLAC quality audio from installed download extensions'; - - @override - String get tutorialWelcomeTip3 => - 'Automatic metadata, cover art, and lyrics embedding'; - - @override - String get tutorialSearchTitle => 'Finding Music'; - - @override - String get tutorialSearchDesc => - 'There are two easy ways to find music you want to download.'; - - @override - String get tutorialDownloadTitle => 'Downloading Music'; - - @override - String get tutorialDownloadDesc => - 'Downloading music is simple and fast. Here\'s how it works.'; - - @override - String get tutorialLibraryTitle => 'Your Library'; - - @override - String get tutorialLibraryDesc => - 'All your downloaded music is organized in the Library tab.'; - - @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 libraryPlaybackNormalization => 'Volume normalization'; - - @override - String get libraryPlaybackNormalizationSubtitle => - 'Even out loudness between tracks using their ReplayGain or R128 tags, when present'; - - @override - String get cacheAudioAnalysis => 'Audio analysis cache'; - - @override - String get cacheAudioAnalysisDesc => - 'Saved spectrograms and analysis results. Will re-analyze on next open.'; - - @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 trackSaveLyrics => 'Save Lyrics (.lrc)'; - - @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 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 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 trackConvertTitle => 'Convert Audio'; - - @override - String get trackConvertTargetFormat => 'Target Format'; - - @override - String get trackConvertBitrate => 'Bitrate'; - - @override - String get trackConvertKeepOriginal => 'Keep original file'; - - @override - String get trackConvertKeepOriginalDescription => - 'Add the converted file as a separate library entry'; - - @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 trackConvertConfirmKeepOriginal( - String sourceFormat, - String targetFormat, - ) { - return 'Convert from $sourceFormat to $targetFormat?\n\nThe original file will be kept and the converted file will be added as a separate library entry.'; - } - - @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 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 collectionPlaylist => 'Playlist'; - - @override - String get collectionAddToPlaylist => 'Add to playlist'; - - @override - String get collectionCreatePlaylist => 'Create playlist'; - - @override - String get collectionNoPlaylistsYet => 'No playlists yet'; - - @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 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 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 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 selectionBatchConvertConfirmKeepOriginal(int count, String format) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Convert $count $_temp0 to $format?\n\nOriginal files will be kept and converted files will be added as separate library entries.'; - } - - @override - String selectionBatchConvertSuccess(int success, int total, String format) { - return 'Converted $success of $total tracks to $format'; - } - - @override - String downloadedAlbumDownloadedCount(int count) { - return '$count downloaded'; - } - - @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 => 'Backup & Restore'; - - @override - String get settingsBackupSubtitle => - 'Move your library, history and settings to a new device'; - - @override - String get backupTitle => 'Backup & Restore'; - - @override - String get backupExportSectionTitle => 'Create backup'; - - @override - String get backupExportSectionDescription => - 'Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.'; - - @override - String get backupExportButton => 'Create backup file'; - - @override - String get backupImportSectionTitle => 'Restore backup'; - - @override - String get backupImportSectionDescription => - 'Pick a backup file to restore your data. This replaces the current settings, history and library on this device.'; - - @override - String get backupImportButton => 'Choose backup file'; - - @override - String get backupCreated => 'Backup created'; - - @override - String get backupCreateFailed => 'Failed to create backup'; - - @override - String get backupRestoreConfirmTitle => 'Restore this backup?'; - - @override - String get backupRestoreConfirmMessage => - 'This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.'; - - @override - String get backupRestoreConfirmButton => 'Restore'; - - @override - String get backupRestored => 'Backup restored successfully'; - - @override - String get backupRestoreFailed => 'Failed to restore backup'; - - @override - String get backupInvalidFile => 'This file is not a valid SpotiFLAC backup'; - - @override - String get backupRestoreRestartHint => - 'Restart the app to make sure every change is applied.'; - - @override - String get backupContentsTitle => 'Backup contents'; - - @override - String get backupContentsSettings => 'App settings'; - - @override - String backupContentsHistory(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'items', - one: 'item', - ); - return '$count history $_temp0'; - } - - @override - String backupContentsLiked(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$count liked $_temp0'; - } - - @override - String backupContentsWishlist(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$count wishlist $_temp0'; - } - - @override - String backupContentsPlaylists(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count playlists', - one: '1 playlist', - ); - return '$_temp0'; - } - - @override - String backupContentsArtists(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count favorite artists', - one: '1 favorite artist', - ); - return '$_temp0'; - } - - @override - String backupContentsExtensions(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count extensions', - one: '1 extension', - ); - return '$_temp0'; - } - - @override - String get backupIncludeSecrets => 'Include extension credentials'; - - @override - String get backupIncludeSecretsDescription => - 'Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.'; - - @override - String backupExtensionsRestoreFailed(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'extensions', - one: 'extension', - ); - return '$count $_temp0 could not be reinstalled. Install them manually from the repo.'; - } - - @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 => 'Allow Local Network Access'; - - @override - String get downloadAllowLocalNetworkEnabled => - 'Requests to local/private addresses are allowed (for local proxy or custom DNS)'; - - @override - String get downloadAllowLocalNetworkDisabled => - 'Local/private addresses are blocked for security'; - - @override - String get downloadSelectServiceToEnable => - 'Select a provider with quality options to enable this option'; - - @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 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 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 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 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 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 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 queueDownloadNext => 'Download next'; - - @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 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 downloadDeduplicationWithQualityVariants => - 'Existing files at the selected quality will be skipped'; - - @override - String get downloadDeduplicationDisabled => - 'All tracks will be downloaded regardless of history'; - - @override - String get downloadQualityVariants => 'Allow different quality versions'; - - @override - String get downloadQualityVariantsDescription => - 'Add the selected quality to the filename and keep each version in download history'; - - @override - String get trackOptionDownloadQualityVariant => 'Download another quality'; - - @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 queueCheckingDownloadSession => 'Checking download session...'; - - @override - String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; - - @override - String get queueResolvingDownloadStream => 'Preparing audio stream...'; - - @override - String get queueWaitingForVerification => 'Waiting for verification...'; - - @override - String get queueResumingAfterVerification => 'Resuming after verification...'; - - @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 => - 'خدمة Android في الخلفية لتنزيلات الإضافات'; - - @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 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 => 'Playback'; - - @override - String get libraryExternalPlayer => 'External player'; - - @override - String get libraryExternalPlayerSubtitle => - 'Recommended for listening, best quality, gapless playback, EQ, and wider format support'; - - @override - String get libraryBuiltInPreviewPlayer => 'Built-in preview player'; - - @override - String get libraryBuiltInPreviewPlayerSubtitle => - 'Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening'; - - @override - String get libraryBuiltInPlayerInfo => - 'The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.'; - - @override - String get nowPlayingTitle => 'Now Playing'; - - @override - String get nowPlayingNothingPlaying => 'Nothing is playing'; - - @override - String get nowPlayingMinimize => 'Minimize'; - - @override - String get nowPlayingUpNext => 'Up next'; - - @override - String get nowPlayingDetails => 'Details'; - - @override - String get nowPlayingOpenInExternalPlayer => 'Open in external player'; - - @override - String get nowPlayingTabPlayer => 'Player'; - - @override - String get nowPlayingTabLyrics => 'Lyrics'; - - @override - String get nowPlayingNoLyrics => 'No lyrics in this file'; - - @override - String get nowPlayingLibraryEmpty => 'Your library is empty'; - - @override - String nowPlayingShuffleLibraryFailed(String error) { - return 'Could not shuffle library: $error'; - } - - @override - String get nowPlayingShuffleOn => 'Shuffle on'; - - @override - String get nowPlayingPlayInOrder => 'Play in order'; - - @override - String get nowPlayingShuffleLibrary => 'Shuffle library'; - - @override - String get nowPlayingQueueEmpty => 'Queue is empty'; - - @override - String get nowPlayingNoMetadata => 'No metadata available'; - - @override - String get announcementUnableToOpenLink => - 'Unable to open link. Please try again.'; - - @override - String trackConvertLosslessOutputWithCap(String quality) { - return 'Lossless output with $quality cap'; - } - - @override - String trackConvertConfirmMessageLosslessCapped( - String sourceFormat, - String targetFormat, - String quality, - ) { - return 'Convert from $sourceFormat to $targetFormat ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.'; - } - - @override - String selectionBatchConvertConfirmMessageLosslessCapped( - int count, - String format, - String quality, - ) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Convert $count $_temp0 to $format ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.'; - } - - @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 => - 'Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius'; - - @override - String get snackbarPlayingNext => 'Playing next'; - - @override - String get snackbarAddedToQueueGeneric => 'Added to queue'; - - @override - String selectionDeletePlaylistsCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'playlists', - one: 'playlist', - ); - return 'Delete $count $_temp0'; - } - - @override - String get actionShuffle => 'Shuffle'; - - @override - String get downloadPrimaryArtistOnlyOn => 'Primary only: On'; - - @override - String get downloadPrimaryArtistOnlyOff => 'Primary only: Off'; - - @override - String get downloadAlbumArtistMetadataPrimaryOnly => - 'Album Artist metadata: Primary only'; - - @override - String get downloadAlbumArtistMetadataFull => 'Album Artist metadata: Full'; - - @override - String get trackConvertOriginal => 'Original'; - - @override - String get trackConvertOriginalQuality => 'Original quality'; - - @override - String get trackConvertLosslessSuffix => 'Lossless'; - - @override - String get trackConvertDithering => 'Dithering'; - - @override - String get trackConvertResampler => 'Resampler'; - - @override - String get trackConvertDitherNone => 'None'; - - @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 => 'See release notes for details.'; - - @override - String get unknownTitle => 'Unknown title'; - - @override - String get trackPlayNext => 'Play next'; - - @override - String get trackAddToQueue => 'Add to queue'; - - @override - String snackbarExtensionInstalledEnable(String extensionName) { - return '$extensionName installed. Enable it in Settings > Extensions'; - } - - @override - String snackbarExtensionUpdatedVersion(String extensionName, String version) { - return '$extensionName updated to v$version'; - } - - @override - String snackbarFailedToInstallNamed(String extensionName) { - return 'Failed to install $extensionName'; - } - - @override - String snackbarFailedToUpdateNamed(String extensionName) { - return 'Failed to update $extensionName'; - } - - @override - String get releaseTypeEp => 'EP'; - - @override - String get releaseTypeSingle => 'Single'; - - @override - String get trackCoverOnline => 'Online cover'; - - @override - String get regionCountryUS => 'United States'; - - @override - String get regionCountryGB => 'United Kingdom'; - - @override - String get regionCountryFR => 'France'; - - @override - String get regionCountryDE => 'Germany'; - - @override - String get regionCountryJP => 'Japan'; - - @override - String get regionCountryKR => 'South Korea'; - - @override - String get regionCountryIN => 'India'; - - @override - String get regionCountryID => 'Indonesia'; - - @override - String get regionCountryBR => 'Brazil'; - - @override - String get regionCountryMX => 'Mexico'; - - @override - String get regionCountryAU => 'Australia'; - - @override - String get regionCountryCA => 'Canada'; - - @override - String get regionCountryXK => 'Kosovo'; - - @override - String get extensionVerificationBrowserTitle => 'Verification browser'; - - @override - String get extensionVerificationBrowserSubtitleExternal => - 'Open challenges in the default browser first'; - - @override - String get extensionVerificationBrowserSubtitleInApp => - 'Open challenges in the in-app browser first'; - - @override - String get extensionVerificationBrowserExternal => 'External'; - - @override - String get extensionVerificationBrowserInApp => 'In-app'; - - @override - String get extensionVerificationHelpTitleManual => - 'Open verification manually'; - - @override - String get extensionVerificationHelpTitleWaiting => - 'Verification still waiting'; - - @override - String get extensionVerificationHelpMessageManual => - 'SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.'; - - @override - String get extensionVerificationHelpMessageWaiting => - 'If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.'; - - @override - String get extensionVerificationClose => 'Close'; - - @override - String get extensionVerificationCopyLink => 'Copy link'; - - @override - String get extensionVerificationLinkCopied => 'Verification link copied'; - - @override - String get extensionVerificationOpenBrowser => 'Open browser'; -} diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 29818e79..99dfd810 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -639,6 +639,20 @@ class AppLocalizationsDe extends AppLocalizations { return '$count Titel aus CSV'; } + @override + String get collectionExportM3u => 'Export as M3U8'; + + @override + String collectionExportM3uDone(int exported, int total) { + return 'Exported $exported of $total tracks'; + } + + @override + String get collectionExportM3uNone => 'No downloaded files to export'; + + @override + String get collectionExportM3uFailed => 'Export failed'; + @override String snackbarAddedToQueue(String trackName) { return '\"$trackName\" hinzugefügt'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 60276f4d..731129fa 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -623,7 +623,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String dialogImportPlaylistMessage(int count) { - return 'Found $count tracks in CSV. Add them to download queue?'; + return 'Found $count tracks in the playlist file. Add them to download queue?'; } @override @@ -631,6 +631,20 @@ class AppLocalizationsEn extends AppLocalizations { return '$count tracks from CSV'; } + @override + String get collectionExportM3u => 'Export as M3U8'; + + @override + String collectionExportM3uDone(int exported, int total) { + return 'Exported $exported of $total tracks'; + } + + @override + String get collectionExportM3uNone => 'No downloaded files to export'; + + @override + String get collectionExportM3uFailed => 'Export failed'; + @override String snackbarAddedToQueue(String trackName) { return 'Added \"$trackName\" to queue'; @@ -3680,7 +3694,7 @@ class AppLocalizationsEn extends AppLocalizations { } @override - String get homeImportCsvTooltip => 'Import CSV'; + String get homeImportCsvTooltip => 'Import playlist (CSV, M3U)'; @override String get homeChangeSearchProviderTooltip => 'Change search provider'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index 1b91ff23..d9d69308 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -631,6 +631,20 @@ class AppLocalizationsEs extends AppLocalizations { return '$count tracks from CSV'; } + @override + String get collectionExportM3u => 'Export as M3U8'; + + @override + String collectionExportM3uDone(int exported, int total) { + return 'Exported $exported of $total tracks'; + } + + @override + String get collectionExportM3uNone => 'No downloaded files to export'; + + @override + String get collectionExportM3uFailed => 'Export failed'; + @override String snackbarAddedToQueue(String trackName) { return 'Added \"$trackName\" to queue'; @@ -3674,7 +3688,7 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get homeImportCsvTooltip => 'Import CSV'; + String get homeImportCsvTooltip => 'Import playlist (CSV, M3U)'; @override String get homeChangeSearchProviderTooltip => 'Change search provider'; diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index afd89e3a..52e4cfee 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -647,6 +647,20 @@ class AppLocalizationsFr extends AppLocalizations { return '$count pistes issues d\'un fichier CSV'; } + @override + String get collectionExportM3u => 'Export as M3U8'; + + @override + String collectionExportM3uDone(int exported, int total) { + return 'Exported $exported of $total tracks'; + } + + @override + String get collectionExportM3uNone => 'No downloaded files to export'; + + @override + String get collectionExportM3uFailed => 'Export failed'; + @override String snackbarAddedToQueue(String trackName) { return 'Ajout de « $trackName » à la file d\'attente'; diff --git a/lib/l10n/app_localizations_hi.dart b/lib/l10n/app_localizations_hi.dart deleted file mode 100644 index c538b0d4..00000000 --- a/lib/l10n/app_localizations_hi.dart +++ /dev/null @@ -1,4659 +0,0 @@ -// ignore: unused_import -import 'package:intl/intl.dart' as intl; -import 'app_localizations.dart'; - -// ignore_for_file: type=lint - -/// The translations for Hindi (`hi`). -class AppLocalizationsHi extends AppLocalizations { - AppLocalizationsHi([String locale = 'hi']) : super(locale); - - @override - String get appName => 'SpotiFLAC Mobile'; - - @override - String get navHome => 'होम'; - - @override - String get navLibrary => 'Library'; - - @override - String get navSettings => 'विकल्प'; - - @override - String get navStore => 'Repo'; - - @override - String get homeTitle => 'Home'; - - @override - String get homeSubtitle => 'Paste a supported URL or search by name'; - - @override - String get homeEmptyTitle => 'No search providers yet'; - - @override - String get homeEmptySubtitle => 'Install an extension to continue.'; - - @override - String get homeSupports => 'Supports: Track, Album, Playlist, Artist URLs'; - - @override - String get homeRecent => 'Recent'; - - @override - String get historyFilterAll => 'All'; - - @override - String get historyFilterAlbums => 'Albums'; - - @override - String get historyFilterSingles => 'Singles'; - - @override - String get historySearchHint => 'Search history...'; - - @override - String get settingsTitle => 'Settings'; - - @override - String get settingsDownload => 'Download'; - - @override - String get settingsAppearance => 'Appearance'; - - @override - String get settingsExtensions => 'Extensions'; - - @override - String get settingsAbout => 'About'; - - @override - String get downloadTitle => 'Download'; - - @override - String get downloadAskQualitySubtitle => - 'Show quality picker for each download'; - - @override - String get downloadFilenameFormat => 'Filename Format'; - - @override - String get downloadSingleFilenameFormat => 'Single Filename Format'; - - @override - String get downloadSingleFilenameFormatDescription => - 'Filename pattern for singles and EPs. Uses the same tags as the album format.'; - - @override - String get downloadFolderOrganization => 'Folder Organization'; - - @override - String get appearanceTitle => 'दिखावट'; - - @override - String get appearanceThemeSystem => 'System'; - - @override - String get appearanceThemeLight => 'Light'; - - @override - String get appearanceThemeDark => 'Dark'; - - @override - String get appearanceDynamicColor => 'डायनेमिक रंग'; - - @override - String get appearanceDynamicColorSubtitle => 'वॉलपेपर से रंग इस्तेमाल करें'; - - @override - String get appearanceHistoryView => 'History View'; - - @override - String get appearanceHistoryViewList => 'List'; - - @override - String get appearanceHistoryViewGrid => 'Grid'; - - @override - String get optionsPrimaryProvider => 'Primary Provider'; - - @override - String get optionsPrimaryProviderSubtitle => - 'Service used for searching by track or album name'; - - @override - String optionsUsingExtension(String extensionName) { - return 'Using extension: $extensionName'; - } - - @override - String get optionsDefaultSearchTab => 'Default Search Tab'; - - @override - String get optionsDefaultSearchTabSubtitle => - 'Choose which tab opens first for new search results.'; - - @override - String get optionsAutoFallback => 'Auto Fallback'; - - @override - String get optionsAutoFallbackSubtitle => - 'Try other services if download fails'; - - @override - String get optionsEmbedLyrics => 'Embed Lyrics'; - - @override - String get optionsEmbedLyricsSubtitle => - 'Save synced lyrics alongside your downloaded tracks'; - - @override - String get optionsMaxQualityCover => 'Max Quality Cover'; - - @override - String get optionsMaxQualityCoverSubtitle => - 'Download highest resolution cover art'; - - @override - String get optionsReplayGain => 'ReplayGain'; - - @override - String get optionsReplayGainSubtitleOn => - 'Scan loudness and embed ReplayGain tags (EBU R128)'; - - @override - String get optionsReplayGainSubtitleOff => - 'Disabled: no loudness normalization tags'; - - @override - String get trackReplayGain => 'Rescan ReplayGain'; - - @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 => 'Artist Tag Mode'; - - @override - String get optionsArtistTagModeDescription => - 'Choose how multiple artists are written into embedded tags.'; - - @override - String get optionsArtistTagModeJoined => 'Single joined value'; - - @override - String get optionsArtistTagModeJoinedSubtitle => - 'Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.'; - - @override - String get optionsArtistTagModeSplitVorbis => 'Split tags for FLAC/Opus'; - - @override - String get optionsArtistTagModeSplitVorbisSubtitle => - 'Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.'; - - @override - String get optionsExtensionStore => 'Extension Repo'; - - @override - String get optionsExtensionStoreSubtitle => 'Show Repo tab in navigation'; - - @override - String get optionsCheckUpdates => 'Check for Updates'; - - @override - String get optionsCheckUpdatesSubtitle => - 'Notify when new version is available'; - - @override - String get optionsUpdateChannel => 'Update Channel'; - - @override - String get optionsUpdateChannelStable => 'Stable releases only'; - - @override - String get optionsUpdateChannelPreview => 'Get preview releases'; - - @override - String get optionsUpdateChannelWarning => - 'Preview may contain bugs or incomplete features'; - - @override - String get optionsClearHistory => 'Clear Download History'; - - @override - String get optionsClearHistorySubtitle => - 'Remove all downloaded tracks from history'; - - @override - String get optionsDetailedLogging => 'Detailed Logging'; - - @override - String get optionsDetailedLoggingOn => 'Detailed logs are being recorded'; - - @override - String get optionsDetailedLoggingOff => 'Enable for bug reports'; - - @override - String get extensionsTitle => 'Extensions'; - - @override - String get extensionsDisabled => 'Disabled'; - - @override - String extensionsVersion(String version) { - return 'Version $version'; - } - - @override - String get extensionsUninstall => 'Uninstall'; - - @override - String get storeTitle => 'Extension Repo'; - - @override - String get storeSearch => 'Search extensions...'; - - @override - String get storeInstall => 'Install'; - - @override - String get storeInstalled => 'Installed'; - - @override - String get storeUpdate => 'Update'; - - @override - String get aboutTitle => 'About'; - - @override - String get aboutContributors => 'Contributors'; - - @override - String get aboutMobileDeveloper => 'Mobile version developer'; - - @override - String get aboutOriginalCreator => 'Creator of the original SpotiFLAC'; - - @override - String get aboutLogoArtist => - 'The talented artist who created our beautiful app logo!'; - - @override - String get aboutTranslators => 'Translators'; - - @override - String get aboutSpecialThanks => 'Special Thanks'; - - @override - String get aboutLinks => 'Links'; - - @override - String get aboutMobileSource => 'Mobile source code'; - - @override - String get aboutPCSource => 'PC source code'; - - @override - String get aboutKeepAndroidOpen => 'Keep Android Open'; - - @override - String get aboutReportIssue => 'Report an issue'; - - @override - String get aboutReportIssueSubtitle => 'Report any problems you encounter'; - - @override - String get aboutFeatureRequest => 'Feature request'; - - @override - String get aboutFeatureRequestSubtitle => 'Suggest new features for the app'; - - @override - String get aboutTelegramChannel => 'Telegram Channel'; - - @override - String get aboutTelegramChannelSubtitle => 'Announcements and updates'; - - @override - String get aboutTelegramChat => 'Telegram Community'; - - @override - String get aboutTelegramChatSubtitle => 'Chat with other users'; - - @override - String get aboutSocial => 'Social'; - - @override - String get aboutApp => 'App'; - - @override - String get aboutVersion => 'Version'; - - @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 => - 'Creator of I Don\'t Have Spotify (IDHS). The fallback link resolver that saves the day!'; - - @override - String get aboutAppDescription => - 'Search music metadata, manage extensions, and organize your library.'; - - @override - String get artistAlbums => 'Albums'; - - @override - String get artistSingles => 'Singles & EPs'; - - @override - String get artistCompilations => 'Compilations'; - - @override - String get artistPopular => 'Popular'; - - @override - String artistMonthlyListeners(String count) { - return '$count monthly listeners'; - } - - @override - String get trackMetadataService => 'Service'; - - @override - String get trackMetadataPlay => 'Play'; - - @override - String get trackMetadataShare => 'Share'; - - @override - String get trackMetadataDelete => 'Delete'; - - @override - String get setupGrantPermission => 'Grant Permission'; - - @override - String get setupSkip => 'Skip for now'; - - @override - String get setupStorageAccessRequired => 'Storage Access Required'; - - @override - String get setupStorageAccessMessageAndroid11 => - 'Android 11+ requires \"All files access\" permission to save files to your chosen download folder.'; - - @override - String get setupOpenSettings => 'Open Settings'; - - @override - String get setupPermissionDeniedMessage => - 'Permission denied. Please grant all permissions to continue.'; - - @override - String setupPermissionRequired(String permissionType) { - return '$permissionType Permission Required'; - } - - @override - String setupPermissionRequiredMessage(String permissionType) { - return '$permissionType permission is required for the best experience. You can change this later in Settings.'; - } - - @override - String get setupUseDefaultFolder => 'Use Default Folder?'; - - @override - String get setupNoFolderSelected => - 'No folder selected. Would you like to use the default Music folder?'; - - @override - String get setupUseDefault => 'Use Default'; - - @override - String get setupDownloadLocationTitle => 'Download Location'; - - @override - String get setupDownloadLocationIosMessage => - 'On iOS, downloads are saved to the app\'s Documents folder. You can access them via the Files app.'; - - @override - String get setupAppDocumentsFolder => 'App Documents Folder'; - - @override - String get setupAppDocumentsFolderSubtitle => - 'Recommended - accessible via Files app'; - - @override - String get setupChooseFromFiles => 'Choose from Files'; - - @override - String get setupChooseFromFilesSubtitle => 'Select iCloud or other location'; - - @override - String get setupIosEmptyFolderWarning => - 'iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.'; - - @override - String get setupIcloudNotSupported => - 'iCloud Drive is not supported. Please use the app Documents folder.'; - - @override - String get setupDownloadInFlac => 'Download Spotify tracks in FLAC'; - - @override - String get setupStorageGranted => 'Storage Permission Granted!'; - - @override - String get setupStorageRequired => 'Storage Permission Required'; - - @override - String get setupStorageDescription => - 'SpotiFLAC needs storage permission to save your downloaded music files.'; - - @override - String get setupNotificationGranted => 'Notification Permission Granted!'; - - @override - String get setupNotificationEnable => 'Enable Notifications'; - - @override - String get setupFolderChoose => 'Choose Download Folder'; - - @override - String get setupFolderDescription => - 'Select a folder where your downloaded music will be saved.'; - - @override - String get setupSelectFolder => 'Select Folder'; - - @override - String get setupEnableNotifications => 'Enable Notifications'; - - @override - String get setupNotificationBackgroundDescription => - 'Get notified about download progress and completion. This helps you track downloads when the app is in background.'; - - @override - String get setupSkipForNow => 'Skip for now'; - - @override - String get setupNext => 'Next'; - - @override - String get setupGetStarted => 'Get Started'; - - @override - String get setupAllowAccessToManageFiles => - 'Please enable \"Allow access to manage all files\" in the next screen.'; - - @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 => 'Cancel'; - - @override - String get dialogSave => 'Save'; - - @override - String get dialogDelete => 'Delete'; - - @override - String get dialogRetry => 'Retry'; - - @override - String get dialogClear => 'Clear'; - - @override - String get dialogDone => 'Done'; - - @override - String get dialogImport => 'Import'; - - @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 => 'Discard'; - - @override - String get dialogRemove => 'Remove'; - - @override - String get dialogUninstall => 'Uninstall'; - - @override - String get dialogDiscardChanges => 'Discard Changes?'; - - @override - String get dialogUnsavedChanges => - 'You have unsaved changes. Do you want to discard them?'; - - @override - String get dialogClearAll => 'Clear All'; - - @override - String get dialogRemoveExtension => 'Remove Extension'; - - @override - String get dialogRemoveExtensionMessage => - 'Are you sure you want to remove this extension? This cannot be undone.'; - - @override - String get dialogUninstallExtension => 'Uninstall Extension?'; - - @override - String dialogUninstallExtensionMessage(String extensionName) { - return 'Are you sure you want to remove $extensionName?'; - } - - @override - String get dialogClearHistoryTitle => 'Clear History'; - - @override - String get dialogClearHistoryMessage => - 'Are you sure you want to clear all download history? This cannot be undone.'; - - @override - String get dialogDeleteSelectedTitle => 'Delete Selected'; - - @override - String dialogDeleteSelectedMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0 from history?\n\nThis will also delete the files from storage.'; - } - - @override - String get dialogImportPlaylistTitle => 'Import Playlist'; - - @override - String dialogImportPlaylistMessage(int count) { - return 'Found $count tracks in CSV. Add them to download queue?'; - } - - @override - String csvImportTracks(int count) { - return '$count tracks from CSV'; - } - - @override - String snackbarAddedToQueue(String trackName) { - return 'Added \"$trackName\" to queue'; - } - - @override - String snackbarAddedTracksToQueue(int count) { - return 'Added $count tracks to queue'; - } - - @override - String snackbarAlreadyDownloaded(String trackName) { - return '\"$trackName\" already downloaded'; - } - - @override - String snackbarAlreadyInLibrary(String trackName) { - return '\"$trackName\" already exists in your library'; - } - - @override - String get snackbarHistoryCleared => 'History cleared'; - - @override - String snackbarDeletedTracks(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Deleted $count $_temp0'; - } - - @override - String snackbarCannotOpenFile(String error) { - return 'Cannot open file: $error'; - } - - @override - String get snackbarViewQueue => 'View Queue'; - - @override - String snackbarUrlCopied(String platform) { - return '$platform URL copied to clipboard'; - } - - @override - String get snackbarFileNotFound => 'File not found'; - - @override - String get snackbarSelectExtFile => 'Please select a .spotiflac-ext file'; - - @override - String get snackbarProviderPrioritySaved => 'Provider priority saved'; - - @override - String get snackbarMetadataProviderSaved => - 'Metadata provider priority saved'; - - @override - String snackbarExtensionInstalled(String extensionName) { - return '$extensionName installed.'; - } - - @override - String snackbarExtensionUpdated(String extensionName) { - return '$extensionName updated.'; - } - - @override - String get snackbarFailedToInstall => 'Failed to install extension'; - - @override - String get snackbarFailedToUpdate => 'Failed to update extension'; - - @override - String get errorRateLimited => 'Rate Limited'; - - @override - String get errorRateLimitedMessage => - 'Too many requests. Please wait a moment before searching again.'; - - @override - String get errorNoTracksFound => 'No tracks found'; - - @override - String get searchEmptyResultSubtitle => 'Try another keyword'; - - @override - String get errorUrlNotRecognized => 'Link not recognized'; - - @override - String get errorUrlNotRecognizedMessage => - 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; - - @override - String get errorUrlFetchFailed => - 'Failed to load content from this link. Please try again.'; - - @override - String errorMissingExtensionSource(String item) { - return 'Cannot load $item: missing extension source'; - } - - @override - String get actionPause => 'Pause'; - - @override - String get actionResume => 'Resume'; - - @override - String get actionCancel => 'Cancel'; - - @override - String get actionSelectAll => 'Select All'; - - @override - String get actionDeselect => 'Deselect'; - - @override - String selectionSelected(int count) { - return '$count selected'; - } - - @override - String get selectionAllSelected => 'All tracks selected'; - - @override - String get selectionSelectToDelete => 'Select tracks to delete'; - - @override - String progressFetchingMetadata(int current, int total) { - return 'Fetching metadata... $current/$total'; - } - - @override - String get progressReadingCsv => 'Reading CSV...'; - - @override - String get searchSongs => 'Songs'; - - @override - String get searchArtists => 'Artists'; - - @override - String get searchAlbums => 'Albums'; - - @override - String get searchPlaylists => 'Playlists'; - - @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 => 'Play'; - - @override - String get filenameFormat => 'Filename Format'; - - @override - String get filenameShowAdvancedTags => 'Show advanced tags'; - - @override - String get filenameShowAdvancedTagsDescription => - 'Enable formatted tags for track padding and date patterns'; - - @override - String get folderOrganizationNone => 'No organization'; - - @override - String get folderOrganizationByPlaylist => 'By Playlist'; - - @override - String get folderOrganizationByPlaylistSubtitle => - 'Separate folder for each playlist'; - - @override - String get folderOrganizationByArtist => 'By Artist'; - - @override - String get folderOrganizationByAlbum => 'By Album'; - - @override - String get folderOrganizationByArtistAlbum => 'Artist/Album'; - - @override - String get folderOrganizationDescription => - 'Organize downloaded files into folders'; - - @override - String get folderOrganizationNoneSubtitle => 'All files in download folder'; - - @override - String get folderOrganizationByArtistSubtitle => - 'Separate folder for each artist'; - - @override - String get folderOrganizationByAlbumSubtitle => - 'Separate folder for each album'; - - @override - String get folderOrganizationByArtistAlbumSubtitle => - 'Nested folders for artist and album'; - - @override - String get updateAvailable => 'Update Available'; - - @override - String get updateLater => 'Later'; - - @override - String get updateStartingDownload => 'Starting download...'; - - @override - String get updateDownloadFailed => 'Download failed'; - - @override - String get updateFailedMessage => 'Failed to download update'; - - @override - String get updateNewVersionReady => 'A new version is ready'; - - @override - String get updateRequiredTitle => 'Update required'; - - @override - String updateRequiredNotice(int count) { - return 'This version is $count releases behind and is no longer supported. Update to keep using the app.'; - } - - @override - String get updateCurrent => 'Current'; - - @override - String get updateNew => 'New'; - - @override - String get updateDownloading => 'Downloading...'; - - @override - String get updateWhatsNew => 'What\'s New'; - - @override - String get updateDownloadInstall => 'Download & Install'; - - @override - String get updateDontRemind => 'Don\'t remind'; - - @override - String get providerPriorityTitle => 'Provider Priority'; - - @override - String get providerPriorityDescription => - 'Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.'; - - @override - String get providerPriorityInfo => - 'If a track is not available on the first provider, the app will automatically try the next one.'; - - @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 providerExtension => 'Extension'; - - @override - String get metadataProviderPriorityTitle => 'Metadata Priority'; - - @override - String get metadataProviderPriorityDescription => - 'Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.'; - - @override - String get metadataProviderPriorityInfo => - 'Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.'; - - @override - String get logTitle => 'Logs'; - - @override - String get logCopied => 'Logs copied to clipboard'; - - @override - String get logSearchHint => 'Search logs...'; - - @override - String get logFilterLevel => 'Level'; - - @override - String get logFilterSection => 'Filter'; - - @override - String get logShareLogs => 'Share logs'; - - @override - String get logClearLogs => 'Clear logs'; - - @override - String get logClearLogsTitle => 'Clear Logs'; - - @override - String get logClearLogsMessage => 'Are you sure you want to clear all logs?'; - - @override - String get logFilterBySeverity => 'Filter logs by severity'; - - @override - String get logNoLogsYet => 'No logs yet'; - - @override - String get logNoLogsYetSubtitle => 'Logs will appear here as you use the app'; - - @override - String logEntriesFiltered(int count) { - return 'Entries ($count filtered)'; - } - - @override - String logEntries(int count) { - return 'Entries ($count)'; - } - - @override - String get channelStable => 'Stable'; - - @override - String get channelPreview => 'Preview'; - - @override - String get sectionSearchSource => 'Search Source'; - - @override - String get sectionDownload => 'Download'; - - @override - String get sectionPerformance => 'Performance'; - - @override - String get sectionApp => 'App'; - - @override - String get sectionData => 'Data'; - - @override - String get sectionDebug => 'Debug'; - - @override - String get sectionService => 'Service'; - - @override - String get sectionAudioQuality => 'Audio Quality'; - - @override - String get sectionFileSettings => 'File Settings'; - - @override - String get sectionLyrics => 'Lyrics'; - - @override - String get lyricsMode => 'Lyrics Mode'; - - @override - String get lyricsModeDescription => - 'Choose how lyrics are saved with your downloads'; - - @override - String get lyricsModeEmbed => 'Embed in file'; - - @override - String get lyricsModeEmbedSubtitle => 'Lyrics stored inside FLAC metadata'; - - @override - String get lyricsModeExternal => 'External .lrc file'; - - @override - String get lyricsModeExternalSubtitle => - 'Separate .lrc file for players like Samsung Music'; - - @override - String get lyricsModeBoth => 'Both'; - - @override - String get lyricsModeBothSubtitle => 'Embed and save .lrc file'; - - @override - String get sectionColor => 'Color'; - - @override - String get sectionTheme => 'Theme'; - - @override - String get sectionLayout => 'Layout'; - - @override - String get sectionLanguage => 'Language'; - - @override - String get appearanceLanguage => 'App Language'; - - @override - String get settingsAppearanceSubtitle => 'Theme, colors, display'; - - @override - String get settingsDownloadSubtitle => 'Service, quality, fallback'; - - @override - String get settingsExtensionsSubtitle => 'Manage download providers'; - - @override - String get settingsLogsSubtitle => 'View app logs for debugging'; - - @override - String get loadingSharedLink => 'Loading shared link...'; - - @override - String get pressBackAgainToExit => 'Press back again to exit'; - - @override - String downloadAllCount(int count) { - return 'Download All ($count)'; - } - - @override - String tracksCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count tracks', - one: '1 track', - ); - return '$_temp0'; - } - - @override - String get trackCopyFilePath => 'Copy file path'; - - @override - String get trackRemoveFromDevice => 'Remove from device'; - - @override - String get trackLoadLyrics => 'Load Lyrics'; - - @override - String get trackMetadata => 'Metadata'; - - @override - String get trackFileInfo => 'File Info'; - - @override - String get trackLyrics => 'Lyrics'; - - @override - String get trackFileNotFound => 'File not found'; - - @override - String get trackOpenInDeezer => 'Open in Deezer'; - - @override - String get trackOpenInSpotify => 'Open in Spotify'; - - @override - String get trackTrackName => 'Track name'; - - @override - String get trackArtist => 'Artist'; - - @override - String get trackAlbumArtist => 'Album artist'; - - @override - String get trackAlbum => 'Album'; - - @override - String get trackTrackNumber => 'Track number'; - - @override - String get trackDiscNumber => 'Disc number'; - - @override - String get trackDuration => 'Duration'; - - @override - String get trackAudioQuality => 'Audio quality'; - - @override - String get trackReleaseDate => 'Release date'; - - @override - String get trackGenre => 'Genre'; - - @override - String get trackLabel => 'Label'; - - @override - String get trackCopyright => 'Copyright'; - - @override - String get trackDownloaded => 'Downloaded'; - - @override - String get trackCopyLyrics => 'Copy lyrics'; - - @override - String trackLyricsSource(String source) { - return 'Source: $source'; - } - - @override - String get trackLyricsNotAvailable => 'Lyrics not available for this track'; - - @override - String get trackLyricsNotInFile => 'No lyrics found in this file'; - - @override - String get trackFetchOnlineLyrics => 'Fetch from Online'; - - @override - String get trackLyricsTimeout => 'Request timed out. Try again later.'; - - @override - String get trackLyricsLoadFailed => 'Failed to load lyrics'; - - @override - String get trackEmbedLyrics => 'Embed Lyrics'; - - @override - String get trackLyricsEmbedded => 'Lyrics embedded successfully'; - - @override - String get trackInstrumental => 'Instrumental track'; - - @override - String get trackCopiedToClipboard => 'Copied to clipboard'; - - @override - String get trackDeleteConfirmTitle => 'Remove from device?'; - - @override - String get trackDeleteConfirmMessage => - 'This will permanently delete the downloaded file and remove it from your history.'; - - @override - String get dateToday => 'Today'; - - @override - String get dateYesterday => 'Yesterday'; - - @override - String dateDaysAgo(int count) { - return '$count days ago'; - } - - @override - String dateWeeksAgo(int count) { - return '$count weeks ago'; - } - - @override - String dateMonthsAgo(int count) { - return '$count months ago'; - } - - @override - String get storeFilterAll => 'All'; - - @override - String get storeFilterMetadata => 'Metadata'; - - @override - String get storeFilterDownload => 'Download'; - - @override - String get storeFilterUtility => 'Utility'; - - @override - String get storeFilterLyrics => 'Lyrics'; - - @override - String get storeFilterIntegration => 'Integration'; - - @override - String get storeClearFilters => 'Clear filters'; - - @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 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 extensionId => 'ID'; - - @override - String get extensionError => 'Error'; - - @override - String get extensionCapabilities => 'Capabilities'; - - @override - String get extensionMetadataProvider => 'Metadata Provider'; - - @override - String get extensionDownloadProvider => 'Download Provider'; - - @override - String get extensionLyricsProvider => 'Lyrics Provider'; - - @override - String get extensionUrlHandler => 'URL Handler'; - - @override - String get extensionQualityOptions => 'Quality Options'; - - @override - String get extensionPostProcessingHooks => 'Post-Processing Hooks'; - - @override - String get extensionPermissions => 'Permissions'; - - @override - String get extensionSettings => 'Settings'; - - @override - String get extensionRemoveButton => 'Remove Extension'; - - @override - String get extensionUpdated => 'Updated'; - - @override - String get extensionMinAppVersion => 'Min App Version'; - - @override - String get extensionCustomTrackMatching => 'Custom Track Matching'; - - @override - String get extensionPostProcessing => 'Post-Processing'; - - @override - String extensionHooksAvailable(int count) { - return '$count hook(s) available'; - } - - @override - String extensionPatternsCount(int count) { - return '$count pattern(s)'; - } - - @override - String extensionStrategy(String strategy) { - return 'Strategy: $strategy'; - } - - @override - String get extensionsProviderPrioritySection => 'Provider Priority'; - - @override - String get extensionsInstalledSection => 'Installed Extensions'; - - @override - String get extensionsNoExtensions => 'No extensions installed'; - - @override - String get extensionsNoExtensionsSubtitle => - 'Install .spotiflac-ext files to add new providers'; - - @override - String get extensionsInstallButton => 'Install Extension'; - - @override - String get extensionsInfoTip => - 'Extensions can add new metadata and download providers. Only install extensions from trusted sources.'; - - @override - String get extensionsInstalledSuccess => 'Extension installed successfully'; - - @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 => 'Download Priority'; - - @override - String get extensionsDownloadPrioritySubtitle => 'Set download service order'; - - @override - String get extensionsFallbackTitle => 'Fallback Extensions'; - - @override - String get extensionsFallbackSubtitle => - 'Choose which installed download extensions can be used as fallback'; - - @override - String get extensionsNoDownloadProvider => - 'No extensions with download provider'; - - @override - String get extensionsMetadataPriority => 'Metadata Priority'; - - @override - String get extensionsMetadataPrioritySubtitle => - 'Set search & metadata source order'; - - @override - String get extensionsNoMetadataProvider => - 'No extensions with metadata provider'; - - @override - String get extensionsSearchProvider => 'Search Provider'; - - @override - String get extensionsNoCustomSearch => 'No extensions with custom search'; - - @override - String get extensionsSearchProviderDescription => - 'Choose which service to use for searching tracks'; - - @override - String get extensionsCustomSearch => 'Custom search'; - - @override - String get extensionsErrorLoading => 'Error loading extension'; - - @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 / up to 96kHz'; - - @override - String get qualityHiResFlacMax => 'Hi-Res FLAC Max'; - - @override - String get qualityHiResFlacMaxSubtitle => '24-bit / up to 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 downloadAskBeforeDownload => 'Ask Before Download'; - - @override - String get downloadDirectory => 'Download Directory'; - - @override - String get downloadSeparateSinglesFolder => 'Separate Singles Folder'; - - @override - String get downloadAlbumFolderStructure => 'Album Folder Structure'; - - @override - String get albumFolderStructureDescription => - 'Choose how album folders are structured'; - - @override - String get downloadUseAlbumArtistForFolders => 'Use Album Artist for folders'; - - @override - String get downloadUsePrimaryArtistOnly => 'Primary artist only for folders'; - - @override - String get downloadUsePrimaryArtistOnlyEnabled => - 'Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)'; - - @override - String get downloadUsePrimaryArtistOnlyDisabled => - 'Full artist string used for folder name'; - - @override - String get downloadSelectQuality => 'Select Quality'; - - @override - String get downloadFrom => 'Download From'; - - @override - String get appearanceAmoledDark => 'AMOLED Dark'; - - @override - String get appearanceAmoledDarkSubtitle => 'Pure black background'; - - @override - String get appearanceHeroAnimations => 'Hero animations'; - - @override - String get appearanceHeroAnimationsSubtitle => - 'Fly covers between screens, e.g. when opening the player'; - - @override - String get queueClearAll => 'Clear All'; - - @override - String get queueClearAllMessage => - 'Are you sure you want to clear all downloads?'; - - @override - String get settingsAutoExportFailed => 'Auto-export failed downloads'; - - @override - String get settingsAutoExportFailedSubtitle => - 'Save failed downloads to TXT file automatically'; - - @override - String get settingsDownloadNetwork => 'Download Network'; - - @override - String get settingsDownloadNetworkAny => 'WiFi + Mobile Data'; - - @override - String get settingsDownloadNetworkWifiOnly => 'WiFi Only'; - - @override - String get settingsDownloadNetworkSubtitle => - 'Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.'; - - @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 => 'Artist / Album'; - - @override - String get albumFolderArtistAlbumSubtitle => 'Albums/Artist Name/Album Name/'; - - @override - String get albumFolderArtistYearAlbum => 'Artist / [Year] Album'; - - @override - String get albumFolderArtistYearAlbumSubtitle => - 'Albums/Artist Name/[2005] Album Name/'; - - @override - String get albumFolderAlbumOnly => 'Album Only'; - - @override - String get albumFolderAlbumOnlySubtitle => 'Albums/Album Name/'; - - @override - String get albumFolderYearAlbum => '[Year] Album'; - - @override - String get albumFolderYearAlbumSubtitle => 'Albums/[2005] Album Name/'; - - @override - String get albumFolderArtistAlbumSingles => 'Artist / Album + Singles'; - - @override - String get albumFolderArtistAlbumSinglesSubtitle => - 'Artist/Album/ and Artist/Singles/'; - - @override - String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; - - @override - String get albumFolderArtistAlbumFlatSubtitle => - 'Artist/Album/ and Artist/song.flac'; - - @override - String get downloadedAlbumDeleteSelected => 'Delete Selected'; - - @override - String downloadedAlbumDeleteMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0 from this album?\n\nThis will also delete the files from storage.'; - } - - @override - String downloadedAlbumSelectedCount(int count) { - return '$count selected'; - } - - @override - String get downloadedAlbumTapToSelect => 'Tap tracks to select'; - - @override - String downloadedAlbumDeleteCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0'; - } - - @override - String get downloadedAlbumSelectToDelete => 'Select tracks to delete'; - - @override - String downloadedAlbumDiscHeader(int discNumber) { - return 'Disc $discNumber'; - } - - @override - String get recentTypeArtist => 'Artist'; - - @override - String get recentTypeAlbum => 'Album'; - - @override - String get recentTypeSong => 'Song'; - - @override - String get recentTypePlaylist => 'Playlist'; - - @override - String get recentEmpty => 'No recent items yet'; - - @override - String get recentShowAllDownloads => 'Show All Downloads'; - - @override - String recentPlaylistInfo(String name) { - return 'Playlist: $name'; - } - - @override - String get discographyDownload => 'Download Discography'; - - @override - String get discographyDownloadAll => 'Download All'; - - @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 => - 'Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.'; - - @override - String libraryTracksUnit(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$_temp0'; - } - - @override - String 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 => 'Welcome to SpotiFLAC!'; - - @override - String get tutorialWelcomeDesc => - 'Let\'s learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.'; - - @override - String get tutorialWelcomeTip1 => - 'Download music from Spotify, Deezer, or paste any supported URL'; - - @override - String get tutorialWelcomeTip2 => - 'Get FLAC quality audio from installed download extensions'; - - @override - String get tutorialWelcomeTip3 => - 'Automatic metadata, cover art, and lyrics embedding'; - - @override - String get tutorialSearchTitle => 'Finding Music'; - - @override - String get tutorialSearchDesc => - 'There are two easy ways to find music you want to download.'; - - @override - String get tutorialDownloadTitle => 'Downloading Music'; - - @override - String get tutorialDownloadDesc => - 'Downloading music is simple and fast. Here\'s how it works.'; - - @override - String get tutorialLibraryTitle => 'Your Library'; - - @override - String get tutorialLibraryDesc => - 'All your downloaded music is organized in the Library tab.'; - - @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 libraryPlaybackNormalization => 'Volume normalization'; - - @override - String get libraryPlaybackNormalizationSubtitle => - 'Even out loudness between tracks using their ReplayGain or R128 tags, when present'; - - @override - String get cacheAudioAnalysis => 'Audio analysis cache'; - - @override - String get cacheAudioAnalysisDesc => - 'Saved spectrograms and analysis results. Will re-analyze on next open.'; - - @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 trackSaveLyrics => 'Save Lyrics (.lrc)'; - - @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 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 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 trackConvertTitle => 'Convert Audio'; - - @override - String get trackConvertTargetFormat => 'Target Format'; - - @override - String get trackConvertBitrate => 'Bitrate'; - - @override - String get trackConvertKeepOriginal => 'Keep original file'; - - @override - String get trackConvertKeepOriginalDescription => - 'Add the converted file as a separate library entry'; - - @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 trackConvertConfirmKeepOriginal( - String sourceFormat, - String targetFormat, - ) { - return 'Convert from $sourceFormat to $targetFormat?\n\nThe original file will be kept and the converted file will be added as a separate library entry.'; - } - - @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 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 collectionPlaylist => 'Playlist'; - - @override - String get collectionAddToPlaylist => 'Add to playlist'; - - @override - String get collectionCreatePlaylist => 'Create playlist'; - - @override - String get collectionNoPlaylistsYet => 'No playlists yet'; - - @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 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 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 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 selectionBatchConvertConfirmKeepOriginal(int count, String format) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Convert $count $_temp0 to $format?\n\nOriginal files will be kept and converted files will be added as separate library entries.'; - } - - @override - String selectionBatchConvertSuccess(int success, int total, String format) { - return 'Converted $success of $total tracks to $format'; - } - - @override - String downloadedAlbumDownloadedCount(int count) { - return '$count downloaded'; - } - - @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 => 'Backup & Restore'; - - @override - String get settingsBackupSubtitle => - 'Move your library, history and settings to a new device'; - - @override - String get backupTitle => 'Backup & Restore'; - - @override - String get backupExportSectionTitle => 'Create backup'; - - @override - String get backupExportSectionDescription => - 'Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.'; - - @override - String get backupExportButton => 'Create backup file'; - - @override - String get backupImportSectionTitle => 'Restore backup'; - - @override - String get backupImportSectionDescription => - 'Pick a backup file to restore your data. This replaces the current settings, history and library on this device.'; - - @override - String get backupImportButton => 'Choose backup file'; - - @override - String get backupCreated => 'Backup created'; - - @override - String get backupCreateFailed => 'Failed to create backup'; - - @override - String get backupRestoreConfirmTitle => 'Restore this backup?'; - - @override - String get backupRestoreConfirmMessage => - 'This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.'; - - @override - String get backupRestoreConfirmButton => 'Restore'; - - @override - String get backupRestored => 'Backup restored successfully'; - - @override - String get backupRestoreFailed => 'Failed to restore backup'; - - @override - String get backupInvalidFile => 'This file is not a valid SpotiFLAC backup'; - - @override - String get backupRestoreRestartHint => - 'Restart the app to make sure every change is applied.'; - - @override - String get backupContentsTitle => 'Backup contents'; - - @override - String get backupContentsSettings => 'App settings'; - - @override - String backupContentsHistory(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'items', - one: 'item', - ); - return '$count history $_temp0'; - } - - @override - String backupContentsLiked(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$count liked $_temp0'; - } - - @override - String backupContentsWishlist(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$count wishlist $_temp0'; - } - - @override - String backupContentsPlaylists(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count playlists', - one: '1 playlist', - ); - return '$_temp0'; - } - - @override - String backupContentsArtists(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count favorite artists', - one: '1 favorite artist', - ); - return '$_temp0'; - } - - @override - String backupContentsExtensions(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count extensions', - one: '1 extension', - ); - return '$_temp0'; - } - - @override - String get backupIncludeSecrets => 'Include extension credentials'; - - @override - String get backupIncludeSecretsDescription => - 'Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.'; - - @override - String backupExtensionsRestoreFailed(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'extensions', - one: 'extension', - ); - return '$count $_temp0 could not be reinstalled. Install them manually from the repo.'; - } - - @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 => 'Allow Local Network Access'; - - @override - String get downloadAllowLocalNetworkEnabled => - 'Requests to local/private addresses are allowed (for local proxy or custom DNS)'; - - @override - String get downloadAllowLocalNetworkDisabled => - 'Local/private addresses are blocked for security'; - - @override - String get downloadSelectServiceToEnable => - 'Select a provider with quality options to enable this option'; - - @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 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 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 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 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 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 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 queueDownloadNext => 'Download next'; - - @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 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 downloadDeduplicationWithQualityVariants => - 'Existing files at the selected quality will be skipped'; - - @override - String get downloadDeduplicationDisabled => - 'All tracks will be downloaded regardless of history'; - - @override - String get downloadQualityVariants => 'Allow different quality versions'; - - @override - String get downloadQualityVariantsDescription => - 'Add the selected quality to the filename and keep each version in download history'; - - @override - String get trackOptionDownloadQualityVariant => 'Download another quality'; - - @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 queueCheckingDownloadSession => 'Checking download session...'; - - @override - String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; - - @override - String get queueResolvingDownloadStream => 'Preparing audio stream...'; - - @override - String get queueWaitingForVerification => 'Waiting for verification...'; - - @override - String get queueResumingAfterVerification => 'Resuming after verification...'; - - @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 => - 'एक्सटेंशन डाउनलोड के लिए Android बैकग्राउंड सेवा'; - - @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 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 => 'Playback'; - - @override - String get libraryExternalPlayer => 'External player'; - - @override - String get libraryExternalPlayerSubtitle => - 'Recommended for listening, best quality, gapless playback, EQ, and wider format support'; - - @override - String get libraryBuiltInPreviewPlayer => 'Built-in preview player'; - - @override - String get libraryBuiltInPreviewPlayerSubtitle => - 'Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening'; - - @override - String get libraryBuiltInPlayerInfo => - 'The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.'; - - @override - String get nowPlayingTitle => 'Now Playing'; - - @override - String get nowPlayingNothingPlaying => 'Nothing is playing'; - - @override - String get nowPlayingMinimize => 'Minimize'; - - @override - String get nowPlayingUpNext => 'Up next'; - - @override - String get nowPlayingDetails => 'Details'; - - @override - String get nowPlayingOpenInExternalPlayer => 'Open in external player'; - - @override - String get nowPlayingTabPlayer => 'Player'; - - @override - String get nowPlayingTabLyrics => 'Lyrics'; - - @override - String get nowPlayingNoLyrics => 'No lyrics in this file'; - - @override - String get nowPlayingLibraryEmpty => 'Your library is empty'; - - @override - String nowPlayingShuffleLibraryFailed(String error) { - return 'Could not shuffle library: $error'; - } - - @override - String get nowPlayingShuffleOn => 'Shuffle on'; - - @override - String get nowPlayingPlayInOrder => 'Play in order'; - - @override - String get nowPlayingShuffleLibrary => 'Shuffle library'; - - @override - String get nowPlayingQueueEmpty => 'Queue is empty'; - - @override - String get nowPlayingNoMetadata => 'No metadata available'; - - @override - String get announcementUnableToOpenLink => - 'Unable to open link. Please try again.'; - - @override - String trackConvertLosslessOutputWithCap(String quality) { - return 'Lossless output with $quality cap'; - } - - @override - String trackConvertConfirmMessageLosslessCapped( - String sourceFormat, - String targetFormat, - String quality, - ) { - return 'Convert from $sourceFormat to $targetFormat ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.'; - } - - @override - String selectionBatchConvertConfirmMessageLosslessCapped( - int count, - String format, - String quality, - ) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Convert $count $_temp0 to $format ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.'; - } - - @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 => - 'Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius'; - - @override - String get snackbarPlayingNext => 'Playing next'; - - @override - String get snackbarAddedToQueueGeneric => 'Added to queue'; - - @override - String selectionDeletePlaylistsCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'playlists', - one: 'playlist', - ); - return 'Delete $count $_temp0'; - } - - @override - String get actionShuffle => 'Shuffle'; - - @override - String get downloadPrimaryArtistOnlyOn => 'Primary only: On'; - - @override - String get downloadPrimaryArtistOnlyOff => 'Primary only: Off'; - - @override - String get downloadAlbumArtistMetadataPrimaryOnly => - 'Album Artist metadata: Primary only'; - - @override - String get downloadAlbumArtistMetadataFull => 'Album Artist metadata: Full'; - - @override - String get trackConvertOriginal => 'Original'; - - @override - String get trackConvertOriginalQuality => 'Original quality'; - - @override - String get trackConvertLosslessSuffix => 'Lossless'; - - @override - String get trackConvertDithering => 'Dithering'; - - @override - String get trackConvertResampler => 'Resampler'; - - @override - String get trackConvertDitherNone => 'None'; - - @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 => 'See release notes for details.'; - - @override - String get unknownTitle => 'Unknown title'; - - @override - String get trackPlayNext => 'Play next'; - - @override - String get trackAddToQueue => 'Add to queue'; - - @override - String snackbarExtensionInstalledEnable(String extensionName) { - return '$extensionName installed. Enable it in Settings > Extensions'; - } - - @override - String snackbarExtensionUpdatedVersion(String extensionName, String version) { - return '$extensionName updated to v$version'; - } - - @override - String snackbarFailedToInstallNamed(String extensionName) { - return 'Failed to install $extensionName'; - } - - @override - String snackbarFailedToUpdateNamed(String extensionName) { - return 'Failed to update $extensionName'; - } - - @override - String get releaseTypeEp => 'EP'; - - @override - String get releaseTypeSingle => 'Single'; - - @override - String get trackCoverOnline => 'Online cover'; - - @override - String get regionCountryUS => 'United States'; - - @override - String get regionCountryGB => 'United Kingdom'; - - @override - String get regionCountryFR => 'France'; - - @override - String get regionCountryDE => 'Germany'; - - @override - String get regionCountryJP => 'Japan'; - - @override - String get regionCountryKR => 'South Korea'; - - @override - String get regionCountryIN => 'India'; - - @override - String get regionCountryID => 'Indonesia'; - - @override - String get regionCountryBR => 'Brazil'; - - @override - String get regionCountryMX => 'Mexico'; - - @override - String get regionCountryAU => 'Australia'; - - @override - String get regionCountryCA => 'Canada'; - - @override - String get regionCountryXK => 'Kosovo'; - - @override - String get extensionVerificationBrowserTitle => 'Verification browser'; - - @override - String get extensionVerificationBrowserSubtitleExternal => - 'Open challenges in the default browser first'; - - @override - String get extensionVerificationBrowserSubtitleInApp => - 'Open challenges in the in-app browser first'; - - @override - String get extensionVerificationBrowserExternal => 'External'; - - @override - String get extensionVerificationBrowserInApp => 'In-app'; - - @override - String get extensionVerificationHelpTitleManual => - 'Open verification manually'; - - @override - String get extensionVerificationHelpTitleWaiting => - 'Verification still waiting'; - - @override - String get extensionVerificationHelpMessageManual => - 'SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.'; - - @override - String get extensionVerificationHelpMessageWaiting => - 'If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.'; - - @override - String get extensionVerificationClose => 'Close'; - - @override - String get extensionVerificationCopyLink => 'Copy link'; - - @override - String get extensionVerificationLinkCopied => 'Verification link copied'; - - @override - String get extensionVerificationOpenBrowser => 'Open browser'; -} diff --git a/lib/l10n/app_localizations_id.dart b/lib/l10n/app_localizations_id.dart index 6680a237..36b43c53 100644 --- a/lib/l10n/app_localizations_id.dart +++ b/lib/l10n/app_localizations_id.dart @@ -633,6 +633,20 @@ class AppLocalizationsId extends AppLocalizations { return '$count trek dari CSV'; } + @override + String get collectionExportM3u => 'Export as M3U8'; + + @override + String collectionExportM3uDone(int exported, int total) { + return 'Exported $exported of $total tracks'; + } + + @override + String get collectionExportM3uNone => 'No downloaded files to export'; + + @override + String get collectionExportM3uFailed => 'Export failed'; + @override String snackbarAddedToQueue(String trackName) { return 'Menambahkan \"$trackName\" ke antrian'; diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index b4a6cc18..f572a182 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -628,6 +628,20 @@ class AppLocalizationsJa extends AppLocalizations { return '$count tracks from CSV'; } + @override + String get collectionExportM3u => 'Export as M3U8'; + + @override + String collectionExportM3uDone(int exported, int total) { + return 'Exported $exported of $total tracks'; + } + + @override + String get collectionExportM3uNone => 'No downloaded files to export'; + + @override + String get collectionExportM3uFailed => 'Export failed'; + @override String snackbarAddedToQueue(String trackName) { return '「$trackName」をキューに追加しました'; diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart deleted file mode 100644 index f93ff46e..00000000 --- a/lib/l10n/app_localizations_ko.dart +++ /dev/null @@ -1,4530 +0,0 @@ -// ignore: unused_import -import 'package:intl/intl.dart' as intl; -import 'app_localizations.dart'; - -// ignore_for_file: type=lint - -/// The translations for Korean (`ko`). -class AppLocalizationsKo extends AppLocalizations { - AppLocalizationsKo([String locale = 'ko']) : super(locale); - - @override - String get appName => 'SpotiFLAC Mobile'; - - @override - String get navHome => '홈'; - - @override - String get navLibrary => '라이브러리'; - - @override - String get navSettings => '설정'; - - @override - String get navStore => '리포'; - - @override - String get homeTitle => '홈'; - - @override - String get homeSubtitle => '지원되는 URL을 붙여넣거나, 이름으로 검색하세요'; - - @override - String get homeEmptyTitle => '아직 검색 제공자가 없음'; - - @override - String get homeEmptySubtitle => '계속하려면 확장 프로그램을 설치하세요'; - - @override - String get homeSupports => '지원 항목: 트랙, 앨범, 재생목록, 아티스트 URL'; - - @override - String get homeRecent => '최근 기록'; - - @override - String get historyFilterAll => '모두'; - - @override - String get historyFilterAlbums => '앨범'; - - @override - String get historyFilterSingles => '싱글'; - - @override - String get historySearchHint => '기록 검색...'; - - @override - String get settingsTitle => '설정'; - - @override - String get settingsDownload => '다운로드'; - - @override - String get settingsAppearance => '디자인'; - - @override - String get settingsExtensions => '확장 프로그램'; - - @override - String get settingsAbout => '정보'; - - @override - String get downloadTitle => '다운로드'; - - @override - String get downloadAskQualitySubtitle => '다운로드를 할 때마다 음질을 선택하도록 합니다'; - - @override - String get downloadFilenameFormat => '파일 이름 형식'; - - @override - String get downloadSingleFilenameFormat => '싱글 파일 이름 형식'; - - @override - String get downloadSingleFilenameFormatDescription => - '싱글 및 EP용 파일 이름 패턴입니다. 앨범 형식과 동일한 태그를 사용합니다'; - - @override - String get downloadFolderOrganization => '폴더 분류 형식'; - - @override - String get appearanceTitle => '디자인'; - - @override - String get appearanceThemeSystem => '시스템'; - - @override - String get appearanceThemeLight => '밝은'; - - @override - String get appearanceThemeDark => '어두운'; - - @override - String get appearanceDynamicColor => '동적 색상'; - - @override - String get appearanceDynamicColorSubtitle => '배경 화면을 참고하여 강조 색상이 지정됩니다'; - - @override - String get appearanceHistoryView => '기록 정렬 방식'; - - @override - String get appearanceHistoryViewList => '리스트'; - - @override - String get appearanceHistoryViewGrid => '그리드'; - - @override - String get optionsPrimaryProvider => '기본 제공자'; - - @override - String get optionsPrimaryProviderSubtitle => '트랙 또는 앨범 이름으로 검색하는 데 사용되는 서비스'; - - @override - String optionsUsingExtension(String extensionName) { - return '확장 프로그램 사용: $extensionName'; - } - - @override - String get optionsDefaultSearchTab => '기본 검색 탭'; - - @override - String get optionsDefaultSearchTabSubtitle => '새 검색 결과를 표시할 탭을 먼저 선택하세요'; - - @override - String get optionsAutoFallback => '자동 대체'; - - @override - String get optionsAutoFallbackSubtitle => '다운로드가 실패한 경우에 다른 서비스를 이용해 보세요'; - - @override - String get optionsEmbedLyrics => '가사 삽입'; - - @override - String get optionsEmbedLyricsSubtitle => '다운로드한 트랙과 함께 동기화된 가사를 저장합니다'; - - @override - String get optionsMaxQualityCover => '고품질 표지 이미지'; - - @override - String get optionsMaxQualityCoverSubtitle => '최고 해상도의 표지 이미지를 다운로드'; - - @override - String get optionsReplayGain => '리플레이게인'; - - @override - String get optionsReplayGainSubtitleOn => '음량 스캔 및 리플레이게인 태그 삽입 (EBU R128)'; - - @override - String get optionsReplayGainSubtitleOff => '비활성화됨: 음량 정규화 태그 없음'; - - @override - String get trackReplayGain => '리플레이게인 다시 스캔'; - - @override - String get trackReplayGainScanning => '음량을 분석하는 중...'; - - @override - String get trackReplayGainSuccess => '리플레이게인 태그가 추가됨'; - - @override - String get trackReplayGainFailed => '리플레이게인 태그 추가 실패'; - - @override - String selectionReplayGainCount(int count) { - return '리플레이게인 ($count)'; - } - - @override - String get replayGainBatchConfirmTitle => '리플레이게인 추가'; - - @override - String replayGainBatchConfirmMessage(int count) { - return '음량을 분석하고 $count 개의 트랙에 리플레이게인 태그를 추가하시겠습니까?'; - } - - @override - String get replayGainBatchAnalyzing => '리플레이게인을 분석하는 중...'; - - @override - String replayGainBatchSuccess(int success, int total) { - return '$total 개의 트랙 중 $success 개에 리플레이게인이 추가됨'; - } - - @override - String get optionsArtistTagMode => '아티스트 태그 모드'; - - @override - String get optionsArtistTagModeDescription => - '여러 아티스트를 내장 태그에 작성하는 방법을 선택하세요'; - - @override - String get optionsArtistTagModeJoined => '단일 결합 값'; - - @override - String get optionsArtistTagModeJoinedSubtitle => - '플레이어 호환성을 최대화하려면 \'아티스트 A, 아티스트 B\'와 같이 하나의 아티스트 값을 입력하세요'; - - @override - String get optionsArtistTagModeSplitVorbis => 'FLAC/Opus용 태그 분할'; - - @override - String get optionsArtistTagModeSplitVorbisSubtitle => - 'FLAC 및 Opus의 경우 아티스트당 하나의 아티스트 태그를 작성하세요. MP3 및 M4A는 병합된 상태로 유지됩니다'; - - @override - String get optionsExtensionStore => '확장 프로그램 리포'; - - @override - String get optionsExtensionStoreSubtitle => '하단바에서 리포 탭 표시'; - - @override - String get optionsCheckUpdates => '업데이트 확인'; - - @override - String get optionsCheckUpdatesSubtitle => '새 버전이 출시되면 알림'; - - @override - String get optionsUpdateChannel => '업데이트 채널'; - - @override - String get optionsUpdateChannelStable => '안정 버전만 받기'; - - @override - String get optionsUpdateChannelPreview => '베타 버전을 받기'; - - @override - String get optionsUpdateChannelWarning => '베타 버전은 불안정할 수 있습니다'; - - @override - String get optionsClearHistory => '다운로드 기록 삭제'; - - @override - String get optionsClearHistorySubtitle => '기록에서 모든 다운로드한 트랙을 제거합니다'; - - @override - String get optionsDetailedLogging => '상세 로깅'; - - @override - String get optionsDetailedLoggingOn => '상세한 로그가 기록되고 있습니다'; - - @override - String get optionsDetailedLoggingOff => '버그 보고서 활성화'; - - @override - String get extensionsTitle => '확장 프로그램'; - - @override - String get extensionsDisabled => '비활성화됨'; - - @override - String extensionsVersion(String version) { - return '버전 $version'; - } - - @override - String get extensionsUninstall => '제거'; - - @override - String get storeTitle => '확장 프로그램 리포'; - - @override - String get storeSearch => '확장 프로그램 검색...'; - - @override - String get storeInstall => '설치'; - - @override - String get storeInstalled => '설치됨'; - - @override - String get storeUpdate => '업데이트'; - - @override - String get aboutTitle => '정보'; - - @override - String get aboutContributors => '개발에 힘써주신 분들'; - - @override - String get aboutMobileDeveloper => '모바일 버전 개발자'; - - @override - String get aboutOriginalCreator => 'SpotiFLAC 오리지널 개발자'; - - @override - String get aboutLogoArtist => '아름다운 로고를 만들어주신 재능 있는 아티스트!'; - - @override - String get aboutTranslators => '번역에 도움주신 분들'; - - @override - String get aboutSpecialThanks => '특별히 감사드리는 분들'; - - @override - String get aboutLinks => '링크'; - - @override - String get aboutMobileSource => '모바일 소스 코드'; - - @override - String get aboutPCSource => 'PC 소스 코드'; - - @override - String get aboutKeepAndroidOpen => 'Keep Android Open'; - - @override - String get aboutReportIssue => '문제 신고'; - - @override - String get aboutReportIssueSubtitle => '발생하는 모든 문제를 신고해 주세요'; - - @override - String get aboutFeatureRequest => '기능 요청'; - - @override - String get aboutFeatureRequestSubtitle => '앱의 새 기능을 제안해 주세요'; - - @override - String get aboutTelegramChannel => '텔레그램 채널'; - - @override - String get aboutTelegramChannelSubtitle => '공지 및 업데이트 안내'; - - @override - String get aboutTelegramChat => '텔레그램 커뮤니티'; - - @override - String get aboutTelegramChatSubtitle => '다른 이용자와 소통'; - - @override - String get aboutSocial => '소셜 네트워크'; - - @override - String get aboutApp => '앱 정보'; - - @override - String get aboutVersion => '버전'; - - @override - String get aboutBinimumDesc => - 'QQDL 및 HiFi API 개발자입니다. 이 프로젝트는 무손실 다운로드 지원을 형성하는 데 도움을 주셨습니다'; - - @override - String get aboutSachinsenalDesc => - 'HiFi 프로젝트의 원작자이자, 무손실 음원 소스 연동 기능의 토대를 구축한 개발자입니다'; - - @override - String get aboutSjdonadoDesc => - 'I Don\'t Have Spotify(IDHS) 개발자입니다. 위급 상황 발생 시 해결해 주는 대체 링크 해결 도구를 만들었습니다!'; - - @override - String get aboutAppDescription => - '음악 메타데이터를 검색하고, 확장 프로그램을 관리하고, 라이브러리를 정리하세요'; - - @override - String get artistAlbums => '앨범'; - - @override - String get artistSingles => '싱글 및 EP'; - - @override - String get artistCompilations => '컴필레이션'; - - @override - String get artistPopular => '인기'; - - @override - String artistMonthlyListeners(String count) { - return '월별 청취자: $count'; - } - - @override - String get trackMetadataService => '제공자'; - - @override - String get trackMetadataPlay => '재생'; - - @override - String get trackMetadataShare => '공유'; - - @override - String get trackMetadataDelete => '삭제'; - - @override - String get setupGrantPermission => '권한을 부여해 주세요'; - - @override - String get setupSkip => '다음에 할래요'; - - @override - String get setupStorageAccessRequired => '저장소 접근 권한 필요'; - - @override - String get setupStorageAccessMessageAndroid11 => - 'Android 11 이상 버전에서는 선택한 다운로드 폴더에 파일을 저장하려면 \'모든 파일 접근\' 권한이 필요합니다'; - - @override - String get setupOpenSettings => '설정 열기'; - - @override - String get setupPermissionDeniedMessage => - '권한이 거부되었습니다. 계속하려면 모든 권한을 허용해 주세요'; - - @override - String setupPermissionRequired(String permissionType) { - return '\'\'$permissionType\'\' 권한 필요'; - } - - @override - String setupPermissionRequiredMessage(String permissionType) { - return '최상의 사용 경험을 위해 \'\'$permissionType\'\' 권한이 필요합니다. 설정에서 나중에 변경할 수 있습니다'; - } - - @override - String get setupUseDefaultFolder => '기본 폴더를 사용하시겠습니까?'; - - @override - String get setupNoFolderSelected => '선택된 폴더가 없습니다. 기본 음악 폴더를 사용하시겠습니까?'; - - @override - String get setupUseDefault => '기본값 사용'; - - @override - String get setupDownloadLocationTitle => '다운로드 경로'; - - @override - String get setupDownloadLocationIosMessage => - 'iOS에서는 다운로드한 파일이 앱의 문서 폴더에 저장됩니다. 파일 앱을 통해 해당 파일에 접근할 수 있습니다'; - - @override - String get setupAppDocumentsFolder => '앱 문서 폴더'; - - @override - String get setupAppDocumentsFolderSubtitle => '권장 사항 - 파일 앱을 통해 접근 가능'; - - @override - String get setupChooseFromFiles => '파일 탐색기에서 선택'; - - @override - String get setupChooseFromFilesSubtitle => 'iCloud 또는 다른 위치를 선택하세요'; - - @override - String get setupIosEmptyFolderWarning => - 'iOS 제한 사항: 빈 폴더는 선택할 수 없습니다. 파일이 하나 이상 있는 폴더를 선택하세요'; - - @override - String get setupIcloudNotSupported => - 'iCloud Drive는 지원되지 않습니다. 앱의 문서 폴더를 사용해 주세요'; - - @override - String get setupDownloadInFlac => 'Spotify 음악을 FLAC 형식으로 다운로드하세요'; - - @override - String get setupStorageGranted => '저장소 접근 권한이 부여되었습니다!'; - - @override - String get setupStorageRequired => '저장소 접근 권한 필요'; - - @override - String get setupStorageDescription => - 'SpotiFLAC은 다운로드한 음악 파일을 저장하기 위해 저장소 접근 권한이 필요합니다'; - - @override - String get setupNotificationGranted => '알림 권한이 부여되었습니다!'; - - @override - String get setupNotificationEnable => '알림 활성화'; - - @override - String get setupFolderChoose => '다운로드 폴더를 선택하세요'; - - @override - String get setupFolderDescription => '다운로드한 음악 파일이 저장될 폴더를 선택하세요'; - - @override - String get setupSelectFolder => '폴더 선택'; - - @override - String get setupEnableNotifications => '알림 활성화'; - - @override - String get setupNotificationBackgroundDescription => - '알림으로 다운로드 진행 상황을 확인하세요. 앱이 백그라운드에서 실행 중일 때 다운로드 상태와 완료 여부를 확인할 수 있습니다'; - - @override - String get setupSkipForNow => '다음에 할래요'; - - @override - String get setupNext => '다음'; - - @override - String get setupGetStarted => '시작하기'; - - @override - String get setupAllowAccessToManageFiles => - '다음 화면에서 \'모든 파일 관리 권한 허용\'을 활성화해 주세요'; - - @override - String get setupLanguageTitle => '언어 선택'; - - @override - String get setupLanguageDescription => - '앱에서 사용할 언어를 선택하세요. 나중에 설정에서 변경할 수 있습니다'; - - @override - String get setupLanguageSystemDefault => '시스템 기본값'; - - @override - String get dialogCancel => '취소'; - - @override - String get dialogSave => '저장'; - - @override - String get dialogDelete => '삭제'; - - @override - String get dialogRetry => '다시 시도'; - - @override - String get dialogClear => '지우기'; - - @override - String get dialogDone => '완료'; - - @override - String get dialogImport => '불러오기'; - - @override - String get dialogDownload => '다운로드'; - - @override - String get previewPlay => '미리듣기 재생'; - - @override - String get previewStop => '미리듣기 중지'; - - @override - String get previewUnavailable => '미리듣기를 사용할 수 없음'; - - @override - String get dialogDiscard => '폐기'; - - @override - String get dialogRemove => '제거'; - - @override - String get dialogUninstall => '삭제'; - - @override - String get dialogDiscardChanges => '변경 사항 폐기'; - - @override - String get dialogUnsavedChanges => '저장되지 않은 변경 사항이 있습니다. 폐기하시겠습니까?'; - - @override - String get dialogClearAll => '모두 지우기'; - - @override - String get dialogRemoveExtension => '확장 프로그램 제거'; - - @override - String get dialogRemoveExtensionMessage => - '이 확장 프로그램을 제거하시겠습니까? 이 작업은 되돌릴 수 없습니다'; - - @override - String get dialogUninstallExtension => '확장 프로그램을 제거하시겠습니까?'; - - @override - String dialogUninstallExtensionMessage(String extensionName) { - return '\'\'$extensionName\'\'을 제거하시겠습니까?'; - } - - @override - String get dialogClearHistoryTitle => '기록 지우기'; - - @override - String get dialogClearHistoryMessage => - '모든 다운로드 기록을 지우시겠습니까? 이 작업은 되돌릴 수 없습니다'; - - @override - String get dialogDeleteSelectedTitle => '선택 항목 삭제'; - - @override - String dialogDeleteSelectedMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '기록에서 $count 개의 $_temp0을 삭제하시겠습니까?\n\n저장소에서도 파일이 삭제됩니다'; - } - - @override - String get dialogImportPlaylistTitle => '재생목록 가져오기'; - - @override - String dialogImportPlaylistMessage(int count) { - return 'CSV 파일에서 $count 개의 트랙을 찾았습니다. 다운로드 목록에 추가하시겠습니까?'; - } - - @override - String csvImportTracks(int count) { - return 'CSV 파일의 트랙: $count'; - } - - @override - String snackbarAddedToQueue(String trackName) { - return '\'\'$trackName\'\'가 다운로드 목록에 추가됨'; - } - - @override - String snackbarAddedTracksToQueue(int count) { - return '다운로드 목록에 $count 개의 트랙이 추가됨'; - } - - @override - String snackbarAlreadyDownloaded(String trackName) { - return '\'\'$trackName\'\'은 이미 다운로드되어 있음'; - } - - @override - String snackbarAlreadyInLibrary(String trackName) { - return '라이브러리에 \'\'$trackName\'\'이 이미 존재함'; - } - - @override - String get snackbarHistoryCleared => '기록 삭제됨'; - - @override - String snackbarDeletedTracks(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '$count 개의 $_temp0이 제거됨'; - } - - @override - String snackbarCannotOpenFile(String error) { - return '파일을 열 수 없음: $error'; - } - - @override - String get snackbarViewQueue => '다운로드 목록 보기'; - - @override - String snackbarUrlCopied(String platform) { - return '$platform 링크가 클립보드에 저장됨'; - } - - @override - String get snackbarFileNotFound => '파일을 찾을 수 없음'; - - @override - String get snackbarSelectExtFile => '.spotiflac-ext 파일을 선택하세요'; - - @override - String get snackbarProviderPrioritySaved => '제공자 우선순위가 저장됨'; - - @override - String get snackbarMetadataProviderSaved => '메타데이터 제공자 우선순위가 저장됨'; - - @override - String snackbarExtensionInstalled(String extensionName) { - return '\'\'$extensionName\'\'이 설치됨'; - } - - @override - String snackbarExtensionUpdated(String extensionName) { - return '\'\'$extensionName\'\'이 설치됨'; - } - - @override - String get snackbarFailedToInstall => '확장 프로그램 설치 실패'; - - @override - String get snackbarFailedToUpdate => '확장 프로그램 업데이트 실패'; - - @override - String get errorRateLimited => '사용 제한됨'; - - @override - String get errorRateLimitedMessage => '요청이 너무 많습니다. 잠시 후 다시 검색해 주세요'; - - @override - String get errorNoTracksFound => '트랙을 찾을 수 없음'; - - @override - String get searchEmptyResultSubtitle => '다른 키워드를 검색해 보세요'; - - @override - String get errorUrlNotRecognized => '링크를 인식할 수 없음'; - - @override - String get errorUrlNotRecognizedMessage => - '이 링크는 지원되지 않습니다. URL이 올바른지, 호환되는 확장 프로그램이 설치되어 있는지 확인하세요'; - - @override - String get errorUrlFetchFailed => '이 링크에서 콘텐츠를 불러오는 데 실패하였습니다. 다시 시도해 주세요'; - - @override - String errorMissingExtensionSource(String item) { - return '\'\'$item\'\'을 불러올 수 없음: 확장 소스가 누락됨'; - } - - @override - String get actionPause => '일시 중지'; - - @override - String get actionResume => '계속'; - - @override - String get actionCancel => '취소'; - - @override - String get actionSelectAll => '모두 선택'; - - @override - String get actionDeselect => '선택 해제'; - - @override - String selectionSelected(int count) { - return '$count 개 선택됨'; - } - - @override - String get selectionAllSelected => '모든 트랙 선택됨'; - - @override - String get selectionSelectToDelete => '삭제할 트랙을 선택'; - - @override - String progressFetchingMetadata(int current, int total) { - return '메타데이터를 가져오는 중... $current/$total'; - } - - @override - String get progressReadingCsv => 'CSV 파일을 읽는 중...'; - - @override - String get searchSongs => '노래'; - - @override - String get searchArtists => '아티스트'; - - @override - String get searchAlbums => '앨범'; - - @override - String get searchPlaylists => '재생목록'; - - @override - String get searchSortTitle => '결과 정렬'; - - @override - String get searchSortDefault => '기본값'; - - @override - String get searchSortTitleAZ => '제목 (오름차순)'; - - @override - String get searchSortTitleZA => '제목 (내림차순)'; - - @override - String get searchSortArtistAZ => '아티스트 (오름차순)'; - - @override - String get searchSortArtistZA => '아티스트 (내림차순)'; - - @override - String get searchSortDurationShort => '재생시간 (짧은순)'; - - @override - String get searchSortDurationLong => '재생시간 (긴순)'; - - @override - String get searchSortDateOldest => '발매일자 (오래된순)'; - - @override - String get searchSortDateNewest => '발매일자 (최신순)'; - - @override - String get tooltipPlay => '재생'; - - @override - String get filenameFormat => '파일 이름 형식'; - - @override - String get filenameShowAdvancedTags => '고급 태그 표시'; - - @override - String get filenameShowAdvancedTagsDescription => - '트랙 패딩 및 날짜 패턴에 대한 서식 있는 태그를 활성화합니다'; - - @override - String get folderOrganizationNone => '정리하지 않음'; - - @override - String get folderOrganizationByPlaylist => '재생목록별'; - - @override - String get folderOrganizationByPlaylistSubtitle => '각 재생목록별 별도 폴더'; - - @override - String get folderOrganizationByArtist => '아티스트별'; - - @override - String get folderOrganizationByAlbum => '앨범별'; - - @override - String get folderOrganizationByArtistAlbum => '아티스트/앨범'; - - @override - String get folderOrganizationDescription => '다운로드한 파일을 폴더로 정리'; - - @override - String get folderOrganizationNoneSubtitle => '다운로드 폴더의 모든 파일'; - - @override - String get folderOrganizationByArtistSubtitle => '각 아티스트별 별도 폴더'; - - @override - String get folderOrganizationByAlbumSubtitle => '각 앨범별 별도 폴더'; - - @override - String get folderOrganizationByArtistAlbumSubtitle => '아티스트 및 앨범용 중첩 폴더'; - - @override - String get updateAvailable => '업데이트 사용 가능'; - - @override - String get updateLater => '나중에'; - - @override - String get updateStartingDownload => '다운로드를 시작하는 중...'; - - @override - String get updateDownloadFailed => '다운로드 실패'; - - @override - String get updateFailedMessage => '업데이트 다운로드 실패'; - - @override - String get updateNewVersionReady => '새 버전이 준비되었습니다'; - - @override - String get updateRequiredTitle => 'Update required'; - - @override - String updateRequiredNotice(int count) { - return 'This version is $count releases behind and is no longer supported. Update to keep using the app.'; - } - - @override - String get updateCurrent => '현재 버전'; - - @override - String get updateNew => '새 버전'; - - @override - String get updateDownloading => '다운로드하는 중...'; - - @override - String get updateWhatsNew => '새 기능'; - - @override - String get updateDownloadInstall => '다운로드 & 설치'; - - @override - String get updateDontRemind => '알림 안 함'; - - @override - String get providerPriorityTitle => '제공자 우선순위'; - - @override - String get providerPriorityDescription => - '드래그하여 다운로드 제공자 순서를 변경하세요. 앱은 트랙을 다운로드할 경우에 위에서 아래로 제공자를 차례로 시도합니다'; - - @override - String get providerPriorityInfo => - '첫 ​​번째 제공자에서 트랙을 사용할 수 없는 경우에 앱은 자동으로 다음 제공자를 시도합니다'; - - @override - String get providerPriorityFallbackExtensionsDescription => - '자동 대체 중에 사용할 수 있는 설치된 다운로드 확장 프로그램을 선택하세요'; - - @override - String get providerPriorityFallbackExtensionsHint => - '다운로드 공급자 기능이 활성화된 확장 프로그램만 여기에 나열됩니다'; - - @override - String get providerExtension => '확장 프로그램'; - - @override - String get metadataProviderPriorityTitle => '메타데이터 우선순위'; - - @override - String get metadataProviderPriorityDescription => - '드래그하여 메타데이터 제공자 순서를 변경하세요. 앱은 트랙을 검색하고 메타데이터를 가져올 경우에 위에서 아래로 제공자를 시도합니다'; - - @override - String get metadataProviderPriorityInfo => - 'Deezer는 요청 횟수 제한이 없으므로 기본 앱으로 사용하는 것이 좋습니다. Spotify는 요청 횟수가 많아지면 요청 횟수를 제한할 수 있습니다'; - - @override - String get logTitle => '로그'; - - @override - String get logCopied => '로그가 클립보드에 복사됨'; - - @override - String get logSearchHint => '로그를 검색하는 중...'; - - @override - String get logFilterLevel => '레벨'; - - @override - String get logFilterSection => '필터'; - - @override - String get logShareLogs => '로그 공유'; - - @override - String get logClearLogs => '로그 삭제'; - - @override - String get logClearLogsTitle => '로그 삭제'; - - @override - String get logClearLogsMessage => '모든 로그를 삭제하시겠습니까?'; - - @override - String get logFilterBySeverity => '심각성에 따라 로그 분류'; - - @override - String get logNoLogsYet => '아직 로그 없음'; - - @override - String get logNoLogsYetSubtitle => '앱을 사용하는 동안에 로그가 여기에 표시됩니다'; - - @override - String logEntriesFiltered(int count) { - return '항목 ($count 개 필터됨)'; - } - - @override - String logEntries(int count) { - return '항목 ($count)'; - } - - @override - String get channelStable => '안정'; - - @override - String get channelPreview => '베타'; - - @override - String get sectionSearchSource => '검색 출처'; - - @override - String get sectionDownload => '다운로드'; - - @override - String get sectionPerformance => '성능'; - - @override - String get sectionApp => '앱'; - - @override - String get sectionData => '데이터'; - - @override - String get sectionDebug => '디버그'; - - @override - String get sectionService => '서비스'; - - @override - String get sectionAudioQuality => '오디오 품질'; - - @override - String get sectionFileSettings => '파일 설정'; - - @override - String get sectionLyrics => '가사'; - - @override - String get lyricsMode => '가사 설정'; - - @override - String get lyricsModeDescription => '다운로드한 파일에 가사를 저장하는 방법을 선택하세요'; - - @override - String get lyricsModeEmbed => '파일에 포함'; - - @override - String get lyricsModeEmbedSubtitle => 'FLAC 메타데이터 내에 저장됩니다'; - - @override - String get lyricsModeExternal => '외부 .lrc 파일'; - - @override - String get lyricsModeExternalSubtitle => '삼성 뮤직과 같은 플레이어용 별도 .lrc 파일'; - - @override - String get lyricsModeBoth => '둘 다'; - - @override - String get lyricsModeBothSubtitle => '.lrc 파일을 삽입하고 저장합니다'; - - @override - String get sectionColor => '색상'; - - @override - String get sectionTheme => '테마'; - - @override - String get sectionLayout => '레이아웃'; - - @override - String get sectionLanguage => '언어'; - - @override - String get appearanceLanguage => '앱 언어'; - - @override - String get settingsAppearanceSubtitle => '테마, 색상, 디스플레이'; - - @override - String get settingsDownloadSubtitle => '서비스, 음질, 대체'; - - @override - String get settingsExtensionsSubtitle => '다운로드 제공자 관리'; - - @override - String get settingsLogsSubtitle => '디버깅을 위한 앱 로그 보기'; - - @override - String get loadingSharedLink => '공유된 링크를 불러오는 중...'; - - @override - String get pressBackAgainToExit => '종료하려면 뒤로가기 버튼을 다시 탭하세요'; - - @override - String downloadAllCount(int count) { - return '모두 다운로드 ($count)'; - } - - @override - String tracksCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count 개의 트랙', - one: '1 개의 트랙', - ); - return '$_temp0'; - } - - @override - String get trackCopyFilePath => '파일 경로 복사'; - - @override - String get trackRemoveFromDevice => '기기에서 제거'; - - @override - String get trackLoadLyrics => '가사 불러오기'; - - @override - String get trackMetadata => '메타데이터'; - - @override - String get trackFileInfo => '파일 정보'; - - @override - String get trackLyrics => '가사'; - - @override - String get trackFileNotFound => '파일을 찾을 수 없음'; - - @override - String get trackOpenInDeezer => 'Deezer에서 열기'; - - @override - String get trackOpenInSpotify => 'Spotify에서 열기'; - - @override - String get trackTrackName => '트랙 이름'; - - @override - String get trackArtist => '아티스트'; - - @override - String get trackAlbumArtist => '앨범 아티스트'; - - @override - String get trackAlbum => '앨범'; - - @override - String get trackTrackNumber => '트랙 번호'; - - @override - String get trackDiscNumber => '디스크 번호'; - - @override - String get trackDuration => '재생시간'; - - @override - String get trackAudioQuality => '오디오 음질'; - - @override - String get trackReleaseDate => '발매일자'; - - @override - String get trackGenre => '장르'; - - @override - String get trackLabel => '레이블'; - - @override - String get trackCopyright => '저작권'; - - @override - String get trackDownloaded => '다운로드됨'; - - @override - String get trackCopyLyrics => '가사 복사'; - - @override - String trackLyricsSource(String source) { - return '출처: $source'; - } - - @override - String get trackLyricsNotAvailable => '이 트랙의 가사를 사용할 수 없습니다'; - - @override - String get trackLyricsNotInFile => '이 파일에서 가사를 찾을 수 없습니다'; - - @override - String get trackFetchOnlineLyrics => '온라인에서 가져오기'; - - @override - String get trackLyricsTimeout => '요청 시간이 초과되었습니다. 나중에 다시 시도하세요'; - - @override - String get trackLyricsLoadFailed => '가사 불러오기 실패'; - - @override - String get trackEmbedLyrics => '가사 삽입'; - - @override - String get trackLyricsEmbedded => '가사 삽입 성공'; - - @override - String get trackInstrumental => '반주 트랙'; - - @override - String get trackCopiedToClipboard => '클립보드에 복사됨'; - - @override - String get trackDeleteConfirmTitle => '기기에서 제거하시겠습니까?'; - - @override - String get trackDeleteConfirmMessage => - '이렇게 하면 다운로드한 파일이 영구적으로 삭제되고 기록에서 제거됩니다'; - - @override - String get dateToday => '오늘'; - - @override - String get dateYesterday => '어제'; - - @override - String dateDaysAgo(int count) { - return '$count 일 전'; - } - - @override - String dateWeeksAgo(int count) { - return '$count 주 전'; - } - - @override - String dateMonthsAgo(int count) { - return '$count 달 전'; - } - - @override - String get storeFilterAll => '모두'; - - @override - String get storeFilterMetadata => '메타데이터'; - - @override - String get storeFilterDownload => '다운로드'; - - @override - String get storeFilterUtility => '유틸리티'; - - @override - String get storeFilterLyrics => '가사'; - - @override - String get storeFilterIntegration => '연동'; - - @override - String get storeClearFilters => '필터 지우기'; - - @override - String get storeAddRepoTitle => '확장 프로그램 리포지토리 추가'; - - @override - String get storeAddRepoDescription => - '확장 프로그램을 찾아보고 설치하려면 registry.json 파일이 포함된 GitHub 리포지토리 URL을 입력하세요'; - - @override - String get storeRepoUrlLabel => '리포지토리 URL'; - - @override - String get storeRepoUrlHint => 'https://github.com/user/repo'; - - @override - String get storeAddRepoButton => '리포지토리 추가'; - - @override - String get storeChangeRepoTooltip => '리포지토리 변경'; - - @override - String get storeRepoDialogTitle => '확장 프로그램 리포지토리'; - - @override - String get storeRepoDialogCurrent => '현재 리포지토리:'; - - @override - String get storeNewRepoUrlLabel => '새 리포지토리 URL'; - - @override - String get storeLoadError => '리포지토리 불러오기 실패'; - - @override - String get storeEmptyNoExtensions => '사용 가능한 확장 프로그램이 없음'; - - @override - String get storeEmptyNoResults => '확장 프로그램을 찾을 수 없음'; - - @override - String get extensionId => 'ID'; - - @override - String get extensionError => '오류'; - - @override - String get extensionCapabilities => '기능'; - - @override - String get extensionMetadataProvider => '메타데이터 제공자'; - - @override - String get extensionDownloadProvider => '다운로드 제공자'; - - @override - String get extensionLyricsProvider => '가사 제공자'; - - @override - String get extensionUrlHandler => 'URL 핸들러'; - - @override - String get extensionQualityOptions => '음질 옵션'; - - @override - String get extensionPostProcessingHooks => '후처리 후크'; - - @override - String get extensionPermissions => '권한'; - - @override - String get extensionSettings => '설정'; - - @override - String get extensionRemoveButton => '확장 프로그램 제거'; - - @override - String get extensionUpdated => '업데이트됨'; - - @override - String get extensionMinAppVersion => '최소 앱 버전'; - - @override - String get extensionCustomTrackMatching => '사용자 정의 트랙 매칭'; - - @override - String get extensionPostProcessing => '후처리'; - - @override - String extensionHooksAvailable(int count) { - return '$count 개의 후크 사용 가능'; - } - - @override - String extensionPatternsCount(int count) { - return '$count 개의 패턴'; - } - - @override - String extensionStrategy(String strategy) { - return '전략: $strategy'; - } - - @override - String get extensionsProviderPrioritySection => '제공자 우선순위'; - - @override - String get extensionsInstalledSection => '설치된 확장 프로그램'; - - @override - String get extensionsNoExtensions => '설치된 확장 프로그램이 없음'; - - @override - String get extensionsNoExtensionsSubtitle => - '새 제공자를 추가하려면 .spotiflac-ext 파일을 설치하세요'; - - @override - String get extensionsInstallButton => '확장 프로그램 설치'; - - @override - String get extensionsInfoTip => - '확장 프로그램은 새 메타데이터와 다운로드 제공자를 추가할 수 있습니다. 신뢰할 수 있는 출처에서만 확장 프로그램을 설치하세요'; - - @override - String get extensionsInstalledSuccess => '확장 프로그램 설치 성공'; - - @override - String extensionsInstalledCount(int count) { - return '$count 개의 확장 프로그램 설치 성공'; - } - - @override - String extensionsInstallPartialSuccess(int installed, int attempted) { - return '$attempted 개의 확장 프로그램 중 $installed 개가 설치됨'; - } - - @override - String get extensionsDownloadPriority => '다운로드 우선순위'; - - @override - String get extensionsDownloadPrioritySubtitle => '다운로드 서비스 순서를 설정하세요'; - - @override - String get extensionsFallbackTitle => '대체 확장 프로그램'; - - @override - String get extensionsFallbackSubtitle => - '설치된 다운로드 확장 프로그램 중 대체 프로그램으로 사용할 항목을 선택하세요'; - - @override - String get extensionsNoDownloadProvider => '다운로드 제공자가 있는 확장 프로그램가 없음'; - - @override - String get extensionsMetadataPriority => '메타데이터 우선순위'; - - @override - String get extensionsMetadataPrioritySubtitle => '검색 & 메타데이터 출처 순서 설정'; - - @override - String get extensionsNoMetadataProvider => '메타데이터 제공자가 있는 확장 프로그램이 없음'; - - @override - String get extensionsSearchProvider => '검색 제공자'; - - @override - String get extensionsNoCustomSearch => '사용자 정의 검색이 있는 확장 프로그램이 없음'; - - @override - String get extensionsSearchProviderDescription => '트랙 검색에 사용할 서비스를 선택하세요'; - - @override - String get extensionsCustomSearch => '사용자 정의 검색'; - - @override - String get extensionsErrorLoading => '확장 프로그램 불러오기 오류'; - - @override - String get qualityFlacLossless => 'FLAC 무손실'; - - @override - String get qualityFlacLosslessSubtitle => '16-bit / 44.1kHz'; - - @override - String get qualityHiResFlac => 'Hi-Res FLAC'; - - @override - String get qualityHiResFlacSubtitle => '24-bit / 최대 96kHz'; - - @override - String get qualityHiResFlacMax => 'Hi-Res FLAC Max'; - - @override - String get qualityHiResFlacMaxSubtitle => '24-bit / 최대 192kHz'; - - @override - String get downloadLossy320 => '손실 압축 320kbps'; - - @override - String get downloadLossyFormat => '손실 압축 형식'; - - @override - String get downloadLossy320Format => '손실 압축 320kbps 형식'; - - @override - String get downloadLossy320FormatDesc => - '320kbps 손실 다운로드의 출력 형식을 선택하세요. 필요에 따라 원본 스트림이 선택한 형식으로 변환됩니다'; - - @override - String get downloadLossyMp3 => 'MP3 320kbps'; - - @override - String get downloadLossyMp3Subtitle => '최상의 호환성, 트랙당 약 10MB'; - - @override - String get downloadLossyAac => 'AAC/M4A 320kbps'; - - @override - String get downloadLossyAacSubtitle => '최상의 모바일 호환성, M4A 컨테이너'; - - @override - String get downloadLossyOpus256 => 'Opus 256kbps'; - - @override - String get downloadLossyOpus256Subtitle => '최고 음질 Opus, 트랙당 약 8MB'; - - @override - String get downloadLossyOpus128 => 'Opus 128kbps'; - - @override - String get downloadLossyOpus128Subtitle => '트랙당 최소 크기, 약 4MB'; - - @override - String get downloadAskBeforeDownload => '다운로드 전 확인'; - - @override - String get downloadDirectory => '다운로드 디렉토리'; - - @override - String get downloadSeparateSinglesFolder => '싱글 폴더 별도 다운로드'; - - @override - String get downloadAlbumFolderStructure => '앨범 폴더 구조'; - - @override - String get albumFolderStructureDescription => '앨범 폴더 구조를 선택하세요'; - - @override - String get downloadUseAlbumArtistForFolders => '폴더에 앨범 아티스트 사용'; - - @override - String get downloadUsePrimaryArtistOnly => '폴더에 기본 아티스트만 사용'; - - @override - String get downloadUsePrimaryArtistOnlyEnabled => - '폴더 이름에서 피처링 아티스트가 제거됩니다 (예: Justin Bieber, Quavo → Justin Bieber)'; - - @override - String get downloadUsePrimaryArtistOnlyDisabled => - '폴더 이름에 전체 아티스트 문자열이 사용됩니다'; - - @override - String get downloadSelectQuality => '음질 선택'; - - @override - String get downloadFrom => '다운로드 출처'; - - @override - String get appearanceAmoledDark => '아몰레드 블랙'; - - @override - String get appearanceAmoledDarkSubtitle => '순수 검정 배경화면'; - - @override - String get appearanceHeroAnimations => 'Hero animations'; - - @override - String get appearanceHeroAnimationsSubtitle => - 'Fly covers between screens, e.g. when opening the player'; - - @override - String get queueClearAll => '모두 지우기'; - - @override - String get queueClearAllMessage => '모든 다운로드를 지우시겠습니까?'; - - @override - String get settingsAutoExportFailed => '실패한 다운로드 자동 내보내기'; - - @override - String get settingsAutoExportFailedSubtitle => '실패한 다운로드를 TXT 파일으로 자동 저장합니다'; - - @override - String get settingsDownloadNetwork => '다운로드 네트워크'; - - @override - String get settingsDownloadNetworkAny => 'WiFi + 모바일 네트워크'; - - @override - String get settingsDownloadNetworkWifiOnly => 'WiFi 전용'; - - @override - String get settingsDownloadNetworkSubtitle => - '다운로드에 사용할 네트워크를 선택하세요. Wi-Fi 전용으로 설정하면 모바일 데이터 사용 시 다운로드가 일시 중지됩니다'; - - @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 => '아티스트 / 앨범'; - - @override - String get albumFolderArtistAlbumSubtitle => '앨범/아티스트 이름/앨범 이름/'; - - @override - String get albumFolderArtistYearAlbum => '아티스트 / [연도] 앨범'; - - @override - String get albumFolderArtistYearAlbumSubtitle => '앨범/아티스트 이름/[2005] 앨범 이름/'; - - @override - String get albumFolderAlbumOnly => '앨범만'; - - @override - String get albumFolderAlbumOnlySubtitle => '앨범/앨범 이름/'; - - @override - String get albumFolderYearAlbum => '[연도] 앨범'; - - @override - String get albumFolderYearAlbumSubtitle => '앨범/[2005] 앨범 이름/'; - - @override - String get albumFolderArtistAlbumSingles => '아티스트 / 앨범 + 싱글'; - - @override - String get albumFolderArtistAlbumSinglesSubtitle => '아티스트/앨범/ 및 아티스트/싱글/'; - - @override - String get albumFolderArtistAlbumFlat => '아티스트 / 앨범 (싱글 플랫)'; - - @override - String get albumFolderArtistAlbumFlatSubtitle => '아티스트/앨범/ 및 아티스트/song.flac'; - - @override - String get downloadedAlbumDeleteSelected => '선택 항목 삭제'; - - @override - String downloadedAlbumDeleteMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '앨범에서 $count 개의 $_temp0을 삭제하시겠습니까?\n\n저장소에서도 파일이 삭제됩니다'; - } - - @override - String downloadedAlbumSelectedCount(int count) { - return '$count 개 선택됨'; - } - - @override - String get downloadedAlbumTapToSelect => '트랙을 탭하여 선택하세요'; - - @override - String downloadedAlbumDeleteCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '$count $_temp0 삭제'; - } - - @override - String get downloadedAlbumSelectToDelete => '삭제할 트랙 선택'; - - @override - String downloadedAlbumDiscHeader(int discNumber) { - return '디스크 $discNumber'; - } - - @override - String get recentTypeArtist => '아티스트'; - - @override - String get recentTypeAlbum => '앨범'; - - @override - String get recentTypeSong => '노래'; - - @override - String get recentTypePlaylist => '재생목록'; - - @override - String get recentEmpty => '최근 항목이 없음'; - - @override - String get recentShowAllDownloads => '모든 다운로드 표시'; - - @override - String recentPlaylistInfo(String name) { - return '재생목록: $name'; - } - - @override - String get discographyDownload => '디스코그래피 다운로드'; - - @override - String get discographyDownloadAll => '모두 다운로드'; - - @override - String discographyDownloadAllSubtitle(int count, int albumCount) { - return '$albumCount 개의 릴리스에서 $count 개의 트랙'; - } - - @override - String get discographyAlbumsOnly => '앨범만'; - - @override - String discographyAlbumsOnlySubtitle(int count, int albumCount) { - return '$albumCount 개의 앨범에서 $count 개의 트랙'; - } - - @override - String get discographySinglesOnly => '싱글 & EP만'; - - @override - String discographySinglesOnlySubtitle(int count, int albumCount) { - return '$albumCount 개의 싱글에서 $count 개의 트랙'; - } - - @override - String get discographySelectAlbums => '앨범 검색...'; - - @override - String get discographySelectAlbumsSubtitle => '특정 앨범 또는 싱글을 선택하세요'; - - @override - String get discographyFetchingTracks => '트랙을 가져오는 중...'; - - @override - String discographyFetchingAlbum(int current, int total) { - return '$total 개 중 $current 개를 가져오는 중...'; - } - - @override - String discographySelectedCount(int count) { - return '$count 개 선택됨'; - } - - @override - String get discographyDownloadSelected => '선택 항목 다운로드'; - - @override - String discographyAddedToQueue(int count) { - return '다운로드 목록에 $count 개의 트랙이 추가됨'; - } - - @override - String discographySkippedDownloaded(int added, int skipped) { - return '$added 개 추가됨, $skipped 개 이미 다운로드됨'; - } - - @override - String get discographyNoAlbums => '사용 가능한 앨범이 없음'; - - @override - String get discographyFailedToFetch => '일부 앨범 가져오기 실패'; - - @override - String get sectionStorageAccess => '저장소 접근'; - - @override - String get allFilesAccess => '모든 파일 접근'; - - @override - String get allFilesAccessEnabledSubtitle => '모든 폴더에 쓰기 가능'; - - @override - String get allFilesAccessDisabledSubtitle => '미디어 폴더에만 제한됨'; - - @override - String get allFilesAccessDescription => - '사용자 정의 폴더에 저장할 경우에 쓰기 오류가 발생하면 이 옵션을 활성화하세요. Android 13 이상에서는 기본적으로 특정 디렉터리에 대한 접근이 제한됩니다'; - - @override - String get allFilesAccessDeniedMessage => - '권한이 거부되었습니다. 시스템 설정에서 \'모든 파일 접근\'를 수동으로 활성화하세요'; - - @override - String get allFilesAccessDisabledMessage => - '모든 파일 접근을 비활성화하였습니다. 앱은 제한된 저장소 접근을 사용합니다'; - - @override - String get settingsLocalLibrary => '로컬 라이브러리'; - - @override - String get settingsLocalLibrarySubtitle => '음악 스캔 & 중복 감지'; - - @override - String get settingsCache => '저장소 & 캐시'; - - @override - String get settingsCacheSubtitle => '크기 보기 및 캐시된 데이터 지우기'; - - @override - String get libraryTitle => '로컬 라이브러리'; - - @override - String get libraryScanSettings => '스캔 설정'; - - @override - String get libraryEnableLocalLibrary => '로컬 라이브러리 활성화'; - - @override - String get libraryEnableLocalLibrarySubtitle => '기존 음악을 스캔하고 추적하세요'; - - @override - String get libraryFolder => '라이브러리 폴더'; - - @override - String get libraryFolderHint => '탭하여 폴더를 선택하세요'; - - @override - String get libraryShowDuplicateIndicator => '중복 표시기 표시'; - - @override - String get libraryShowDuplicateIndicatorSubtitle => '기존 트랙을 검색할 때 표시'; - - @override - String get libraryAutoScan => '자동 스캔'; - - @override - String get libraryAutoScanSubtitle => '라이브러리에서 새 파일을 자동으로 스캔합니다'; - - @override - String get libraryAutoScanOff => '끄기'; - - @override - String get libraryAutoScanOnOpen => '앱을 열 때마다'; - - @override - String get libraryAutoScanDaily => '매일'; - - @override - String get libraryAutoScanWeekly => '주간'; - - @override - String get libraryActions => '작업'; - - @override - String get libraryScan => '라이브러리 스캔'; - - @override - String get libraryScanSubtitle => '오디오 파일 스캔'; - - @override - String get libraryScanSelectFolderFirst => '먼저 폴더를 선택하세요'; - - @override - String get libraryCleanupMissingFiles => '누락된 파일 정리'; - - @override - String get libraryCleanupMissingFilesSubtitle => - '더 이상 존재하지 않는 파일에 대한 항목을 제거합니다'; - - @override - String get libraryClear => '라이브러리 정리'; - - @override - String get libraryClearSubtitle => '스캔된 모든 트랙 제거'; - - @override - String get libraryClearConfirmTitle => '라이브러리 정리'; - - @override - String get libraryClearConfirmMessage => - '이렇게 하면 라이브러리에서 스캔된 모든 트랙이 제거됩니다. 실제 음악 파일은 삭제되지 않습니다'; - - @override - String get libraryAbout => '로컬 저장소에 대한 정보'; - - @override - String get libraryAboutDescription => - '기존 음악 라이브러리를 검사하여 다운로드 시 중복 곡을 감지합니다. FLAC, ALAC, M4A, MP3, Opus, OGG, WAV, AIFF 및 APE 형식을 지원합니다. 가능한 경우 파일 태그의 메타데이터를 읽어 사용합니다'; - - @override - String libraryTracksUnit(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '$_temp0'; - } - - @override - String libraryFilesUnit(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '파일', - one: '파일', - ); - return '$_temp0'; - } - - @override - String libraryLastScanned(String time) { - return '마지막 스캔 시간: $time'; - } - - @override - String get libraryLastScannedNever => '절대 안 함'; - - @override - String get libraryScanning => '스캔하는 중...'; - - @override - String get libraryScanFinalizing => '라이브러리를 마무리하는 중...'; - - @override - String libraryScanProgress(String progress, int total) { - return '$total 개의 파일 중 $progress%'; - } - - @override - String get libraryInLibrary => 'in 라이브러리'; - - @override - String libraryRemovedMissingFiles(int count) { - return '라이브러리에서 누락된 파일 $count 개가 제거됨'; - } - - @override - String get libraryCleared => '라이브러리가 초기화됨'; - - @override - String get libraryStorageAccessRequired => '저장소 접근 권한 필요'; - - @override - String get libraryStorageAccessMessage => - 'SpotifyFLAC은 음악 라이브러리를 스캔하기 위해 저장소 접근 권한이 필요합니다. 설정에서 권한을 부여해 주세요'; - - @override - String get libraryFolderNotExist => '선택한 폴더가 존재하지 않음'; - - @override - String get librarySourceDownloaded => '다운로드됨'; - - @override - String get librarySourceLocal => '로컬'; - - @override - String get libraryFilterAll => '모두'; - - @override - String get libraryFilterDownloaded => '다운로드됨'; - - @override - String get libraryFilterLocal => '로컬'; - - @override - String get libraryFilterTitle => '필터'; - - @override - String get libraryFilterReset => '초기화'; - - @override - String get libraryFilterApply => '적용'; - - @override - String get libraryFilterSource => '출처'; - - @override - String get libraryFilterQuality => '음질'; - - @override - String get libraryFilterQualityHiRes => 'Hi-Res (24bit)'; - - @override - String get libraryFilterQualityCD => 'CD (16bit)'; - - @override - String get libraryFilterQualityLossy => '손실 압축'; - - @override - String get libraryFilterFormat => '형식'; - - @override - String get libraryFilterMetadata => '메타데이터'; - - @override - String get libraryFilterMetadataComplete => '전체 메타데이터'; - - @override - String get libraryFilterMetadataMissingAny => '메타데이터 누락'; - - @override - String get libraryFilterMetadataMissingYear => '연도 누락'; - - @override - String get libraryFilterMetadataMissingGenre => '장르 누락'; - - @override - String get libraryFilterMetadataMissingAlbumArtist => '앨범 아티스트 누락'; - - @override - String get libraryFilterSort => '정렬'; - - @override - String get libraryFilterSortLatest => '최신순'; - - @override - String get libraryFilterSortOldest => '오래된순'; - - @override - String get libraryFilterSortAlbumAsc => '앨범 (오름차순)'; - - @override - String get libraryFilterSortAlbumDesc => '앨범 (내림차순)'; - - @override - String get libraryFilterSortGenreAsc => '장르 (오름차순)'; - - @override - String get libraryFilterSortGenreDesc => '장르 (내림차순)'; - - @override - String get timeJustNow => '방금 전'; - - @override - String timeMinutesAgo(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count 분 전', - one: '1 분 전', - ); - return '$_temp0'; - } - - @override - String timeHoursAgo(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count 시간 전', - one: '1 시간 전', - ); - return '$_temp0'; - } - - @override - String get tutorialWelcomeTitle => 'SpotiFLAC에 오신 것을 환영합니다!'; - - @override - String get tutorialWelcomeDesc => - '좋아하는 음악을 무손실 음질로 다운로드하는 방법을 알아보겠습니다. 이 간단한 튜토리얼은 기본 사항을 보여줍니다'; - - @override - String get tutorialWelcomeTip1 => - 'Spotify, Deezer에서 음악을 다운로드하거나 지원되는 URL을 붙여넣으세요'; - - @override - String get tutorialWelcomeTip2 => '설치된 다운로드 확장 프로그램에서 FLAC 음질 오디오를 받으세요'; - - @override - String get tutorialWelcomeTip3 => '메타데이터, 표지 이미지 및 가사 자동 삽입'; - - @override - String get tutorialSearchTitle => '음악 찾기'; - - @override - String get tutorialSearchDesc => '다운로드하고 싶은 음악을 찾는 두 가지 쉬운 방법이 있습니다'; - - @override - String get tutorialDownloadTitle => '음악 다운로드'; - - @override - String get tutorialDownloadDesc => '음악 다운로드는 간단하고 빠릅니다. 작동 방식은 다음과 같습니다'; - - @override - String get tutorialLibraryTitle => '내 라이브러리'; - - @override - String get tutorialLibraryDesc => '다운로드한 모든 음악은 라이브러리 탭에 정리되어 있습니다'; - - @override - String get tutorialLibraryTip1 => '라이브러리 탭에서 다운로드 진행 상황과 다운로드 목록을 확인하세요'; - - @override - String get tutorialLibraryTip2 => '음악 플레이어로 재생하려면 아무 트랙이나 탭하세요'; - - @override - String get tutorialLibraryTip3 => '더 나은 탐색을 위해 리스트 보기와 그리드 보기 사이를 전환하세요'; - - @override - String get tutorialExtensionsTitle => '확장 프로그램'; - - @override - String get tutorialExtensionsDesc => '커뮤니티 확장 프로그램을 사용하여 앱의 기능을 확장하세요'; - - @override - String get tutorialExtensionsTip1 => '유용한 확장 프로그램을 찾으려면 리포 탭을 탐색하세요'; - - @override - String get tutorialExtensionsTip2 => '새 다운로드 제공자 또는 검색 출처를 추가하세요'; - - @override - String get tutorialExtensionsTip3 => '가사, 향상된 메타데이터 및 더 많은 기능을 이용하세요'; - - @override - String get tutorialSettingsTitle => '사용자 환경 맞춤 설정'; - - @override - String get tutorialSettingsDesc => '설정에서 앱을 원하는 대로 맞춤 설정하세요'; - - @override - String get tutorialSettingsTip1 => '다운로드 위치 및 폴더 구성 변경'; - - @override - String get tutorialSettingsTip2 => '기본 오디오 음질 및 형식 설정'; - - @override - String get tutorialSettingsTip3 => '앱 테마 및 디자인 사용자 정의'; - - @override - String get tutorialReadyMessage => '모든 준비가 완료되었습니다! 지금 바로 좋아하는 음악을 다운로드하세요'; - - @override - String get libraryForceFullScan => '전제 스캔 강제 실행'; - - @override - String get libraryForceFullScanSubtitle => '캐시를 무시하고 모든 파일을 다시 스캔합니다'; - - @override - String get cleanupOrphanedDownloads => '불필요한 다운로드 파일 정리'; - - @override - String get cleanupOrphanedDownloadsSubtitle => - '더 이상 존재하지 않는 파일의 기록 항목을 제거합니다'; - - @override - String cleanupOrphanedDownloadsResult(int count) { - return '기록에서 $count 개의 불필요한 항목이 제거됨'; - } - - @override - String get cleanupOrphanedDownloadsNone => '불필요한 항목이 없습니다'; - - @override - String get cacheTitle => '저장소 & 캐시'; - - @override - String get cacheSummaryTitle => '캐시 요약'; - - @override - String get cacheSummarySubtitle => '캐시를 지워도 다운로드한 음악 파일은 삭제되지 않습니다'; - - @override - String cacheEstimatedTotal(String size) { - return '예상 캐시 사용량: $size'; - } - - @override - String get cacheSectionStorage => '캐시된 데이터'; - - @override - String get cacheSectionMaintenance => '유지 관리'; - - @override - String get cacheAppDirectory => '앱 캐시 디렉토리'; - - @override - String get cacheAppDirectoryDesc => 'HTTP 응답, WebView 데이터 및 기타 임시 앱 데이터'; - - @override - String get cacheTempDirectory => '임시 디렉토리'; - - @override - String get cacheTempDirectoryDesc => '다운로드 및 오디오 변환으로 생성된 임시 파일'; - - @override - String get cacheCoverImage => '표지 이미지 캐시'; - - @override - String get cacheCoverImageDesc => '다운로드된 앨범 및 트랙 표지 이미지입니다. 볼 때 다시 다운로드됩니다'; - - @override - String get cacheLibraryCover => '라이브러리 표지 캐시'; - - @override - String get cacheLibraryCoverDesc => - '로컬 음악 파일에서 표지 이미지를 추출하였습니다. 다음 스캔 시 다시 추출합니다'; - - @override - String get libraryPlaybackNormalization => 'Volume normalization'; - - @override - String get libraryPlaybackNormalizationSubtitle => - 'Even out loudness between tracks using their ReplayGain or R128 tags, when present'; - - @override - String get cacheAudioAnalysis => 'Audio analysis cache'; - - @override - String get cacheAudioAnalysisDesc => - 'Saved spectrograms and analysis results. Will re-analyze on next open.'; - - @override - String get cacheExploreFeed => '탐색 피드 캐시'; - - @override - String get cacheExploreFeedDesc => - '탐색 탭 콘텐츠(신규 발매, 인기 콘텐츠)는 다음 방문 시 새로 고쳐집니다'; - - @override - String get cacheTrackLookup => '트랙 조회 캐시'; - - @override - String get cacheTrackLookupDesc => - 'Spotify/Deezer 트랙 ID을 조회합니다. 지우면 속도가 느려질 수 있습니다'; - - @override - String get cacheCleanupUnusedDesc => - '누락된 파일에 대한 불필요한 다운로드 기록 및 라이브러리 항목을 제거합니다'; - - @override - String get cacheNoData => '캐시된 데이터가 없음'; - - @override - String cacheSizeWithFiles(String size, int count) { - return '$count 개의 파일에 $size 사용'; - } - - @override - String cacheSizeOnly(String size) { - return '$size'; - } - - @override - String cacheEntries(int count) { - return '$count 개의 항목'; - } - - @override - String cacheClearSuccess(String target) { - return '지워짐: $target'; - } - - @override - String get cacheClearConfirmTitle => '캐시를 지우시겠습니까?'; - - @override - String cacheClearConfirmMessage(String target) { - return '\'\'$target\'\'의 캐시된 데이터를 지웁니다. 다운로드한 음악 파일은 삭제되지 않습니다'; - } - - @override - String get cacheClearAllConfirmTitle => '모든 캐시를 지우시겠습니까?'; - - @override - String get cacheClearAllConfirmMessage => - '이 페이지의 모든 캐시 카테고리가 지워집니다. 다운로드한 음악 파일은 삭제되지 않습니다'; - - @override - String get cacheClearAll => '모든 캐시 지우기'; - - @override - String get cacheCleanupUnused => '사용되지 않는 데이터 정리'; - - @override - String get cacheCleanupUnusedSubtitle => '불필요한 다운로드 기록 및 누락된 라이브러리 항목을 제거합니다'; - - @override - String cacheCleanupResult(int downloadCount, int libraryCount) { - return '정리 완료: $downloadCount 개의 사용되지 않는 다운로드, $libraryCount 개의 누락된 라이브러리 항목'; - } - - @override - String get cacheRefreshStats => '통계 새로고침'; - - @override - String get trackSaveCoverArt => '표지 이미지 저장'; - - @override - String get trackSaveLyrics => '가사 (.lrc) 저장'; - - @override - String get trackSaveLyricsProgress => '가사를 저장하는 중...'; - - @override - String get trackReEnrich => '보강'; - - @override - String get trackReEnrichOnlineSubtitle => '온라인에서 메타데이터를 검색하고 파일에 삽입'; - - @override - String get trackReEnrichFieldCover => '표지 이미지'; - - @override - String get trackReEnrichFieldLyrics => '가사'; - - @override - String get trackReEnrichFieldBasicTags => '앨범, 앨범 아티스트'; - - @override - String get trackReEnrichFieldTrackInfo => '트랙 & 디스크 번호'; - - @override - String get trackReEnrichFieldReleaseInfo => '데이터 & ISRC'; - - @override - String get trackReEnrichFieldExtra => '장르, 레이블, 저작권'; - - @override - String get trackReEnrichSelectAll => '모두 선택'; - - @override - String get trackEditMetadata => '메타데이터 편집'; - - @override - String trackCoverSaved(String fileName) { - return '표지 이미지가 \'\'$fileName\'\'에 저장됨'; - } - - @override - String get trackCoverNoSource => '사용할 수 있는 표지 출처가 없음'; - - @override - String trackLyricsSaved(String fileName) { - return '가사가 \'\'$fileName\'\'에 저장됨'; - } - - @override - String get trackReEnrichProgress => '메타데이터를 다시 구성하는 중...'; - - @override - String get trackReEnrichSearching => '온라인에서 메타데이터를 검색하는 중...'; - - @override - String get trackReEnrichSuccess => '메타데이터 재구성 성공'; - - @override - String get trackReEnrichFfmpegFailed => 'FFmpeg 메타데이터 삽입 실패'; - - @override - String get queueFlacAction => 'FLAC 다운로드 목록'; - - @override - String queueFlacConfirmMessage(int count) { - return '선택한 트랙에 대한 온라인 일치 항목을 검색하고 FLAC을 다운로드 목록에 추가합니다\n\n기존 파일은 수정되거나 삭제되지 않습니다\n\n신뢰도가 높은 일치 항목만 자동으로 대기열에 추가됩니다\n\n$count 개가 선택되었습니다'; - } - - @override - String get queueFlacNoReliableMatches => - '선택한 항목에 대한 신뢰할 수 있는 온라인 일치 항목을 찾을 수 없음'; - - @override - String queueFlacQueuedWithSkipped(int addedCount, int skippedCount) { - return '다운로드 목록에 $addedCount 개의 트랙을 추가하고, $skippedCount 개의 트랙을 건너뜀'; - } - - @override - String trackSaveFailed(String error) { - return '실패: $error'; - } - - @override - String get trackConvertFormat => '형식 변환'; - - @override - String get trackConvertTitle => '오디오 변환'; - - @override - String get trackConvertTargetFormat => '변경될 형식'; - - @override - String get trackConvertBitrate => '비트레이트'; - - @override - String get trackConvertKeepOriginal => 'Keep original file'; - - @override - String get trackConvertKeepOriginalDescription => - 'Add the converted file as a separate library entry'; - - @override - String get trackConvertConfirmTitle => '변환 확인'; - - @override - String trackConvertConfirmMessage( - String sourceFormat, - String targetFormat, - String bitrate, - ) { - return '$bitrate 비트레이트로 $sourceFormat에서 $targetFormat으로 변환하시겠습니까?\n\n변환 후 원본 파일이 삭제됩니다'; - } - - @override - String trackConvertConfirmMessageLossless( - String sourceFormat, - String targetFormat, - ) { - return '$sourceFormat에서 $targetFormat으로 변환하시겠습니까? (무손실 — 음질 손실 없음)\n\n변환 후에 원본 파일이 삭제됩니다'; - } - - @override - String trackConvertConfirmKeepOriginal( - String sourceFormat, - String targetFormat, - ) { - return 'Convert from $sourceFormat to $targetFormat?\n\nThe original file will be kept and the converted file will be added as a separate library entry.'; - } - - @override - String get trackConvertLosslessHint => '무손실 변환 — 음질 손실 없음'; - - @override - String get trackConvertConverting => '오디오를 변환하는 중...'; - - @override - String trackConvertSuccess(String format) { - return '$format으로 변환 성공'; - } - - @override - String get trackConvertFailed => '변환 실패'; - - @override - String get cueSplitTitle => 'CUE 시트 분할'; - - @override - String cueSplitAlbum(String album) { - return '앨범: $album'; - } - - @override - String cueSplitArtist(String artist) { - return '아티스트: $artist'; - } - - @override - String cueSplitTrackCount(int count) { - return '$count 개의 트랙'; - } - - @override - String get cueSplitConfirmTitle => 'CUE 앨범 분할'; - - @override - String cueSplitConfirmMessage(String album, int count) { - return '\'\'$album\'\'을 $count 개의 개별 FLAC 파일로 분할하시겠습니까?\n\n파일은 동일한 디렉토리에 저장됩니다'; - } - - @override - String cueSplitSplitting(int current, int total) { - return 'CUE 시트를 분할하는 중... ($current/$total)'; - } - - @override - String cueSplitSuccess(int count) { - return '$count 개의 트랙 분할 성공'; - } - - @override - String get cueSplitFailed => 'CUE 분할 실패'; - - @override - String get cueSplitNoAudioFile => '이 CUE 시트에 대한 오디오 파일을 찾을 수 없습니다'; - - @override - String get cueSplitButton => '트랙으로 분할'; - - @override - String get actionCreate => '생성'; - - @override - String get collectionFoldersTitle => '내 폴더'; - - @override - String get collectionWishlist => '위시리스트'; - - @override - String get collectionLoved => '좋아요 표시한 트랙'; - - @override - String get collectionFavoriteArtists => '좋아하는 아티스트'; - - @override - String get collectionPlaylist => '재생목록'; - - @override - String get collectionAddToPlaylist => '재생목록에 추가'; - - @override - String get collectionCreatePlaylist => '재생목록 생성'; - - @override - String get collectionNoPlaylistsYet => '아직 재생목록이 없음'; - - @override - String collectionPlaylistTracks(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count 개의 트랙', - one: '1 개의 트랙', - ); - return '$_temp0'; - } - - @override - String collectionArtistCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count 명의 아티스트', - one: '1 명의 아티스트', - ); - return '$_temp0'; - } - - @override - String collectionAddedToPlaylist(String playlistName) { - return '\'\'$playlistName\'\'에 추가됨'; - } - - @override - String collectionAlreadyInPlaylist(String playlistName) { - return '이미 \'\'$playlistName\'\'에 있음'; - } - - @override - String get collectionPlaylistNameHint => '재생목록 이름'; - - @override - String get collectionPlaylistNameRequired => '재생목록 이름은 필수입니다'; - - @override - String get collectionRenamePlaylist => '재생목록 이름 변경'; - - @override - String get collectionDeletePlaylist => '재생목록 삭제'; - - @override - String get collectionPlaylistRenamed => '재생목록 이름 변경 완료'; - - @override - String get collectionWishlistEmptyTitle => '위시리스트가 비어 있음'; - - @override - String get collectionWishlistEmptySubtitle => - '나중에 다운로드할 트랙을 저장하려면 트랙에서 +를 탭하세요'; - - @override - String get collectionLovedEmptyTitle => '\'좋아요 표시한 트랙\' 폴더가 비어 있음'; - - @override - String get collectionLovedEmptySubtitle => '트랙에 하트를 탭하여 \'좋아요\'를 유지하세요'; - - @override - String get collectionFavoriteArtistsEmptyTitle => '아직 좋아하는 아티스트가 없음'; - - @override - String get collectionFavoriteArtistsEmptySubtitle => - '아티스트 페이지에서 하트를 탭하여 여기에 추가하세요'; - - @override - String get collectionPlaylistEmptyTitle => '재생목록이 비어 있음'; - - @override - String get collectionPlaylistEmptySubtitle => '아무 트랙에서 +를 길게 탭하여 여기에 추가하세요'; - - @override - String get collectionRemoveFromPlaylist => '재생목록에서 제거'; - - @override - String get collectionRemoveFromFolder => '폴더에서 제거'; - - @override - String collectionAddedToLoved(String trackName) { - return '\'\'$trackName\'\'이 \'좋아요 표시한 트랙\'에 추가됨'; - } - - @override - String collectionRemovedFromLoved(String trackName) { - return '\'\'$trackName\'\'이 \'좋아요 표시한 트랙\'에서 제거됨'; - } - - @override - String collectionAddedToWishlist(String trackName) { - return '\'\'$trackName\'\'가 위시리스트에 추가됨'; - } - - @override - String collectionRemovedFromWishlist(String trackName) { - return '\'\'$trackName\'\'가 위시리스트에서 제거됨'; - } - - @override - String collectionAddedToFavoriteArtists(String artistName) { - return '\'\'$artistName\'\'가 좋아하는 아티스트에 추가됨'; - } - - @override - String collectionRemovedFromFavoriteArtists(String artistName) { - return '\'\'$artistName\'\'가 좋아하는 아티스트에서 제거됨'; - } - - @override - String get trackOptionAddToLoved => '좋아요 표시한 트랙에 추가'; - - @override - String get trackOptionRemoveFromLoved => '좋아요 표시한 트랙에서 제거'; - - @override - String get trackOptionAddToWishlist => '위시리스트에 추가'; - - @override - String get trackOptionRemoveFromWishlist => '위시리스트에서 제거'; - - @override - String get artistOptionAddToFavorites => '즐겨찾는 아티스트에 추가'; - - @override - String get artistOptionRemoveFromFavorites => '즐겨찾는 아티스트에서 제거'; - - @override - String get collectionPlaylistChangeCover => '표지 이미지 변경'; - - @override - String get collectionPlaylistRemoveCover => '표지 이미지 제거'; - - @override - String selectionShareCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '$count $_temp0 공유'; - } - - @override - String get selectionShareNoFiles => '공유할 수 있는 파일을 찾을 수 없음'; - - @override - String selectionConvertCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '$count $_temp0 변환'; - } - - @override - String get selectionConvertNoConvertible => '선택된 변환할 수 있는 트랙이 없음'; - - @override - String get selectionBatchConvertConfirmTitle => '일괄 변환'; - - @override - String selectionBatchConvertConfirmMessage( - int count, - String format, - String bitrate, - ) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '$count 개의 $_temp0을 $bitrate 비트레이트로 $format으로 변환하시겠습니까?\n\n변환 후 원본 파일이 삭제됩니다'; - } - - @override - String selectionBatchConvertConfirmMessageLossless(int count, String format) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '$count 개의 $_temp0을 $format으로 변환하시겠습니까? (무손실 — 음질 손실 없음)\n\n변환 후 원본 파일이 삭제됩니다'; - } - - @override - String selectionBatchConvertConfirmKeepOriginal(int count, String format) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Convert $count $_temp0 to $format?\n\nOriginal files will be kept and converted files will be added as separate library entries.'; - } - - @override - String selectionBatchConvertSuccess(int success, int total, String format) { - return '$total 개 중 $success 개를 $format로 변환 완료'; - } - - @override - String downloadedAlbumDownloadedCount(int count) { - return '$count 개 다운로드됨'; - } - - @override - String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - '앨범 아티스트 태그로 이름이 지정된 폴더'; - - @override - String get downloadUseAlbumArtistForFoldersTrackSubtitle => - '트랙 아티스트 태그로 이름이 지정된 폴더'; - - @override - String get lyricsProvidersTitle => '가사 제공자 우선순위'; - - @override - String get lyricsProvidersDescription => - '가사 출처를 활성화, 비활성화 및 재정렬합니다. 가사가 발견될 때까지 위에서 아래로 제공자를 시도합니다'; - - @override - String get lyricsProvidersInfoText => - '확장 프로그램 가사 제공자는 내장 가사 제공자보다 먼저 실행됩니다. 하나 이상의 제공자가 활성화되어 있어야 합니다'; - - @override - String lyricsProvidersEnabledSection(int count) { - return '활성화됨 ($count)'; - } - - @override - String lyricsProvidersDisabledSection(int count) { - return '비활성화됨 ($count)'; - } - - @override - String get lyricsProvidersAtLeastOne => '최소 한 명의 제공자가 활성화된 상태로 유지되어야 합니다'; - - @override - String get lyricsProvidersSaved => '가사 제공자 우선순위가 저장됨'; - - @override - String get lyricsProvidersDiscardContent => '저장되지 않은 변경 사항이 손실됩니다'; - - @override - String get lyricsProviderLrclibDesc => '오픈 소스 동기화 가사 데이터베이스'; - - @override - String get lyricsProviderNeteaseDesc => 'NetEase Cloud Music (아시아 노래에 적합)'; - - @override - String get lyricsProviderMusixmatchDesc => '최대 규모의 가사 데이터베이스 (다국어 지원)'; - - @override - String get lyricsProviderAppleMusicDesc => '단어별 동기화 가사 (프록시 경유)'; - - @override - String get lyricsProviderQqMusicDesc => 'QQ Music (중국 노래에 적합, 프록시 경유)'; - - @override - String get lyricsProviderLyricsPlusDesc => - '단어별 노래방 가사 (Apple/Musixmatch/Spotify/QQ, 프록시 이용)'; - - @override - String get lyricsProviderExtensionDesc => '확장 프로그램 제공자'; - - @override - String get safMigrationTitle => '저장소 업데이트 필요'; - - @override - String get safMigrationMessage1 => - 'SpotiFLAC은 이제 다운로드에 Android 저장소 접근 프레임워크(SAF)를 사용합니다. 이로써 Android 10 이상에서 \'권한 거부\' 오류가 해결됩니다'; - - @override - String get safMigrationMessage2 => '새 저장소 시스템으로 전환하려면 다운로드 폴더를 다시 선택하세요'; - - @override - String get safMigrationSuccess => '다운로드 폴더가 SAF 모드로 업데이트됨'; - - @override - String get settingsDonate => '개발 지원'; - - @override - String get settingsDonateSubtitle => '개발자에게 커피 한 잔 사주세요'; - - @override - String get settingsBackup => '백업 & 복원'; - - @override - String get settingsBackupSubtitle => '라이브러리, 기록 및 설정을 새 기기로 옮겨보세요'; - - @override - String get backupTitle => '백업 & 복원'; - - @override - String get backupExportSectionTitle => '백업 생성'; - - @override - String get backupExportSectionDescription => - '설정, 다운로드 기록, 좋아요 표시한 트랙, 위시리스트, 즐겨찾는 아티스트 및 재생목록을 하나의 파일로 저장하여 보관하거나 다른 휴대전화로 옮길 수 있습니다'; - - @override - String get backupExportButton => '백업 파일 생성'; - - @override - String get backupImportSectionTitle => '백업 복원'; - - @override - String get backupImportSectionDescription => - '데이터를 복원할 백업 파일을 선택하세요. 이 작업을 수행하면 현재 기기에 저장된 설정, 기록 및 라이브러리가 백업 파일의 내용으로 대체됩니다'; - - @override - String get backupImportButton => '백업 파일 선택'; - - @override - String get backupCreated => '백업 생성 완료'; - - @override - String get backupCreateFailed => '백업 생성 실패'; - - @override - String get backupRestoreConfirmTitle => '이 백업을 복원하시겠습니까?'; - - @override - String get backupRestoreConfirmMessage => - '현재 설정, 다운로드 기록, 좋아요 표시한 트랙, 위시리스트 및 재생목록이 백업 파일의 내용으로 대체됩니다. 이 작업은 되돌릴 수 없습니다'; - - @override - String get backupRestoreConfirmButton => '복원'; - - @override - String get backupRestored => '백업 복원 성공'; - - @override - String get backupRestoreFailed => '백업 복원 실패'; - - @override - String get backupInvalidFile => '이 파일은 유효한 SpotiFLAC 백업이 아닙니다'; - - @override - String get backupRestoreRestartHint => '모든 변경 사항을 적용하려면 앱을 다시 시작하세요'; - - @override - String get backupContentsTitle => '백업 콘텐츠'; - - @override - String get backupContentsSettings => '앱 설정'; - - @override - String backupContentsHistory(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '항목', - one: '항목', - ); - return '$count 개의 기록 $_temp0'; - } - - @override - String backupContentsLiked(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '$count 개의 좋아요 표시한 $_temp0'; - } - - @override - String backupContentsWishlist(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '$count 개의 위시리스트 $_temp0'; - } - - @override - String backupContentsPlaylists(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count 개의 재생목록', - one: '1 개의 재생목록', - ); - return '$_temp0'; - } - - @override - String backupContentsArtists(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count 명의 좋아하는 아티스트', - one: '1 명의 좋아하는 아티스트', - ); - return '$_temp0'; - } - - @override - String backupContentsExtensions(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count 개의 확장 프로그램', - one: '1 개의 확장 프로그램', - ); - return '$_temp0'; - } - - @override - String get backupIncludeSecrets => '확장 프로그램 자격 증명 포함'; - - @override - String get backupIncludeSecretsDescription => - '확장 프로그램의 토큰과 API 키가 백업 파일에 함께 저장됩니다. 백업 파일은 안전하게 보관하세요. 비활성화하면 복원 후 다시 입력해야 합니다'; - - @override - String backupExtensionsRestoreFailed(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '확장 프로그램', - one: '확장 프로그램', - ); - return '$count 개의 $_temp0을 다시 설치할 수 없습니다. 저장소에서 수동으로 설치하세요'; - } - - @override - String get tooltipLoveAll => '모두 좋아요 표시'; - - @override - String get tooltipAddToPlaylist => '재생목록에 추가'; - - @override - String snackbarRemovedTracksFromLoved(int count) { - return '\'좋아요 표시한 트랙\'에서 $count 개의 트랙이 제거됨'; - } - - @override - String snackbarAddedTracksToLoved(int count) { - return '\'좋아요 표시한 트랙\'에 $count 개의 트랙이 추가됨'; - } - - @override - String get dialogDownloadAllTitle => '모두 다운로드'; - - @override - String dialogDownloadAllMessage(int count) { - return '$count 개의 트랙을 다운로드하시겠습니까?'; - } - - @override - String get homeSkipAlreadyDownloaded => '이미 다운로드한 노래 건너뛰기'; - - @override - String get homeGoToAlbum => '앨범으로 이동'; - - @override - String get homeAlbumInfoUnavailable => '앨범 정보를 사용할 수 없음'; - - @override - String get snackbarLoadingCueSheet => 'CUE 시트를 불러오는 중...'; - - @override - String get snackbarMetadataSaved => '메타데이터 저장 성공'; - - @override - String get snackbarFailedToEmbedLyrics => '가사 삽입 실패'; - - @override - String get snackbarFailedToWriteStorage => '저장소 다시 쓰기 실패'; - - @override - String snackbarError(String error) { - return '오류: $error'; - } - - @override - String get snackbarNoActionDefined => '이 버튼에 대해 정의된 작업이 없음'; - - @override - String get noTracksFoundForAlbum => '이 앨범에서 트랙을 찾을 수 없음'; - - @override - String get downloadLocationSubtitle => '다운로드한 트랙을 저장할 위치를 선택하세요'; - - @override - String get storageModeAppFolder => '앱 폴더 (추천)'; - - @override - String get storageModeAppFolderSubtitle => '기본적으로 Music/SpotiFLAC에 저장'; - - @override - String get storageModeSaf => '사용자 정의 폴더 (SAF)'; - - @override - String get storageModeSafSubtitle => 'SD 카드를 포함한 아무 폴더나 선택하세요'; - - @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 '\'\'$artist\'\', \'\'$title\'\', \'\'$album\'\', \'\'$track\'\', \'\'$year\'\', \'\'$date\'\', \'\'$disc\'\'를 자리표시자로 사용하세요'; - } - - @override - String get downloadFilenameInsertTag => '태그를 삽입하려면 탭하세요:'; - - @override - String get downloadSeparateSinglesEnabled => '싱글과 EP를 별도의 폴더에 저장합니다'; - - @override - String get downloadSeparateSinglesDisabled => '싱글과 앨범을 같은 폴더에 저장합니다'; - - @override - String get downloadArtistNameFilters => '아티스트 이름 필터'; - - @override - String get downloadCreatePlaylistSourceFolder => '재생목록 소스 폴더'; - - @override - String get downloadCreatePlaylistSourceFolderEnabled => - '각 재생 목록에 대한 하위 폴더를 만듭니다'; - - @override - String get downloadCreatePlaylistSourceFolderDisabled => - '모든 트랙을 다운로드 폴더에 직접 저장합니다'; - - @override - String get downloadCreatePlaylistSourceFolderRedundant => '폴더 구성 설정에 의해 처리됨'; - - @override - String get downloadSongLinkRegion => 'SongLink 지역'; - - @override - String get downloadNetworkCompatibilityMode => '네트워크 호환 모드'; - - @override - String get downloadNetworkCompatibilityModeEnabled => - '이전 네트워크에 대한 레거시 TLS 설정 사용'; - - @override - String get downloadNetworkCompatibilityModeDisabled => '표준 ​​네트워크 설정 사용'; - - @override - String get downloadAllowLocalNetwork => '로컬 네트워크 접근 허용'; - - @override - String get downloadAllowLocalNetworkEnabled => - '로컬/사설 주소에 대한 요청이 허용됨 (로컬 프록시 또는 사용자 지정 DNS용)'; - - @override - String get downloadAllowLocalNetworkDisabled => '보안을 위해 로컬/사설 주소가 차단됨'; - - @override - String get downloadSelectServiceToEnable => - '이 옵션을 활성화하려면 음질 옵션이 있는 공급자를 선택하세요'; - - @override - String get downloadEmbedLyricsDisabled => '먼저 메타데이터 삽입을 활성화하세요'; - - @override - String get downloadNeteaseIncludeTranslation => 'Netease: 번역 포함'; - - @override - String get downloadNeteaseIncludeTranslationEnabled => '중국어 번역 포함'; - - @override - String get downloadNeteaseIncludeTranslationDisabled => '원본 가사만'; - - @override - String get downloadNeteaseIncludeRomanization => 'Netease: 로마자 표기 포함'; - - @override - String get downloadNeteaseIncludeRomanizationEnabled => '로마자 표기 포함'; - - @override - String get downloadNeteaseIncludeRomanizationDisabled => '로마자 표기 없음'; - - @override - String get downloadAppleQqMultiPerson => 'Apple / QQ: 다인용 가사'; - - @override - String get downloadAppleQqMultiPersonEnabled => '듀엣 및 그룹 트랙이 포함된 스피커 레이블'; - - @override - String get downloadAppleQqMultiPersonDisabled => '스피커 레이블이 없는 표준 가사'; - - @override - String get downloadAppleElrcWordSync => 'Apple Music eLRC 단어 동기화'; - - @override - String get downloadAppleElrcWordSyncEnabled => '단어별 타임스탬프 원본 유지'; - - @override - String get downloadAppleElrcWordSyncDisabled => '더 안전한 Apple Music 가사 (줄 단위)'; - - @override - String get downloadMusixmatchLanguage => 'Musixmatch 언어'; - - @override - String get downloadMusixmatchLanguageAuto => '자동 (원본 언어)'; - - @override - String get downloadFilterContributing => '참여 아티스트 필터'; - - @override - String get downloadFilterContributingEnabled => '앨범 아티스트 폴더 이름에서 제거된 참여 아티스트'; - - @override - String get downloadFilterContributingDisabled => '전체 앨범 아티스트 문자열 사용'; - - @override - String get downloadProvidersNoneEnabled => '활성화된 제공자가 없음'; - - @override - String get downloadMusixmatchLanguageCode => '언어 코드'; - - @override - String get downloadMusixmatchLanguageHint => '예시: en, de, ja'; - - @override - String get downloadMusixmatchLanguageDesc => - 'Musixmatch에서 번역된 가사를 요청하려면 BCP-47 언어 코드를 입력하세요 (예시: en, de, ja)'; - - @override - String get downloadMusixmatchAuto => '자동'; - - @override - String get downloadNetworkAnySubtitle => 'Wi-Fi 또는 모바일 네트워크 사용'; - - @override - String get downloadNetworkWifiOnlySubtitle => '모바일 네트워크 사용 시 다운로드 일시 중지'; - - @override - String get downloadSongLinkRegionDesc => - 'SongLink를 통해 트랙 링크를 해결할 경우에 사용되는 지역입니다. 스트리밍 서비스를 이용할 수 있는 국가를 선택하세요'; - - @override - String get snackbarUnsupportedAudioFormat => '지원되지 않는 오디오 형식'; - - @override - String get cacheRefresh => '새로고침'; - - @override - String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { - String _temp0 = intl.Intl.pluralLogic( - playlistCount, - locale: localeName, - other: '재생록록', - one: '재생목록', - ); - String _temp1 = intl.Intl.pluralLogic( - trackCount, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '$playlistCount 개의 $_temp0에서 $trackCount 개의 $_temp1을 다운로드하시겠습니까?'; - } - - @override - String bulkDownloadPlaylistsButton(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '재생목록', - one: '재생목록', - ); - return '$count 개의 $_temp0 다운로드'; - } - - @override - String get bulkDownloadSelectPlaylists => '다운로드할 재생목록 선택'; - - @override - String get snackbarSelectedPlaylistsEmpty => '선택한 재생목록에 트랙이 없습니다'; - - @override - String playlistsCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count 개의 재생목록', - one: '1 개의 재생목록', - ); - return '$_temp0'; - } - - @override - String get editMetadataAutoFill => '온라인에서 자동 채우기'; - - @override - String get editMetadataAutoFillDesc => '온라인 메타데이터에서 자동으로 채워질 필드를 선택하세요'; - - @override - String get editMetadataAutoFillFetch => '가져오기 & 채우기'; - - @override - String get editMetadataAutoFillSearching => '온라인에서 검색하는 중...'; - - @override - String get editMetadataAutoFillNoResults => '온라인에서 일치하는 메타데이터를 찾을 수 없음'; - - @override - String editMetadataAutoFillDone(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '필드', - one: '필드', - ); - return '온라인 메타데이터로부터 $count 개의 $_temp0가 채워짐'; - } - - @override - String get editMetadataAutoFillNoneSelected => '자동 채우기를 위해 하나 이상의 필드를 선택하세요'; - - @override - String get editMetadataFieldTitle => '제목'; - - @override - String get editMetadataFieldArtist => '아티스트'; - - @override - String get editMetadataFieldAlbum => '앨범'; - - @override - String get editMetadataFieldAlbumArtist => '앨범 아티스트'; - - @override - String get editMetadataFieldDate => '날짜'; - - @override - String get editMetadataFieldTrackNum => '트랙 #'; - - @override - String get editMetadataFieldDiscNum => '디스크 #'; - - @override - String get editMetadataFieldGenre => '장르'; - - @override - String get editMetadataFieldIsrc => 'ISRC'; - - @override - String get editMetadataFieldLabel => '레이블'; - - @override - String get editMetadataFieldCopyright => '저작권'; - - @override - String get editMetadataFieldCover => '표지 이미지'; - - @override - String get editMetadataSelectAll => '모두'; - - @override - String get editMetadataSelectEmpty => '비어 있음만'; - - @override - String queueDownloadingCount(int count) { - return '다운로드하는 중 ($count)'; - } - - @override - String get queueFilteringIndicator => '필터링하는 중...'; - - @override - String queueTrackCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count 개의 트랙', - one: '1 개의 트랙', - ); - return '$_temp0'; - } - - @override - String queueAlbumCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count 개의 앨범', - one: '1 개의 앨범', - ); - return '$_temp0'; - } - - @override - String get queueEmptyAlbums => '앨범 다운로드가 없음'; - - @override - String get queueEmptyAlbumsSubtitle => '앨범에서 여러 트랙을 다운로드하면 여기에 표시됩니다'; - - @override - String get queueEmptySingles => '싱글 다운로드가 없음'; - - @override - String get queueEmptySinglesSubtitle => '싱글 트랙 다운로드는 여기에 표시됩니다'; - - @override - String get queueEmptyHistory => '다운로드 기록이 없음'; - - @override - String get queueEmptyHistorySubtitle => '다운로드한 트랙이 여기에 표시됩니다'; - - @override - String get selectionAllPlaylistsSelected => '모든 재생목록이 선택됨'; - - @override - String get selectionTapPlaylistsToSelect => '선택할 재생목록을 탭하세요'; - - @override - String get selectionSelectPlaylistsToDelete => '삭제할 재생 목록 선택'; - - @override - String get audioAnalysisTitle => '오디오 음질 분석'; - - @override - String get audioAnalysisDescription => '스펙트럼 분석으로 무손실 음질을 확인합니다'; - - @override - String get audioAnalysisAnalyzing => '오디오를 분석하는 중...'; - - @override - String get audioAnalysisSampleRate => '샘플링 레이트'; - - @override - String get audioAnalysisCodec => '코덱'; - - @override - String get audioAnalysisContainer => '컨테이너'; - - @override - String get audioAnalysisDecodedFormat => '디코딩 형식'; - - @override - String get audioAnalysisBitDepth => '비트 심도'; - - @override - String get audioAnalysisChannels => '채널'; - - @override - String get audioAnalysisDuration => '재생시간'; - - @override - String get audioAnalysisNyquist => '나이퀴스트'; - - @override - String get audioAnalysisFileSize => '크기'; - - @override - String get audioAnalysisDynamicRange => '다이나믹 레인지'; - - @override - String get audioAnalysisPeak => '최대 피크'; - - @override - String get audioAnalysisRms => 'RMS'; - - @override - String get audioAnalysisLufs => 'LUFS'; - - @override - String get audioAnalysisTruePeak => '트루 피크'; - - @override - String get audioAnalysisClipping => '클리핑'; - - @override - String get audioAnalysisNoClipping => '클리핑 없음'; - - @override - String get audioAnalysisSpectralCutoff => '주파수 컷오프'; - - @override - String get audioAnalysisChannelStats => '채널별 통계'; - - @override - String get audioAnalysisSamples => '샘플'; - - @override - String get audioAnalysisRescan => '다시 분석'; - - @override - String get audioAnalysisRescanning => '오디오를 다시 분석하는 중...'; - - @override - String get extensionsHomeFeedProvider => '홈 피드 제공자'; - - @override - String get extensionsHomeFeedDescription => - '메인 화면에 홈 피드를 제공하는 확장 프로그램을 선택하세요'; - - @override - String get extensionsHomeFeedAuto => '자동'; - - @override - String get extensionsHomeFeedAutoSubtitle => '사용 가능한 최적의 항목을 자동으로 선택합니다'; - - @override - String get extensionsHomeFeedOff => '끄기'; - - @override - String get extensionsHomeFeedOffSubtitle => '메인 화면에 홈 피드를 표시하지 않습니다'; - - @override - String extensionsHomeFeedUse(String extensionName) { - return '$extensionName 홈 피드 사용'; - } - - @override - String get extensionsNoHomeFeedExtensions => '홈 피드가 있는 확장 프로그램가 없음'; - - @override - String get cancelDownloadTitle => '다운로드를 취소하시겠습니까?'; - - @override - String cancelDownloadContent(String trackName) { - return '\'\'$trackName\'\'에 대한 활성 다운로드를 취소합니다'; - } - - @override - String get cancelDownloadKeep => '유지'; - - @override - String get metadataSaveFailedFfmpeg => 'FFmpeg를 통해 메타데이터 저장 실패'; - - @override - String get metadataSaveFailedStorage => '저장소에 메타데이터 다시 쓰기 실패'; - - @override - String snackbarFolderPickerFailed(String error) { - return '폴더 선택기 열기 실패: $error'; - } - - @override - String notifDownloadingTrack(String trackName) { - return '\'\'$trackName\'\'를 다운로드하는 중'; - } - - @override - String notifFinalizingTrack(String trackName) { - return '\'\'$trackName\'\'를 마무리하는 중'; - } - - @override - String get notifEmbeddingMetadata => '메타데이터를 삽입하는 중...'; - - @override - String notifAlreadyInLibraryCount(int completed, int total) { - return '이미 라이브러리에 있음 ($completed/$total)'; - } - - @override - String get notifAlreadyInLibrary => '이미 라이브러리에 있음'; - - @override - String notifDownloadCompleteCount(int completed, int total) { - return '다운로드 완료 ($completed/$total)'; - } - - @override - String get notifDownloadComplete => '다운로드 완료'; - - @override - String notifDownloadsFinished(int completed, int failed) { - return '다운로드 완료 ($completed 개 완료, $failed 개 실패)'; - } - - @override - String get notifVerificationRequiredTitle => 'Verification required'; - - @override - String get notifVerificationRequiredBody => - 'Open the app to complete verification and resume downloads'; - - @override - String get notifAllDownloadsComplete => '모든 다운로드 완료'; - - @override - String notifTracksDownloadedSuccess(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count 개의 트랙 다운로드 성공', - one: '1 개의 트랙 다운로드 성공', - ); - return '$_temp0'; - } - - @override - String notifDownloadsFinishedBody(int completed, int failed) { - String _temp0 = intl.Intl.pluralLogic( - completed, - locale: localeName, - other: '$completed 개의 트랙 다운로드 성공', - one: '1 개의 트랙 다운로드 성공', - ); - String _temp1 = intl.Intl.pluralLogic( - failed, - locale: localeName, - other: '$failed 개 실패', - one: '1 개 실패', - ); - return '$_temp0, $_temp1'; - } - - @override - String get notifDownloadsCanceledTitle => '다운로드 취소됨'; - - @override - String notifDownloadsCanceledBody(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count 개의 다운로드가 사용자에 의해 취소됨', - one: '1 개의 다운로드가 사용자에 의해 취소됨', - ); - return '$_temp0'; - } - - @override - String get notifScanningLibrary => '로컬 라이브러리를 스캔하는 중'; - - @override - String notifLibraryScanProgressWithTotal( - int scanned, - int total, - int percentage, - ) { - return '$scanned/$total 개의 파일 • $percentage%'; - } - - @override - String notifLibraryScanProgressNoTotal(int scanned, int percentage) { - return '$scanned 게의 파일이 스캔됨 • $percentage%'; - } - - @override - String get notifLibraryScanComplete => '라이브러리 스캔 완료'; - - @override - String notifLibraryScanCompleteBody(int count) { - return '$count 개의 트랙이 색인됨'; - } - - @override - String notifLibraryScanExcluded(int count) { - return '$count 개가 제외됨'; - } - - @override - String notifLibraryScanErrors(int count) { - return '$count 개의 오류'; - } - - @override - String get notifLibraryScanFailed => '라이브러리 스캔 실패'; - - @override - String get notifLibraryScanCancelled => '라이브러리 스캔이 취소됨'; - - @override - String get notifLibraryScanStopped => '스캔이 완료되기 전에 중단되었습니다'; - - @override - String notifDownloadingUpdate(String version) { - return 'SpotiFLAC Mobile v$version을 다운로드하는 중'; - } - - @override - String notifUpdateProgress(String received, String total, int percentage) { - return '$received / $total MB • $percentage%'; - } - - @override - String get notifUpdateReady => '업데이트 준비 완료'; - - @override - String notifUpdateReadyBody(String version) { - return 'SpotiFLAC Mobile v$version 다운로드 완료. 설치하려면 탭하세요'; - } - - @override - String get notifUpdateFailed => '업데이트 실패'; - - @override - String get notifUpdateFailedBody => '업데이트를 다운로드할 수 없습니다. 나중에 다시 시도하세요'; - - @override - String get searchTracks => '트랙'; - - @override - String get homeSearchHintDefault => '지원되는 URL을 붙여넣거나 검색...'; - - @override - String homeSearchHintProvider(String providerName) { - return '$providerName으로 검색...'; - } - - @override - String get homeImportCsvTooltip => 'CSV 가져오기'; - - @override - String get homeChangeSearchProviderTooltip => '검색 제공자 변경'; - - @override - String get actionPaste => '붙여넣기'; - - @override - String get tutorialSearchHint => '붙여넣기 또는 검색...'; - - @override - String get tutorialDownloadCompletedSemantics => '다운로드 완료'; - - @override - String get tutorialDownloadInProgressSemantics => '다운로드를 진행하는 중'; - - @override - String get tutorialStartDownloadSemantics => '다운로드 시작'; - - @override - String get optionsEmbedMetadata => '메타데이터 삽입'; - - @override - String get optionsEmbedMetadataSubtitleOn => '메타데이터, 표지 이미지 및 내장 가사를 파일에 기록'; - - @override - String get optionsEmbedMetadataSubtitleOff => '비활성화됨 (고급): 모든 메타데이터 삽입 건너뛰기'; - - @override - String get trackCoverNoEmbeddedArt => '내장된 표지 이미지가 없음'; - - @override - String get trackCoverReplace => '표지 교체'; - - @override - String get trackCoverPick => '표지 선택'; - - @override - String get trackCoverClearSelected => '선택된 표지 지우기'; - - @override - String get trackCoverCurrent => '현재 표지'; - - @override - String get trackCoverSelected => '선택된 표지'; - - @override - String get trackCoverReplaceNotice => '저장을 탭하면 선택한 표지가 현재 내장된 표지를 대체합니다'; - - @override - String get actionStop => '중지'; - - @override - String get queueFinalizingDownload => '다운로드를 마무리하는 중'; - - @override - String get queueDownloadNext => 'Download next'; - - @override - String get queueDownloadedFileMissing => '다운로드한 파일이 없음'; - - @override - String get queueDownloadCompleted => '다운로드 완료'; - - @override - String get queueRateLimitTitle => '서비스 사용 제한됨'; - - @override - String get queueRateLimitMessage => - '이 트랙은 아직 사용 가능할 수 있습니다. 몇 분 기다렸다가 병렬 다운로드를 줄인 후에 다시 시도하세요'; - - @override - String appearanceSelectAccentColor(String hex) { - return '강조 색상 $hex 선택'; - } - - @override - String get logAutoScrollOn => '자동 스크롤: ON'; - - @override - String get logAutoScrollOff => '자동 스크롤: OFF'; - - @override - String get logCopyLogs => '로그 복사'; - - @override - String get logClearSearch => '로그 지우기'; - - @override - String get logIssueIspBlockingLabel => 'ISP 차단 감지됨'; - - @override - String get logIssueIspBlockingDescription => 'ISP에서 다운로드 서비스 접속을 차단했을 수 있습니다'; - - @override - String get logIssueIspBlockingSuggestion => - 'VPN을 사용하거나 DNS를 1.1.1.1 또는 8.8.8.8로 변경해 보세요'; - - @override - String get logIssueRateLimitedLabel => '사용 제한'; - - @override - String get logIssueRateLimitedDescription => '서비스에 대한 요청이 너무 많습니다'; - - @override - String get logIssueRateLimitedSuggestion => '몇 분 기다린 후에 다시 시도하세요'; - - @override - String get logIssueNetworkErrorLabel => '네트워크 오류'; - - @override - String get logIssueNetworkErrorDescription => '연결 문제가 감지됨'; - - @override - String get logIssueNetworkErrorSuggestion => '인터넷 연결 상태를 확인하세요'; - - @override - String get logIssueTrackNotFoundLabel => '트랙을 찾을 수 없음'; - - @override - String get logIssueTrackNotFoundDescription => '일부 트랙은 다운로드 서비스에서 찾을 수 없습니다'; - - @override - String get logIssueTrackNotFoundSuggestion => '트랙이 무손실 음질로 제공되지 않을 수 있습니다'; - - @override - String get clickableLookingUpArtist => '아티스트를 검색하는 중...'; - - @override - String clickableInformationUnavailable(String type) { - return '$type 정보를 사용할 수 없음'; - } - - @override - String get extensionDetailsTags => '태그'; - - @override - String get extensionDetailsInformation => '정보'; - - @override - String get extensionUtilityFunctions => '유틸리티 함수'; - - @override - String get actionDismiss => '닫기'; - - @override - String get setupChangeFolderTooltip => '폴더 변경'; - - @override - String a11yOpenTrackByArtist(String trackName, String artistName) { - return '\'\'$artistName\'\'의 트랙 \'\'$trackName\'\' 열기'; - } - - @override - String a11yOpenItem(String itemType, String name) { - return '$itemType $name 열기'; - } - - @override - String a11yOpenItemCount(String title, int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '항목', - one: '항목', - ); - return '$title, $count 개의 $_temp0 열기'; - } - - @override - String a11yOpenAlbumByArtistTrackCount( - String albumName, - String artistName, - int trackCount, - ) { - return '\'\'$artistName\'\'의 앨범 \'\'$albumName\'\' 열기 ($trackCount 번째 곡)'; - } - - @override - String a11yTrackByArtist(String trackName, String artistName) { - return '\'\'$artistName\'\'의 \'\'$trackName\'\''; - } - - @override - String a11ySelectAlbum(String albumName) { - return '앨범 \'\'$albumName\'\' 선택'; - } - - @override - String a11yOpenAlbum(String albumName) { - return '앨범 \'\'$albumName\'\' 열기'; - } - - @override - String get settingsFiles => '파일 & 폴더'; - - @override - String get settingsFilesSubtitle => '다운로드 위치, 파일 이름, 폴더 구조'; - - @override - String get settingsMetadata => '메타데이터'; - - @override - String get settingsMetadataSubtitle => '표지 이미지, 태그, 리플레이게인, 제공자'; - - @override - String get settingsLyrics => '가사'; - - @override - String get settingsLyricsSubtitle => '삽입, 모드, 제공자, 언어 옵션'; - - @override - String get settingsApp => '앱'; - - @override - String get settingsAppSubtitle => '업데이트, 데이터, 확장프로그램 리포, 디버그'; - - @override - String get sectionMetadataProviders => '제공자'; - - @override - String get sectionDuplicates => '중복'; - - @override - String get sectionLyricsProviderOptions => '제공자 옵션'; - - @override - String get metadataProvidersTitle => '메타데이터 제공자 우선순위'; - - @override - String get metadataProvidersSubtitle => '드래그하여 검색 및 메타데이터 출처 순서를 설정하세요'; - - @override - String get downloadDeduplication => '중복 다운로드 건너뛰기'; - - @override - String get downloadDeduplicationEnabled => '이미 다운로드된 트랙은 건너뜁니다'; - - @override - String get downloadDeduplicationWithQualityVariants => - 'Existing files at the selected quality will be skipped'; - - @override - String get downloadDeduplicationDisabled => '기록과 관계없이 모든 트랙이 다운로드됩니다'; - - @override - String get downloadQualityVariants => 'Allow different quality versions'; - - @override - String get downloadQualityVariantsDescription => - 'Add the selected quality to the filename and keep each version in download history'; - - @override - String get trackOptionDownloadQualityVariant => 'Download another quality'; - - @override - String get downloadFallbackExtensions => '대체 확장 프로그램'; - - @override - String get downloadFallbackExtensionsSubtitle => - '대체 확장 프로그램으로 사용할 확장 프로그램을 선택하세요'; - - @override - String get editMetadataFieldDateHint => 'YYYY-MM-DD 또는 YYYY'; - - @override - String get editMetadataFieldTrackTotal => '전체 트랙 수'; - - @override - String get editMetadataFieldDiscTotal => '전체 디스크 수'; - - @override - String get editMetadataFieldComposer => '작곡가'; - - @override - String get editMetadataFieldComment => '주석'; - - @override - String get editMetadataAdvanced => '고급'; - - @override - String get libraryFilterMetadataMissingTrackNumber => '트랙 번호 누락'; - - @override - String get libraryFilterMetadataMissingDiscNumber => '디스크 번호 누락'; - - @override - String get libraryFilterMetadataMissingArtist => '아티스트 누락'; - - @override - String get libraryFilterMetadataIncorrectIsrcFormat => '잘못된 ISRC 형식'; - - @override - String get libraryFilterMetadataMissingLabel => '레이블 누락'; - - @override - String collectionDeletePlaylistsMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '재생목록', - one: '재생목록', - ); - return '$count 개의 $_temp0을 삭제하시겠습니까?'; - } - - @override - String collectionPlaylistsDeleted(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '재생목록', - one: '재생목록', - ); - return '$count 개의 $_temp0이 삭제됨'; - } - - @override - String collectionAddedTracksToPlaylist(int count, String playlistName) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '\'\'$playlistName\'\'에 $count 개의 $_temp0이 추가됨'; - } - - @override - String collectionAddedTracksToPlaylistWithExisting( - int count, - String playlistName, - int alreadyCount, - ) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '\'\'$playlistName\'\'에 $count 개의 $_temp0이 추가됨 ($alreadyCount 개의 트랙은 이미 재생목록에 있음)'; - } - - @override - String itemCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '항목', - one: '항목', - ); - return '$count 개의 $_temp0'; - } - - @override - String trackReEnrichSuccessWithFailures( - int successCount, - int total, - int failedCount, - ) { - return '메타데이터 재구성 성공 ($successCount/$total) - 실패: $failedCount'; - } - - @override - String selectionDeleteTracksCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '$count $_temp0 삭제'; - } - - @override - String queueDownloadSpeedStatus(String speed) { - return '다운로드하는 중 - $speed MB/s'; - } - - @override - String get queueDownloadStarting => '시작하는 중...'; - - @override - String get queueCheckingDownloadSession => 'Checking download session...'; - - @override - String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; - - @override - String get queueResolvingDownloadStream => 'Preparing audio stream...'; - - @override - String get queueWaitingForVerification => 'Waiting for verification...'; - - @override - String get queueResumingAfterVerification => 'Resuming after verification...'; - - @override - String get a11ySelectTrack => '트랙 선택'; - - @override - String get a11yDeselectTrack => '트랙 선택 해제'; - - @override - String a11yPlayTrackByArtist(String trackName, String artistName) { - return '\'\'$artistName\'\'의 \'\'$trackName\'\' 재생'; - } - - @override - String storeExtensionsCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '확장 프로그램', - one: '확장 프로그램', - ); - return '$count 개의 $_temp0'; - } - - @override - String storeRequiresVersion(String version) { - return 'v$version 이상 필요'; - } - - @override - String get actionGo => '이동'; - - @override - String get logIssueSummary => '문제 요약'; - - @override - String logTotalErrors(int count) { - return '총 오류 수: $count'; - } - - @override - String logAffectedDomains(String domains) { - return '영향받은 도메인: $domains'; - } - - @override - String get libraryScanCancelled => '스캔이 취소됨'; - - @override - String get libraryScanCancelledSubtitle => '준비가 되면 스캔을 다시 시도할 수 있습니다'; - - @override - String libraryDownloadsHistoryExcluded(int count) { - return '다운로드 기록에서 $count 개 (목록에서 제외됨)'; - } - - @override - String get downloadNativeWorker => '기본 다운로드 워커'; - - @override - String get downloadNativeWorkerSubtitle => '확장 프로그램 다운로드용 Android 백그라운드 서비스'; - - @override - String get badgeBeta => '베타'; - - @override - String get extensionServiceStatus => '서비스 상태'; - - @override - String get extensionServiceHealth => '서비스 상태'; - - @override - String extensionHealthChecksConfigured(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '검사', - one: '검사', - ); - return '$count 개의 $_temp0가 설정됨'; - } - - @override - String get extensionOauthConnectHint => 'Spotify에 연결을 탭하여 이 필드를 채우세요'; - - @override - String extensionLastChecked(String time) { - return '마지막 확인 시간: $time'; - } - - @override - String get extensionRefreshStatus => '상태 새로고침'; - - @override - String get extensionCustomUrlHandling => '사용자 정의 URL 처리'; - - @override - String get extensionCustomUrlHandlingSubtitle => - '이 확장 프로그램은 다음 사이트의 링크를 처리할 수 있습니다'; - - @override - String get extensionCustomUrlHandlingShareHint => - '이 사이트의 링크를 SpotiFLAC Mobile로 공유하면 이 확장 프로그램이 처리합니다'; - - @override - String extensionSettingsCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '설정', - one: '설정', - ); - return '$count 개의 $_temp0'; - } - - @override - String get extensionHealthOnline => '온라인'; - - @override - String get extensionHealthDegraded => '저하됨'; - - @override - String get extensionHealthOffline => '오프라인'; - - @override - String get extensionHealthNotConfigured => '설정되지 않음'; - - @override - String get extensionHealthUnknown => '알 수 없음'; - - @override - String get extensionHealthRequired => '필수'; - - @override - String get extensionSettingNotSet => '설정되지 않음'; - - @override - String get extensionActionFailed => '작업 실패'; - - @override - String get extensionEnterValue => '값을 입력하세요'; - - @override - String get extensionHealthServiceOnline => '서비스 온라인'; - - @override - String get extensionHealthServiceDegraded => '서비스 저하됨'; - - @override - String get extensionHealthServiceOffline => '서비스 오프라인'; - - @override - String get extensionHealthServiceUnknown => '서비스 상태 알 수 없음'; - - @override - String get audioAnalysisStereo => '스테레오'; - - @override - String get audioAnalysisMono => '모노'; - - @override - String trackOpenInService(String serviceName) { - return '$serviceName에서 열기'; - } - - @override - String get trackLyricsEmbeddedSource => '내장'; - - @override - String get unknownAlbum => '알 수 없는 앨범'; - - @override - String get unknownArtist => '알 수 없는 아티스트'; - - @override - String get permissionAudio => '오디오'; - - @override - String get permissionStorage => '저장소'; - - @override - String get permissionNotification => '알림'; - - @override - String get errorInvalidFolderSelected => '잘못된 폴더가 선택됨'; - - @override - String get storeAnyVersion => '모든'; - - @override - String get storeCategoryMetadata => '메타데이터'; - - @override - String get storeCategoryDownload => '다운로드'; - - @override - String get storeCategoryUtility => '유틸리티'; - - @override - String get storeCategoryLyrics => '가사'; - - @override - String get storeCategoryIntegration => '연동'; - - @override - String get artistReleases => '릴리스'; - - @override - String get editMetadataSelectNone => '없음'; - - @override - String queueRetryAllFailed(int count) { - return '재시도 $count 번 실패'; - } - - @override - String get settingsSaveDownloadHistory => '다운로드 기록 저장'; - - @override - String get settingsSaveDownloadHistorySubtitle => - '완료된 다운로드를 기록 및 라이브러리 보기에 유지합니다'; - - @override - String get dialogDisableHistoryTitle => '다운로드 기록을 끄시겠습니까?'; - - @override - String get dialogDisableHistoryMessage => '기존 기록이 삭제됩니다. 다운로드한 파일은 삭제되지 않습니다'; - - @override - String get dialogDisableAndClear => '끄고 지우기'; - - @override - String get openInOtherServices => '다른 서비스에서 열기'; - - @override - String get shareSheetNoExtensions => '호환되는 다른 서비스가 없음'; - - @override - String get shareSheetNotFound => '찾을 수 없음'; - - @override - String get shareSheetCopyLink => '링크 복사'; - - @override - String shareSheetLinkCopied(Object service) { - return '$service 링크가 복사됨'; - } - - @override - String get libraryPlayback => '재생'; - - @override - String get libraryExternalPlayer => '외부 플레이어'; - - @override - String get libraryExternalPlayerSubtitle => - '감상용으로 권장됩니다. 최고 음질, 갭리스 재생, EQ 및 다양한 오디오 형식을 지원합니다'; - - @override - String get libraryBuiltInPreviewPlayer => '내장 미리듣기 플레이어'; - - @override - String get libraryBuiltInPreviewPlayerSubtitle => - 'SpotiFLAC Mobile에서 빠른 로컬 미리듣기 전용이며, 일반적인 음악 감상에는 권장되지 않습니다'; - - @override - String get libraryBuiltInPlayerInfo => - '내장 플레이어는 로컬 트랙을 빠르게 미리듣기 위한 도구입니다. 실제 음악 감상은 외부 음악 플레이어를 이용하는 것을 권장합니다'; - - @override - String get nowPlayingTitle => '현재 재생 중'; - - @override - String get nowPlayingNothingPlaying => '재생 중인 노래가 없음'; - - @override - String get nowPlayingMinimize => '최소화'; - - @override - String get nowPlayingUpNext => '다음 곡'; - - @override - String get nowPlayingDetails => '자세히'; - - @override - String get nowPlayingOpenInExternalPlayer => '외부 플레이어에서 열기'; - - @override - String get nowPlayingTabPlayer => '플레이어'; - - @override - String get nowPlayingTabLyrics => '가사'; - - @override - String get nowPlayingNoLyrics => '이 파일에는 가사가 없음'; - - @override - String get nowPlayingLibraryEmpty => '라이브러리가 비어 있음'; - - @override - String nowPlayingShuffleLibraryFailed(String error) { - return '라이브러리에서 셔플을 사용할 수 없음: $error'; - } - - @override - String get nowPlayingShuffleOn => '셔플 켜기'; - - @override - String get nowPlayingPlayInOrder => '순서대로 재생'; - - @override - String get nowPlayingShuffleLibrary => '라이브러리 셔플'; - - @override - String get nowPlayingQueueEmpty => '현재 다운로드 목록이 비어 있음'; - - @override - String get nowPlayingNoMetadata => '사용할 수 있는 메타데이터가 없음'; - - @override - String get announcementUnableToOpenLink => '링크를 열 수 없습니다. 다시 시도해 주세요'; - - @override - String trackConvertLosslessOutputWithCap(String quality) { - return '$quality 제한이 있는 무손실 출력'; - } - - @override - String trackConvertConfirmMessageLosslessCapped( - String sourceFormat, - String targetFormat, - String quality, - ) { - return '$sourceFormat에서 $targetFormat($quality)으로 변환하시겠습니까?\n\n출력은 무손실 코덱을 유지하지만 비트 심도/샘플 속도가 제한됩니다. 변환 후 원본 파일이 삭제됩니다'; - } - - @override - String selectionBatchConvertConfirmMessageLosslessCapped( - int count, - String format, - String quality, - ) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '트랙', - one: '트랙', - ); - return '$count 개의 $_temp0을 $format($quality)으로 변환하시겠습니까?\n\n출력은 무손실 코덱을 유지하지만 비트 심도/샘플 속도가 제한됩니다. 변환 후 원본 파일이 삭제됩니다'; - } - - @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 => - 'Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou 및 Genius용 가사 프록시'; - - @override - String get snackbarPlayingNext => '다음 곡 재생'; - - @override - String get snackbarAddedToQueueGeneric => '현재 다운로드 목록에 추가됨'; - - @override - String selectionDeletePlaylistsCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '재생목록', - one: '재생목록', - ); - return '$count $_temp0 삭제'; - } - - @override - String get actionShuffle => '셔플'; - - @override - String get downloadPrimaryArtistOnlyOn => '기본 아티스트만: ON'; - - @override - String get downloadPrimaryArtistOnlyOff => '기본 아티스트만: OFF'; - - @override - String get downloadAlbumArtistMetadataPrimaryOnly => '앨범 아티스트 메타데이터: 기본만'; - - @override - String get downloadAlbumArtistMetadataFull => '앨범 아티스트 메타데이터: 전체'; - - @override - String get trackConvertOriginal => '원본'; - - @override - String get trackConvertOriginalQuality => '원본 음질'; - - @override - String get trackConvertLosslessSuffix => '무손실'; - - @override - String get trackConvertDithering => '디더링'; - - @override - String get trackConvertResampler => '리샘플러'; - - @override - String get trackConvertDitherNone => '없음'; - - @override - String get trackConvertDitherTriangular => 'TPDF'; - - @override - String get trackConvertDitherTriangularHp => '삼각형 HP'; - - @override - String get trackConvertResamplerSwr => 'SWR'; - - @override - String get trackConvertResamplerSoxr => 'SoXr'; - - @override - String get updateSeeReleaseNotes => '자세한 내용은 릴리스 노트를 참조하세요'; - - @override - String get unknownTitle => '알 수 없는 제목'; - - @override - String get trackPlayNext => '다음 곡 재생'; - - @override - String get trackAddToQueue => '다운로드 목록에 추가'; - - @override - String snackbarExtensionInstalledEnable(String extensionName) { - return '\'\'$extensionName\'\'이 설치됨. \'설정 > 확장 프로그램\'에서 활성화하세요'; - } - - @override - String snackbarExtensionUpdatedVersion(String extensionName, String version) { - return '\'\'$extensionName\'\'이 v$version으로 업데이트됨'; - } - - @override - String snackbarFailedToInstallNamed(String extensionName) { - return '$extensionName 설치 실패'; - } - - @override - String snackbarFailedToUpdateNamed(String extensionName) { - return '$extensionName 업데이트 실패'; - } - - @override - String get releaseTypeEp => 'EP'; - - @override - String get releaseTypeSingle => '싱글'; - - @override - String get trackCoverOnline => '온라인 표지'; - - @override - String get regionCountryUS => '미국'; - - @override - String get regionCountryGB => '영국'; - - @override - String get regionCountryFR => '프랑스'; - - @override - String get regionCountryDE => '독일'; - - @override - String get regionCountryJP => '일본'; - - @override - String get regionCountryKR => '한국'; - - @override - String get regionCountryIN => '인도'; - - @override - String get regionCountryID => '인도네시아'; - - @override - String get regionCountryBR => '브라질'; - - @override - String get regionCountryMX => '멕시코'; - - @override - String get regionCountryAU => '호주'; - - @override - String get regionCountryCA => '캐나다'; - - @override - String get regionCountryXK => '코소보'; - - @override - String get extensionVerificationBrowserTitle => '인증 브라우저'; - - @override - String get extensionVerificationBrowserSubtitleExternal => - '인증을 기본 브라우저에서 먼저 실행합니다'; - - @override - String get extensionVerificationBrowserSubtitleInApp => - '인증을 앱 내 브라우저에서 먼저 실행합니다'; - - @override - String get extensionVerificationBrowserExternal => '외부'; - - @override - String get extensionVerificationBrowserInApp => '내부'; - - @override - String get extensionVerificationHelpTitleManual => '수동으로 인증 열기'; - - @override - String get extensionVerificationHelpTitleWaiting => '아직 인증을 기다리는 중'; - - @override - String get extensionVerificationHelpMessageManual => - 'SpotiFLAC Mobile에서 브라우저를 자동으로 열지 못하였습니다. 아래 링크를 브라우저에서 열거나 직접 복사하세요'; - - @override - String get extensionVerificationHelpMessageWaiting => - '브라우저가 열리지 않았거나 인증을 완료한 후에도 SpotiFLAC Mobile로 돌아오지 않았다면, 아래 링크를 다시 열거나 직접 복사하세요'; - - @override - String get extensionVerificationClose => '닫기'; - - @override - String get extensionVerificationCopyLink => '링크 복사'; - - @override - String get extensionVerificationLinkCopied => '인증 링크가 복사됨'; - - @override - String get extensionVerificationOpenBrowser => '브라우저 열기'; -} diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart deleted file mode 100644 index 6426b901..00000000 --- a/lib/l10n/app_localizations_nl.dart +++ /dev/null @@ -1,4659 +0,0 @@ -// ignore: unused_import -import 'package:intl/intl.dart' as intl; -import 'app_localizations.dart'; - -// ignore_for_file: type=lint - -/// The translations for Dutch Flemish (`nl`). -class AppLocalizationsNl extends AppLocalizations { - AppLocalizationsNl([String locale = 'nl']) : super(locale); - - @override - String get appName => 'SpotiFLAC Mobile'; - - @override - String get navHome => 'Home'; - - @override - String get navLibrary => 'Library'; - - @override - String get navSettings => 'Settings'; - - @override - String get navStore => 'Repo'; - - @override - String get homeTitle => 'Home'; - - @override - String get homeSubtitle => 'Paste a supported URL or search by name'; - - @override - String get homeEmptyTitle => 'No search providers yet'; - - @override - String get homeEmptySubtitle => 'Install an extension to continue.'; - - @override - String get homeSupports => 'Supports: Track, Album, Playlist, Artist URLs'; - - @override - String get homeRecent => 'Recent'; - - @override - String get historyFilterAll => 'All'; - - @override - String get historyFilterAlbums => 'Albums'; - - @override - String get historyFilterSingles => 'Singles'; - - @override - String get historySearchHint => 'Search history...'; - - @override - String get settingsTitle => 'Settings'; - - @override - String get settingsDownload => 'Download'; - - @override - String get settingsAppearance => 'Appearance'; - - @override - String get settingsExtensions => 'Extensions'; - - @override - String get settingsAbout => 'About'; - - @override - String get downloadTitle => 'Download'; - - @override - String get downloadAskQualitySubtitle => - 'Show quality picker for each download'; - - @override - String get downloadFilenameFormat => 'Filename Format'; - - @override - String get downloadSingleFilenameFormat => 'Single Filename Format'; - - @override - String get downloadSingleFilenameFormatDescription => - 'Filename pattern for singles and EPs. Uses the same tags as the album format.'; - - @override - String get downloadFolderOrganization => 'Folder Organization'; - - @override - String get appearanceTitle => 'Appearance'; - - @override - String get appearanceThemeSystem => 'System'; - - @override - String get appearanceThemeLight => 'Light'; - - @override - String get appearanceThemeDark => 'Dark'; - - @override - String get appearanceDynamicColor => 'Dynamic Color'; - - @override - String get appearanceDynamicColorSubtitle => 'Use colors from your wallpaper'; - - @override - String get appearanceHistoryView => 'History View'; - - @override - String get appearanceHistoryViewList => 'List'; - - @override - String get appearanceHistoryViewGrid => 'Grid'; - - @override - String get optionsPrimaryProvider => 'Primary Provider'; - - @override - String get optionsPrimaryProviderSubtitle => - 'Service used for searching by track or album name'; - - @override - String optionsUsingExtension(String extensionName) { - return 'Using extension: $extensionName'; - } - - @override - String get optionsDefaultSearchTab => 'Default Search Tab'; - - @override - String get optionsDefaultSearchTabSubtitle => - 'Choose which tab opens first for new search results.'; - - @override - String get optionsAutoFallback => 'Auto Fallback'; - - @override - String get optionsAutoFallbackSubtitle => - 'Try other services if download fails'; - - @override - String get optionsEmbedLyrics => 'Embed Lyrics'; - - @override - String get optionsEmbedLyricsSubtitle => - 'Save synced lyrics alongside your downloaded tracks'; - - @override - String get optionsMaxQualityCover => 'Max Quality Cover'; - - @override - String get optionsMaxQualityCoverSubtitle => - 'Download highest resolution cover art'; - - @override - String get optionsReplayGain => 'ReplayGain'; - - @override - String get optionsReplayGainSubtitleOn => - 'Scan loudness and embed ReplayGain tags (EBU R128)'; - - @override - String get optionsReplayGainSubtitleOff => - 'Disabled: no loudness normalization tags'; - - @override - String get trackReplayGain => 'Rescan ReplayGain'; - - @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 => 'Artist Tag Mode'; - - @override - String get optionsArtistTagModeDescription => - 'Choose how multiple artists are written into embedded tags.'; - - @override - String get optionsArtistTagModeJoined => 'Single joined value'; - - @override - String get optionsArtistTagModeJoinedSubtitle => - 'Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.'; - - @override - String get optionsArtistTagModeSplitVorbis => 'Split tags for FLAC/Opus'; - - @override - String get optionsArtistTagModeSplitVorbisSubtitle => - 'Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.'; - - @override - String get optionsExtensionStore => 'Extension Repo'; - - @override - String get optionsExtensionStoreSubtitle => 'Show Repo tab in navigation'; - - @override - String get optionsCheckUpdates => 'Check for Updates'; - - @override - String get optionsCheckUpdatesSubtitle => - 'Notify when new version is available'; - - @override - String get optionsUpdateChannel => 'Update Channel'; - - @override - String get optionsUpdateChannelStable => 'Stable releases only'; - - @override - String get optionsUpdateChannelPreview => 'Get preview releases'; - - @override - String get optionsUpdateChannelWarning => - 'Preview may contain bugs or incomplete features'; - - @override - String get optionsClearHistory => 'Clear Download History'; - - @override - String get optionsClearHistorySubtitle => - 'Remove all downloaded tracks from history'; - - @override - String get optionsDetailedLogging => 'Detailed Logging'; - - @override - String get optionsDetailedLoggingOn => 'Detailed logs are being recorded'; - - @override - String get optionsDetailedLoggingOff => 'Enable for bug reports'; - - @override - String get extensionsTitle => 'Extensions'; - - @override - String get extensionsDisabled => 'Disabled'; - - @override - String extensionsVersion(String version) { - return 'Version $version'; - } - - @override - String get extensionsUninstall => 'Uninstall'; - - @override - String get storeTitle => 'Extension Repo'; - - @override - String get storeSearch => 'Search extensions...'; - - @override - String get storeInstall => 'Install'; - - @override - String get storeInstalled => 'Installed'; - - @override - String get storeUpdate => 'Update'; - - @override - String get aboutTitle => 'About'; - - @override - String get aboutContributors => 'Contributors'; - - @override - String get aboutMobileDeveloper => 'Mobile version developer'; - - @override - String get aboutOriginalCreator => 'Creator of the original SpotiFLAC'; - - @override - String get aboutLogoArtist => - 'The talented artist who created our beautiful app logo!'; - - @override - String get aboutTranslators => 'Translators'; - - @override - String get aboutSpecialThanks => 'Special Thanks'; - - @override - String get aboutLinks => 'Links'; - - @override - String get aboutMobileSource => 'Mobile source code'; - - @override - String get aboutPCSource => 'PC source code'; - - @override - String get aboutKeepAndroidOpen => 'Keep Android Open'; - - @override - String get aboutReportIssue => 'Report an issue'; - - @override - String get aboutReportIssueSubtitle => 'Report any problems you encounter'; - - @override - String get aboutFeatureRequest => 'Feature request'; - - @override - String get aboutFeatureRequestSubtitle => 'Suggest new features for the app'; - - @override - String get aboutTelegramChannel => 'Telegram Channel'; - - @override - String get aboutTelegramChannelSubtitle => 'Announcements and updates'; - - @override - String get aboutTelegramChat => 'Telegram Community'; - - @override - String get aboutTelegramChatSubtitle => 'Chat with other users'; - - @override - String get aboutSocial => 'Social'; - - @override - String get aboutApp => 'App'; - - @override - String get aboutVersion => 'Version'; - - @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 => - 'Creator of I Don\'t Have Spotify (IDHS). The fallback link resolver that saves the day!'; - - @override - String get aboutAppDescription => - 'Search music metadata, manage extensions, and organize your library.'; - - @override - String get artistAlbums => 'Albums'; - - @override - String get artistSingles => 'Singles & EPs'; - - @override - String get artistCompilations => 'Compilations'; - - @override - String get artistPopular => 'Popular'; - - @override - String artistMonthlyListeners(String count) { - return '$count monthly listeners'; - } - - @override - String get trackMetadataService => 'Service'; - - @override - String get trackMetadataPlay => 'Play'; - - @override - String get trackMetadataShare => 'Share'; - - @override - String get trackMetadataDelete => 'Delete'; - - @override - String get setupGrantPermission => 'Grant Permission'; - - @override - String get setupSkip => 'Skip for now'; - - @override - String get setupStorageAccessRequired => 'Storage Access Required'; - - @override - String get setupStorageAccessMessageAndroid11 => - 'Android 11+ requires \"All files access\" permission to save files to your chosen download folder.'; - - @override - String get setupOpenSettings => 'Open Settings'; - - @override - String get setupPermissionDeniedMessage => - 'Permission denied. Please grant all permissions to continue.'; - - @override - String setupPermissionRequired(String permissionType) { - return '$permissionType Permission Required'; - } - - @override - String setupPermissionRequiredMessage(String permissionType) { - return '$permissionType permission is required for the best experience. You can change this later in Settings.'; - } - - @override - String get setupUseDefaultFolder => 'Use Default Folder?'; - - @override - String get setupNoFolderSelected => - 'No folder selected. Would you like to use the default Music folder?'; - - @override - String get setupUseDefault => 'Use Default'; - - @override - String get setupDownloadLocationTitle => 'Download Location'; - - @override - String get setupDownloadLocationIosMessage => - 'On iOS, downloads are saved to the app\'s Documents folder. You can access them via the Files app.'; - - @override - String get setupAppDocumentsFolder => 'App Documents Folder'; - - @override - String get setupAppDocumentsFolderSubtitle => - 'Recommended - accessible via Files app'; - - @override - String get setupChooseFromFiles => 'Choose from Files'; - - @override - String get setupChooseFromFilesSubtitle => 'Select iCloud or other location'; - - @override - String get setupIosEmptyFolderWarning => - 'iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.'; - - @override - String get setupIcloudNotSupported => - 'iCloud Drive is not supported. Please use the app Documents folder.'; - - @override - String get setupDownloadInFlac => 'Download Spotify tracks in FLAC'; - - @override - String get setupStorageGranted => 'Storage Permission Granted!'; - - @override - String get setupStorageRequired => 'Storage Permission Required'; - - @override - String get setupStorageDescription => - 'SpotiFLAC needs storage permission to save your downloaded music files.'; - - @override - String get setupNotificationGranted => 'Notification Permission Granted!'; - - @override - String get setupNotificationEnable => 'Enable Notifications'; - - @override - String get setupFolderChoose => 'Choose Download Folder'; - - @override - String get setupFolderDescription => - 'Select a folder where your downloaded music will be saved.'; - - @override - String get setupSelectFolder => 'Select Folder'; - - @override - String get setupEnableNotifications => 'Enable Notifications'; - - @override - String get setupNotificationBackgroundDescription => - 'Get notified about download progress and completion. This helps you track downloads when the app is in background.'; - - @override - String get setupSkipForNow => 'Skip for now'; - - @override - String get setupNext => 'Next'; - - @override - String get setupGetStarted => 'Get Started'; - - @override - String get setupAllowAccessToManageFiles => - 'Please enable \"Allow access to manage all files\" in the next screen.'; - - @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 => 'Cancel'; - - @override - String get dialogSave => 'Save'; - - @override - String get dialogDelete => 'Delete'; - - @override - String get dialogRetry => 'Retry'; - - @override - String get dialogClear => 'Clear'; - - @override - String get dialogDone => 'Done'; - - @override - String get dialogImport => 'Import'; - - @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 => 'Discard'; - - @override - String get dialogRemove => 'Remove'; - - @override - String get dialogUninstall => 'Uninstall'; - - @override - String get dialogDiscardChanges => 'Discard Changes?'; - - @override - String get dialogUnsavedChanges => - 'You have unsaved changes. Do you want to discard them?'; - - @override - String get dialogClearAll => 'Clear All'; - - @override - String get dialogRemoveExtension => 'Remove Extension'; - - @override - String get dialogRemoveExtensionMessage => - 'Are you sure you want to remove this extension? This cannot be undone.'; - - @override - String get dialogUninstallExtension => 'Uninstall Extension?'; - - @override - String dialogUninstallExtensionMessage(String extensionName) { - return 'Are you sure you want to remove $extensionName?'; - } - - @override - String get dialogClearHistoryTitle => 'Clear History'; - - @override - String get dialogClearHistoryMessage => - 'Are you sure you want to clear all download history? This cannot be undone.'; - - @override - String get dialogDeleteSelectedTitle => 'Delete Selected'; - - @override - String dialogDeleteSelectedMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0 from history?\n\nThis will also delete the files from storage.'; - } - - @override - String get dialogImportPlaylistTitle => 'Import Playlist'; - - @override - String dialogImportPlaylistMessage(int count) { - return 'Found $count tracks in CSV. Add them to download queue?'; - } - - @override - String csvImportTracks(int count) { - return '$count tracks from CSV'; - } - - @override - String snackbarAddedToQueue(String trackName) { - return 'Added \"$trackName\" to queue'; - } - - @override - String snackbarAddedTracksToQueue(int count) { - return 'Added $count tracks to queue'; - } - - @override - String snackbarAlreadyDownloaded(String trackName) { - return '\"$trackName\" already downloaded'; - } - - @override - String snackbarAlreadyInLibrary(String trackName) { - return '\"$trackName\" already exists in your library'; - } - - @override - String get snackbarHistoryCleared => 'History cleared'; - - @override - String snackbarDeletedTracks(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Deleted $count $_temp0'; - } - - @override - String snackbarCannotOpenFile(String error) { - return 'Cannot open file: $error'; - } - - @override - String get snackbarViewQueue => 'View Queue'; - - @override - String snackbarUrlCopied(String platform) { - return '$platform URL copied to clipboard'; - } - - @override - String get snackbarFileNotFound => 'File not found'; - - @override - String get snackbarSelectExtFile => 'Please select a .spotiflac-ext file'; - - @override - String get snackbarProviderPrioritySaved => 'Provider priority saved'; - - @override - String get snackbarMetadataProviderSaved => - 'Metadata provider priority saved'; - - @override - String snackbarExtensionInstalled(String extensionName) { - return '$extensionName installed.'; - } - - @override - String snackbarExtensionUpdated(String extensionName) { - return '$extensionName updated.'; - } - - @override - String get snackbarFailedToInstall => 'Failed to install extension'; - - @override - String get snackbarFailedToUpdate => 'Failed to update extension'; - - @override - String get errorRateLimited => 'Rate Limited'; - - @override - String get errorRateLimitedMessage => - 'Too many requests. Please wait a moment before searching again.'; - - @override - String get errorNoTracksFound => 'No tracks found'; - - @override - String get searchEmptyResultSubtitle => 'Try another keyword'; - - @override - String get errorUrlNotRecognized => 'Link not recognized'; - - @override - String get errorUrlNotRecognizedMessage => - 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; - - @override - String get errorUrlFetchFailed => - 'Failed to load content from this link. Please try again.'; - - @override - String errorMissingExtensionSource(String item) { - return 'Cannot load $item: missing extension source'; - } - - @override - String get actionPause => 'Pause'; - - @override - String get actionResume => 'Resume'; - - @override - String get actionCancel => 'Cancel'; - - @override - String get actionSelectAll => 'Select All'; - - @override - String get actionDeselect => 'Deselect'; - - @override - String selectionSelected(int count) { - return '$count selected'; - } - - @override - String get selectionAllSelected => 'All tracks selected'; - - @override - String get selectionSelectToDelete => 'Select tracks to delete'; - - @override - String progressFetchingMetadata(int current, int total) { - return 'Fetching metadata... $current/$total'; - } - - @override - String get progressReadingCsv => 'Reading CSV...'; - - @override - String get searchSongs => 'Songs'; - - @override - String get searchArtists => 'Artists'; - - @override - String get searchAlbums => 'Albums'; - - @override - String get searchPlaylists => 'Playlists'; - - @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 => 'Play'; - - @override - String get filenameFormat => 'Filename Format'; - - @override - String get filenameShowAdvancedTags => 'Show advanced tags'; - - @override - String get filenameShowAdvancedTagsDescription => - 'Enable formatted tags for track padding and date patterns'; - - @override - String get folderOrganizationNone => 'No organization'; - - @override - String get folderOrganizationByPlaylist => 'By Playlist'; - - @override - String get folderOrganizationByPlaylistSubtitle => - 'Separate folder for each playlist'; - - @override - String get folderOrganizationByArtist => 'By Artist'; - - @override - String get folderOrganizationByAlbum => 'By Album'; - - @override - String get folderOrganizationByArtistAlbum => 'Artist/Album'; - - @override - String get folderOrganizationDescription => - 'Organize downloaded files into folders'; - - @override - String get folderOrganizationNoneSubtitle => 'All files in download folder'; - - @override - String get folderOrganizationByArtistSubtitle => - 'Separate folder for each artist'; - - @override - String get folderOrganizationByAlbumSubtitle => - 'Separate folder for each album'; - - @override - String get folderOrganizationByArtistAlbumSubtitle => - 'Nested folders for artist and album'; - - @override - String get updateAvailable => 'Update Available'; - - @override - String get updateLater => 'Later'; - - @override - String get updateStartingDownload => 'Starting download...'; - - @override - String get updateDownloadFailed => 'Download failed'; - - @override - String get updateFailedMessage => 'Failed to download update'; - - @override - String get updateNewVersionReady => 'A new version is ready'; - - @override - String get updateRequiredTitle => 'Update required'; - - @override - String updateRequiredNotice(int count) { - return 'This version is $count releases behind and is no longer supported. Update to keep using the app.'; - } - - @override - String get updateCurrent => 'Current'; - - @override - String get updateNew => 'New'; - - @override - String get updateDownloading => 'Downloading...'; - - @override - String get updateWhatsNew => 'What\'s New'; - - @override - String get updateDownloadInstall => 'Download & Install'; - - @override - String get updateDontRemind => 'Don\'t remind'; - - @override - String get providerPriorityTitle => 'Provider Priority'; - - @override - String get providerPriorityDescription => - 'Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.'; - - @override - String get providerPriorityInfo => - 'If a track is not available on the first provider, the app will automatically try the next one.'; - - @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 providerExtension => 'Extension'; - - @override - String get metadataProviderPriorityTitle => 'Metadata Priority'; - - @override - String get metadataProviderPriorityDescription => - 'Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.'; - - @override - String get metadataProviderPriorityInfo => - 'Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.'; - - @override - String get logTitle => 'Logs'; - - @override - String get logCopied => 'Logs copied to clipboard'; - - @override - String get logSearchHint => 'Search logs...'; - - @override - String get logFilterLevel => 'Level'; - - @override - String get logFilterSection => 'Filter'; - - @override - String get logShareLogs => 'Share logs'; - - @override - String get logClearLogs => 'Clear logs'; - - @override - String get logClearLogsTitle => 'Clear Logs'; - - @override - String get logClearLogsMessage => 'Are you sure you want to clear all logs?'; - - @override - String get logFilterBySeverity => 'Filter logs by severity'; - - @override - String get logNoLogsYet => 'No logs yet'; - - @override - String get logNoLogsYetSubtitle => 'Logs will appear here as you use the app'; - - @override - String logEntriesFiltered(int count) { - return 'Entries ($count filtered)'; - } - - @override - String logEntries(int count) { - return 'Entries ($count)'; - } - - @override - String get channelStable => 'Stable'; - - @override - String get channelPreview => 'Preview'; - - @override - String get sectionSearchSource => 'Search Source'; - - @override - String get sectionDownload => 'Download'; - - @override - String get sectionPerformance => 'Performance'; - - @override - String get sectionApp => 'App'; - - @override - String get sectionData => 'Data'; - - @override - String get sectionDebug => 'Debug'; - - @override - String get sectionService => 'Service'; - - @override - String get sectionAudioQuality => 'Audio Quality'; - - @override - String get sectionFileSettings => 'File Settings'; - - @override - String get sectionLyrics => 'Lyrics'; - - @override - String get lyricsMode => 'Lyrics Mode'; - - @override - String get lyricsModeDescription => - 'Choose how lyrics are saved with your downloads'; - - @override - String get lyricsModeEmbed => 'Embed in file'; - - @override - String get lyricsModeEmbedSubtitle => 'Lyrics stored inside FLAC metadata'; - - @override - String get lyricsModeExternal => 'External .lrc file'; - - @override - String get lyricsModeExternalSubtitle => - 'Separate .lrc file for players like Samsung Music'; - - @override - String get lyricsModeBoth => 'Both'; - - @override - String get lyricsModeBothSubtitle => 'Embed and save .lrc file'; - - @override - String get sectionColor => 'Color'; - - @override - String get sectionTheme => 'Theme'; - - @override - String get sectionLayout => 'Layout'; - - @override - String get sectionLanguage => 'Language'; - - @override - String get appearanceLanguage => 'App Language'; - - @override - String get settingsAppearanceSubtitle => 'Theme, colors, display'; - - @override - String get settingsDownloadSubtitle => 'Service, quality, fallback'; - - @override - String get settingsExtensionsSubtitle => 'Manage download providers'; - - @override - String get settingsLogsSubtitle => 'View app logs for debugging'; - - @override - String get loadingSharedLink => 'Loading shared link...'; - - @override - String get pressBackAgainToExit => 'Press back again to exit'; - - @override - String downloadAllCount(int count) { - return 'Download All ($count)'; - } - - @override - String tracksCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count tracks', - one: '1 track', - ); - return '$_temp0'; - } - - @override - String get trackCopyFilePath => 'Copy file path'; - - @override - String get trackRemoveFromDevice => 'Remove from device'; - - @override - String get trackLoadLyrics => 'Load Lyrics'; - - @override - String get trackMetadata => 'Metadata'; - - @override - String get trackFileInfo => 'File Info'; - - @override - String get trackLyrics => 'Lyrics'; - - @override - String get trackFileNotFound => 'File not found'; - - @override - String get trackOpenInDeezer => 'Open in Deezer'; - - @override - String get trackOpenInSpotify => 'Open in Spotify'; - - @override - String get trackTrackName => 'Track name'; - - @override - String get trackArtist => 'Artist'; - - @override - String get trackAlbumArtist => 'Album artist'; - - @override - String get trackAlbum => 'Album'; - - @override - String get trackTrackNumber => 'Track number'; - - @override - String get trackDiscNumber => 'Disc number'; - - @override - String get trackDuration => 'Duration'; - - @override - String get trackAudioQuality => 'Audio quality'; - - @override - String get trackReleaseDate => 'Release date'; - - @override - String get trackGenre => 'Genre'; - - @override - String get trackLabel => 'Label'; - - @override - String get trackCopyright => 'Copyright'; - - @override - String get trackDownloaded => 'Downloaded'; - - @override - String get trackCopyLyrics => 'Copy lyrics'; - - @override - String trackLyricsSource(String source) { - return 'Source: $source'; - } - - @override - String get trackLyricsNotAvailable => 'Lyrics not available for this track'; - - @override - String get trackLyricsNotInFile => 'No lyrics found in this file'; - - @override - String get trackFetchOnlineLyrics => 'Fetch from Online'; - - @override - String get trackLyricsTimeout => 'Request timed out. Try again later.'; - - @override - String get trackLyricsLoadFailed => 'Failed to load lyrics'; - - @override - String get trackEmbedLyrics => 'Embed Lyrics'; - - @override - String get trackLyricsEmbedded => 'Lyrics embedded successfully'; - - @override - String get trackInstrumental => 'Instrumental track'; - - @override - String get trackCopiedToClipboard => 'Copied to clipboard'; - - @override - String get trackDeleteConfirmTitle => 'Remove from device?'; - - @override - String get trackDeleteConfirmMessage => - 'This will permanently delete the downloaded file and remove it from your history.'; - - @override - String get dateToday => 'Today'; - - @override - String get dateYesterday => 'Yesterday'; - - @override - String dateDaysAgo(int count) { - return '$count days ago'; - } - - @override - String dateWeeksAgo(int count) { - return '$count weeks ago'; - } - - @override - String dateMonthsAgo(int count) { - return '$count months ago'; - } - - @override - String get storeFilterAll => 'All'; - - @override - String get storeFilterMetadata => 'Metadata'; - - @override - String get storeFilterDownload => 'Download'; - - @override - String get storeFilterUtility => 'Utility'; - - @override - String get storeFilterLyrics => 'Lyrics'; - - @override - String get storeFilterIntegration => 'Integration'; - - @override - String get storeClearFilters => 'Clear filters'; - - @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 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 extensionId => 'ID'; - - @override - String get extensionError => 'Error'; - - @override - String get extensionCapabilities => 'Capabilities'; - - @override - String get extensionMetadataProvider => 'Metadata Provider'; - - @override - String get extensionDownloadProvider => 'Download Provider'; - - @override - String get extensionLyricsProvider => 'Lyrics Provider'; - - @override - String get extensionUrlHandler => 'URL Handler'; - - @override - String get extensionQualityOptions => 'Quality Options'; - - @override - String get extensionPostProcessingHooks => 'Post-Processing Hooks'; - - @override - String get extensionPermissions => 'Permissions'; - - @override - String get extensionSettings => 'Settings'; - - @override - String get extensionRemoveButton => 'Remove Extension'; - - @override - String get extensionUpdated => 'Updated'; - - @override - String get extensionMinAppVersion => 'Min App Version'; - - @override - String get extensionCustomTrackMatching => 'Custom Track Matching'; - - @override - String get extensionPostProcessing => 'Post-Processing'; - - @override - String extensionHooksAvailable(int count) { - return '$count hook(s) available'; - } - - @override - String extensionPatternsCount(int count) { - return '$count pattern(s)'; - } - - @override - String extensionStrategy(String strategy) { - return 'Strategy: $strategy'; - } - - @override - String get extensionsProviderPrioritySection => 'Provider Priority'; - - @override - String get extensionsInstalledSection => 'Installed Extensions'; - - @override - String get extensionsNoExtensions => 'No extensions installed'; - - @override - String get extensionsNoExtensionsSubtitle => - 'Install .spotiflac-ext files to add new providers'; - - @override - String get extensionsInstallButton => 'Install Extension'; - - @override - String get extensionsInfoTip => - 'Extensions can add new metadata and download providers. Only install extensions from trusted sources.'; - - @override - String get extensionsInstalledSuccess => 'Extension installed successfully'; - - @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 => 'Download Priority'; - - @override - String get extensionsDownloadPrioritySubtitle => 'Set download service order'; - - @override - String get extensionsFallbackTitle => 'Fallback Extensions'; - - @override - String get extensionsFallbackSubtitle => - 'Choose which installed download extensions can be used as fallback'; - - @override - String get extensionsNoDownloadProvider => - 'No extensions with download provider'; - - @override - String get extensionsMetadataPriority => 'Metadata Priority'; - - @override - String get extensionsMetadataPrioritySubtitle => - 'Set search & metadata source order'; - - @override - String get extensionsNoMetadataProvider => - 'No extensions with metadata provider'; - - @override - String get extensionsSearchProvider => 'Search Provider'; - - @override - String get extensionsNoCustomSearch => 'No extensions with custom search'; - - @override - String get extensionsSearchProviderDescription => - 'Choose which service to use for searching tracks'; - - @override - String get extensionsCustomSearch => 'Custom search'; - - @override - String get extensionsErrorLoading => 'Error loading extension'; - - @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 / up to 96kHz'; - - @override - String get qualityHiResFlacMax => 'Hi-Res FLAC Max'; - - @override - String get qualityHiResFlacMaxSubtitle => '24-bit / up to 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 downloadAskBeforeDownload => 'Ask Before Download'; - - @override - String get downloadDirectory => 'Download Directory'; - - @override - String get downloadSeparateSinglesFolder => 'Separate Singles Folder'; - - @override - String get downloadAlbumFolderStructure => 'Album Folder Structure'; - - @override - String get albumFolderStructureDescription => - 'Choose how album folders are structured'; - - @override - String get downloadUseAlbumArtistForFolders => 'Use Album Artist for folders'; - - @override - String get downloadUsePrimaryArtistOnly => 'Primary artist only for folders'; - - @override - String get downloadUsePrimaryArtistOnlyEnabled => - 'Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)'; - - @override - String get downloadUsePrimaryArtistOnlyDisabled => - 'Full artist string used for folder name'; - - @override - String get downloadSelectQuality => 'Select Quality'; - - @override - String get downloadFrom => 'Download From'; - - @override - String get appearanceAmoledDark => 'AMOLED Dark'; - - @override - String get appearanceAmoledDarkSubtitle => 'Pure black background'; - - @override - String get appearanceHeroAnimations => 'Hero animations'; - - @override - String get appearanceHeroAnimationsSubtitle => - 'Fly covers between screens, e.g. when opening the player'; - - @override - String get queueClearAll => 'Clear All'; - - @override - String get queueClearAllMessage => - 'Are you sure you want to clear all downloads?'; - - @override - String get settingsAutoExportFailed => 'Auto-export failed downloads'; - - @override - String get settingsAutoExportFailedSubtitle => - 'Save failed downloads to TXT file automatically'; - - @override - String get settingsDownloadNetwork => 'Download Network'; - - @override - String get settingsDownloadNetworkAny => 'WiFi + Mobile Data'; - - @override - String get settingsDownloadNetworkWifiOnly => 'WiFi Only'; - - @override - String get settingsDownloadNetworkSubtitle => - 'Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.'; - - @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 => 'Artist / Album'; - - @override - String get albumFolderArtistAlbumSubtitle => 'Albums/Artist Name/Album Name/'; - - @override - String get albumFolderArtistYearAlbum => 'Artist / [Year] Album'; - - @override - String get albumFolderArtistYearAlbumSubtitle => - 'Albums/Artist Name/[2005] Album Name/'; - - @override - String get albumFolderAlbumOnly => 'Album Only'; - - @override - String get albumFolderAlbumOnlySubtitle => 'Albums/Album Name/'; - - @override - String get albumFolderYearAlbum => '[Year] Album'; - - @override - String get albumFolderYearAlbumSubtitle => 'Albums/[2005] Album Name/'; - - @override - String get albumFolderArtistAlbumSingles => 'Artist / Album + Singles'; - - @override - String get albumFolderArtistAlbumSinglesSubtitle => - 'Artist/Album/ and Artist/Singles/'; - - @override - String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; - - @override - String get albumFolderArtistAlbumFlatSubtitle => - 'Artist/Album/ and Artist/song.flac'; - - @override - String get downloadedAlbumDeleteSelected => 'Delete Selected'; - - @override - String downloadedAlbumDeleteMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0 from this album?\n\nThis will also delete the files from storage.'; - } - - @override - String downloadedAlbumSelectedCount(int count) { - return '$count selected'; - } - - @override - String get downloadedAlbumTapToSelect => 'Tap tracks to select'; - - @override - String downloadedAlbumDeleteCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0'; - } - - @override - String get downloadedAlbumSelectToDelete => 'Select tracks to delete'; - - @override - String downloadedAlbumDiscHeader(int discNumber) { - return 'Disc $discNumber'; - } - - @override - String get recentTypeArtist => 'Artist'; - - @override - String get recentTypeAlbum => 'Album'; - - @override - String get recentTypeSong => 'Song'; - - @override - String get recentTypePlaylist => 'Playlist'; - - @override - String get recentEmpty => 'No recent items yet'; - - @override - String get recentShowAllDownloads => 'Show All Downloads'; - - @override - String recentPlaylistInfo(String name) { - return 'Playlist: $name'; - } - - @override - String get discographyDownload => 'Download Discography'; - - @override - String get discographyDownloadAll => 'Download All'; - - @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 => - 'Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.'; - - @override - String libraryTracksUnit(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$_temp0'; - } - - @override - String 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 => 'Welcome to SpotiFLAC!'; - - @override - String get tutorialWelcomeDesc => - 'Let\'s learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.'; - - @override - String get tutorialWelcomeTip1 => - 'Download music from Spotify, Deezer, or paste any supported URL'; - - @override - String get tutorialWelcomeTip2 => - 'Get FLAC quality audio from installed download extensions'; - - @override - String get tutorialWelcomeTip3 => - 'Automatic metadata, cover art, and lyrics embedding'; - - @override - String get tutorialSearchTitle => 'Finding Music'; - - @override - String get tutorialSearchDesc => - 'There are two easy ways to find music you want to download.'; - - @override - String get tutorialDownloadTitle => 'Downloading Music'; - - @override - String get tutorialDownloadDesc => - 'Downloading music is simple and fast. Here\'s how it works.'; - - @override - String get tutorialLibraryTitle => 'Your Library'; - - @override - String get tutorialLibraryDesc => - 'All your downloaded music is organized in the Library tab.'; - - @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 libraryPlaybackNormalization => 'Volume normalization'; - - @override - String get libraryPlaybackNormalizationSubtitle => - 'Even out loudness between tracks using their ReplayGain or R128 tags, when present'; - - @override - String get cacheAudioAnalysis => 'Audio analysis cache'; - - @override - String get cacheAudioAnalysisDesc => - 'Saved spectrograms and analysis results. Will re-analyze on next open.'; - - @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 trackSaveLyrics => 'Save Lyrics (.lrc)'; - - @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 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 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 trackConvertTitle => 'Convert Audio'; - - @override - String get trackConvertTargetFormat => 'Target Format'; - - @override - String get trackConvertBitrate => 'Bitrate'; - - @override - String get trackConvertKeepOriginal => 'Keep original file'; - - @override - String get trackConvertKeepOriginalDescription => - 'Add the converted file as a separate library entry'; - - @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 trackConvertConfirmKeepOriginal( - String sourceFormat, - String targetFormat, - ) { - return 'Convert from $sourceFormat to $targetFormat?\n\nThe original file will be kept and the converted file will be added as a separate library entry.'; - } - - @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 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 collectionPlaylist => 'Playlist'; - - @override - String get collectionAddToPlaylist => 'Add to playlist'; - - @override - String get collectionCreatePlaylist => 'Create playlist'; - - @override - String get collectionNoPlaylistsYet => 'No playlists yet'; - - @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 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 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 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 selectionBatchConvertConfirmKeepOriginal(int count, String format) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Convert $count $_temp0 to $format?\n\nOriginal files will be kept and converted files will be added as separate library entries.'; - } - - @override - String selectionBatchConvertSuccess(int success, int total, String format) { - return 'Converted $success of $total tracks to $format'; - } - - @override - String downloadedAlbumDownloadedCount(int count) { - return '$count downloaded'; - } - - @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 => 'Backup & Restore'; - - @override - String get settingsBackupSubtitle => - 'Move your library, history and settings to a new device'; - - @override - String get backupTitle => 'Backup & Restore'; - - @override - String get backupExportSectionTitle => 'Create backup'; - - @override - String get backupExportSectionDescription => - 'Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.'; - - @override - String get backupExportButton => 'Create backup file'; - - @override - String get backupImportSectionTitle => 'Restore backup'; - - @override - String get backupImportSectionDescription => - 'Pick a backup file to restore your data. This replaces the current settings, history and library on this device.'; - - @override - String get backupImportButton => 'Choose backup file'; - - @override - String get backupCreated => 'Backup created'; - - @override - String get backupCreateFailed => 'Failed to create backup'; - - @override - String get backupRestoreConfirmTitle => 'Restore this backup?'; - - @override - String get backupRestoreConfirmMessage => - 'This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.'; - - @override - String get backupRestoreConfirmButton => 'Restore'; - - @override - String get backupRestored => 'Backup restored successfully'; - - @override - String get backupRestoreFailed => 'Failed to restore backup'; - - @override - String get backupInvalidFile => 'This file is not a valid SpotiFLAC backup'; - - @override - String get backupRestoreRestartHint => - 'Restart the app to make sure every change is applied.'; - - @override - String get backupContentsTitle => 'Backup contents'; - - @override - String get backupContentsSettings => 'App settings'; - - @override - String backupContentsHistory(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'items', - one: 'item', - ); - return '$count history $_temp0'; - } - - @override - String backupContentsLiked(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$count liked $_temp0'; - } - - @override - String backupContentsWishlist(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$count wishlist $_temp0'; - } - - @override - String backupContentsPlaylists(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count playlists', - one: '1 playlist', - ); - return '$_temp0'; - } - - @override - String backupContentsArtists(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count favorite artists', - one: '1 favorite artist', - ); - return '$_temp0'; - } - - @override - String backupContentsExtensions(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count extensions', - one: '1 extension', - ); - return '$_temp0'; - } - - @override - String get backupIncludeSecrets => 'Include extension credentials'; - - @override - String get backupIncludeSecretsDescription => - 'Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.'; - - @override - String backupExtensionsRestoreFailed(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'extensions', - one: 'extension', - ); - return '$count $_temp0 could not be reinstalled. Install them manually from the repo.'; - } - - @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 => 'Allow Local Network Access'; - - @override - String get downloadAllowLocalNetworkEnabled => - 'Requests to local/private addresses are allowed (for local proxy or custom DNS)'; - - @override - String get downloadAllowLocalNetworkDisabled => - 'Local/private addresses are blocked for security'; - - @override - String get downloadSelectServiceToEnable => - 'Select a provider with quality options to enable this option'; - - @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 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 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 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 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 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 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 queueDownloadNext => 'Download next'; - - @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 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 downloadDeduplicationWithQualityVariants => - 'Existing files at the selected quality will be skipped'; - - @override - String get downloadDeduplicationDisabled => - 'All tracks will be downloaded regardless of history'; - - @override - String get downloadQualityVariants => 'Allow different quality versions'; - - @override - String get downloadQualityVariantsDescription => - 'Add the selected quality to the filename and keep each version in download history'; - - @override - String get trackOptionDownloadQualityVariant => 'Download another quality'; - - @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 queueCheckingDownloadSession => 'Checking download session...'; - - @override - String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; - - @override - String get queueResolvingDownloadStream => 'Preparing audio stream...'; - - @override - String get queueWaitingForVerification => 'Waiting for verification...'; - - @override - String get queueResumingAfterVerification => 'Resuming after verification...'; - - @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 => - 'Android-achtergrondservice voor extensiedownloads'; - - @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 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 => 'Playback'; - - @override - String get libraryExternalPlayer => 'External player'; - - @override - String get libraryExternalPlayerSubtitle => - 'Recommended for listening, best quality, gapless playback, EQ, and wider format support'; - - @override - String get libraryBuiltInPreviewPlayer => 'Built-in preview player'; - - @override - String get libraryBuiltInPreviewPlayerSubtitle => - 'Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening'; - - @override - String get libraryBuiltInPlayerInfo => - 'The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.'; - - @override - String get nowPlayingTitle => 'Now Playing'; - - @override - String get nowPlayingNothingPlaying => 'Nothing is playing'; - - @override - String get nowPlayingMinimize => 'Minimize'; - - @override - String get nowPlayingUpNext => 'Up next'; - - @override - String get nowPlayingDetails => 'Details'; - - @override - String get nowPlayingOpenInExternalPlayer => 'Open in external player'; - - @override - String get nowPlayingTabPlayer => 'Player'; - - @override - String get nowPlayingTabLyrics => 'Lyrics'; - - @override - String get nowPlayingNoLyrics => 'No lyrics in this file'; - - @override - String get nowPlayingLibraryEmpty => 'Your library is empty'; - - @override - String nowPlayingShuffleLibraryFailed(String error) { - return 'Could not shuffle library: $error'; - } - - @override - String get nowPlayingShuffleOn => 'Shuffle on'; - - @override - String get nowPlayingPlayInOrder => 'Play in order'; - - @override - String get nowPlayingShuffleLibrary => 'Shuffle library'; - - @override - String get nowPlayingQueueEmpty => 'Queue is empty'; - - @override - String get nowPlayingNoMetadata => 'No metadata available'; - - @override - String get announcementUnableToOpenLink => - 'Unable to open link. Please try again.'; - - @override - String trackConvertLosslessOutputWithCap(String quality) { - return 'Lossless output with $quality cap'; - } - - @override - String trackConvertConfirmMessageLosslessCapped( - String sourceFormat, - String targetFormat, - String quality, - ) { - return 'Convert from $sourceFormat to $targetFormat ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.'; - } - - @override - String selectionBatchConvertConfirmMessageLosslessCapped( - int count, - String format, - String quality, - ) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Convert $count $_temp0 to $format ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.'; - } - - @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 => - 'Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius'; - - @override - String get snackbarPlayingNext => 'Playing next'; - - @override - String get snackbarAddedToQueueGeneric => 'Added to queue'; - - @override - String selectionDeletePlaylistsCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'playlists', - one: 'playlist', - ); - return 'Delete $count $_temp0'; - } - - @override - String get actionShuffle => 'Shuffle'; - - @override - String get downloadPrimaryArtistOnlyOn => 'Primary only: On'; - - @override - String get downloadPrimaryArtistOnlyOff => 'Primary only: Off'; - - @override - String get downloadAlbumArtistMetadataPrimaryOnly => - 'Album Artist metadata: Primary only'; - - @override - String get downloadAlbumArtistMetadataFull => 'Album Artist metadata: Full'; - - @override - String get trackConvertOriginal => 'Original'; - - @override - String get trackConvertOriginalQuality => 'Original quality'; - - @override - String get trackConvertLosslessSuffix => 'Lossless'; - - @override - String get trackConvertDithering => 'Dithering'; - - @override - String get trackConvertResampler => 'Resampler'; - - @override - String get trackConvertDitherNone => 'None'; - - @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 => 'See release notes for details.'; - - @override - String get unknownTitle => 'Unknown title'; - - @override - String get trackPlayNext => 'Play next'; - - @override - String get trackAddToQueue => 'Add to queue'; - - @override - String snackbarExtensionInstalledEnable(String extensionName) { - return '$extensionName installed. Enable it in Settings > Extensions'; - } - - @override - String snackbarExtensionUpdatedVersion(String extensionName, String version) { - return '$extensionName updated to v$version'; - } - - @override - String snackbarFailedToInstallNamed(String extensionName) { - return 'Failed to install $extensionName'; - } - - @override - String snackbarFailedToUpdateNamed(String extensionName) { - return 'Failed to update $extensionName'; - } - - @override - String get releaseTypeEp => 'EP'; - - @override - String get releaseTypeSingle => 'Single'; - - @override - String get trackCoverOnline => 'Online cover'; - - @override - String get regionCountryUS => 'United States'; - - @override - String get regionCountryGB => 'United Kingdom'; - - @override - String get regionCountryFR => 'France'; - - @override - String get regionCountryDE => 'Germany'; - - @override - String get regionCountryJP => 'Japan'; - - @override - String get regionCountryKR => 'South Korea'; - - @override - String get regionCountryIN => 'India'; - - @override - String get regionCountryID => 'Indonesia'; - - @override - String get regionCountryBR => 'Brazil'; - - @override - String get regionCountryMX => 'Mexico'; - - @override - String get regionCountryAU => 'Australia'; - - @override - String get regionCountryCA => 'Canada'; - - @override - String get regionCountryXK => 'Kosovo'; - - @override - String get extensionVerificationBrowserTitle => 'Verification browser'; - - @override - String get extensionVerificationBrowserSubtitleExternal => - 'Open challenges in the default browser first'; - - @override - String get extensionVerificationBrowserSubtitleInApp => - 'Open challenges in the in-app browser first'; - - @override - String get extensionVerificationBrowserExternal => 'External'; - - @override - String get extensionVerificationBrowserInApp => 'In-app'; - - @override - String get extensionVerificationHelpTitleManual => - 'Open verification manually'; - - @override - String get extensionVerificationHelpTitleWaiting => - 'Verification still waiting'; - - @override - String get extensionVerificationHelpMessageManual => - 'SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.'; - - @override - String get extensionVerificationHelpMessageWaiting => - 'If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.'; - - @override - String get extensionVerificationClose => 'Close'; - - @override - String get extensionVerificationCopyLink => 'Copy link'; - - @override - String get extensionVerificationLinkCopied => 'Verification link copied'; - - @override - String get extensionVerificationOpenBrowser => 'Open browser'; -} diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index c00a0dfe..8bb856b1 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -631,6 +631,20 @@ class AppLocalizationsPt extends AppLocalizations { return '$count tracks from CSV'; } + @override + String get collectionExportM3u => 'Export as M3U8'; + + @override + String collectionExportM3uDone(int exported, int total) { + return 'Exported $exported of $total tracks'; + } + + @override + String get collectionExportM3uNone => 'No downloaded files to export'; + + @override + String get collectionExportM3uFailed => 'Export failed'; + @override String snackbarAddedToQueue(String trackName) { return 'Added \"$trackName\" to queue'; @@ -3674,7 +3688,7 @@ class AppLocalizationsPt extends AppLocalizations { } @override - String get homeImportCsvTooltip => 'Import CSV'; + String get homeImportCsvTooltip => 'Import playlist (CSV, M3U)'; @override String get homeChangeSearchProviderTooltip => 'Change search provider'; diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index 1c0759aa..1da098a6 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -635,6 +635,20 @@ class AppLocalizationsRu extends AppLocalizations { return '$count трек(-ов) из CSV'; } + @override + String get collectionExportM3u => 'Export as M3U8'; + + @override + String collectionExportM3uDone(int exported, int total) { + return 'Exported $exported of $total tracks'; + } + + @override + String get collectionExportM3uNone => 'No downloaded files to export'; + + @override + String get collectionExportM3uFailed => 'Export failed'; + @override String snackbarAddedToQueue(String trackName) { return '\"$trackName\" добавлен в очередь'; diff --git a/lib/l10n/app_localizations_tr.dart b/lib/l10n/app_localizations_tr.dart index dd8a7636..5e8003b9 100644 --- a/lib/l10n/app_localizations_tr.dart +++ b/lib/l10n/app_localizations_tr.dart @@ -637,6 +637,20 @@ class AppLocalizationsTr extends AppLocalizations { return 'CSV\'den $count şarkı'; } + @override + String get collectionExportM3u => 'Export as M3U8'; + + @override + String collectionExportM3uDone(int exported, int total) { + return 'Exported $exported of $total tracks'; + } + + @override + String get collectionExportM3uNone => 'No downloaded files to export'; + + @override + String get collectionExportM3uFailed => 'Export failed'; + @override String snackbarAddedToQueue(String trackName) { return '\"$trackName\" kuyruğa eklendi'; diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index d7d012c2..5b34ed37 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -638,6 +638,20 @@ class AppLocalizationsUk extends AppLocalizations { return '$count треків з CSV'; } + @override + String get collectionExportM3u => 'Export as M3U8'; + + @override + String collectionExportM3uDone(int exported, int total) { + return 'Exported $exported of $total tracks'; + } + + @override + String get collectionExportM3uNone => 'No downloaded files to export'; + + @override + String get collectionExportM3uFailed => 'Export failed'; + @override String snackbarAddedToQueue(String trackName) { return 'Додано \"$trackName\" до черги'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart deleted file mode 100644 index bff28bbc..00000000 --- a/lib/l10n/app_localizations_zh.dart +++ /dev/null @@ -1,13676 +0,0 @@ -// ignore: unused_import -import 'package:intl/intl.dart' as intl; -import 'app_localizations.dart'; - -// ignore_for_file: type=lint - -/// The translations for Chinese (`zh`). -class AppLocalizationsZh extends AppLocalizations { - AppLocalizationsZh([String locale = 'zh']) : super(locale); - - @override - String get appName => 'SpotiFLAC Mobile'; - - @override - String get navHome => 'Home'; - - @override - String get navLibrary => 'Library'; - - @override - String get navSettings => 'Settings'; - - @override - String get navStore => 'Repo'; - - @override - String get homeTitle => 'Home'; - - @override - String get homeSubtitle => 'Paste a Spotify link or search by name'; - - @override - String get homeEmptyTitle => 'No search providers yet'; - - @override - String get homeEmptySubtitle => 'Install an extension to continue.'; - - @override - String get homeSupports => 'Supports: Track, Album, Playlist, Artist URLs'; - - @override - String get homeRecent => 'Recent'; - - @override - String get historyFilterAll => 'All'; - - @override - String get historyFilterAlbums => 'Albums'; - - @override - String get historyFilterSingles => 'Singles'; - - @override - String get historySearchHint => 'Search history...'; - - @override - String get settingsTitle => 'Settings'; - - @override - String get settingsDownload => 'Download'; - - @override - String get settingsAppearance => 'Appearance'; - - @override - String get settingsExtensions => 'Extensions'; - - @override - String get settingsAbout => 'About'; - - @override - String get downloadTitle => 'Download'; - - @override - String get downloadAskQualitySubtitle => - 'Show quality picker for each download'; - - @override - String get downloadFilenameFormat => 'Filename Format'; - - @override - String get downloadSingleFilenameFormat => 'Single Filename Format'; - - @override - String get downloadSingleFilenameFormatDescription => - 'Filename pattern for singles and EPs. Uses the same tags as the album format.'; - - @override - String get downloadFolderOrganization => 'Folder Organization'; - - @override - String get appearanceTitle => 'Appearance'; - - @override - String get appearanceThemeSystem => 'System'; - - @override - String get appearanceThemeLight => 'Light'; - - @override - String get appearanceThemeDark => 'Dark'; - - @override - String get appearanceDynamicColor => 'Dynamic Color'; - - @override - String get appearanceDynamicColorSubtitle => 'Use colors from your wallpaper'; - - @override - String get appearanceHistoryView => 'History View'; - - @override - String get appearanceHistoryViewList => 'List'; - - @override - String get appearanceHistoryViewGrid => 'Grid'; - - @override - String get optionsPrimaryProvider => 'Primary Provider'; - - @override - String get optionsPrimaryProviderSubtitle => - 'Service used when searching by track name.'; - - @override - String optionsUsingExtension(String extensionName) { - return 'Using extension: $extensionName'; - } - - @override - String get optionsDefaultSearchTab => 'Default Search Tab'; - - @override - String get optionsDefaultSearchTabSubtitle => - 'Choose which tab opens first for new search results.'; - - @override - String get optionsAutoFallback => 'Auto Fallback'; - - @override - String get optionsAutoFallbackSubtitle => - 'Try other services if download fails'; - - @override - String get optionsEmbedLyrics => 'Embed Lyrics'; - - @override - String get optionsEmbedLyricsSubtitle => - 'Embed synced lyrics into FLAC files'; - - @override - String get optionsMaxQualityCover => 'Max Quality Cover'; - - @override - String get optionsMaxQualityCoverSubtitle => - 'Download highest resolution cover art'; - - @override - String get optionsReplayGain => 'ReplayGain'; - - @override - String get optionsReplayGainSubtitleOn => - 'Scan loudness and embed ReplayGain tags (EBU R128)'; - - @override - String get optionsReplayGainSubtitleOff => - 'Disabled: no loudness normalization tags'; - - @override - String get trackReplayGain => 'Rescan ReplayGain'; - - @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 => 'Artist Tag Mode'; - - @override - String get optionsArtistTagModeDescription => - 'Choose how multiple artists are written into embedded tags.'; - - @override - String get optionsArtistTagModeJoined => 'Single joined value'; - - @override - String get optionsArtistTagModeJoinedSubtitle => - 'Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.'; - - @override - String get optionsArtistTagModeSplitVorbis => 'Split tags for FLAC/Opus'; - - @override - String get optionsArtistTagModeSplitVorbisSubtitle => - 'Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.'; - - @override - String get optionsExtensionStore => 'Extension Repo'; - - @override - String get optionsExtensionStoreSubtitle => 'Show Repo tab in navigation'; - - @override - String get optionsCheckUpdates => 'Check for Updates'; - - @override - String get optionsCheckUpdatesSubtitle => - 'Notify when new version is available'; - - @override - String get optionsUpdateChannel => 'Update Channel'; - - @override - String get optionsUpdateChannelStable => 'Stable releases only'; - - @override - String get optionsUpdateChannelPreview => 'Get preview releases'; - - @override - String get optionsUpdateChannelWarning => - 'Preview may contain bugs or incomplete features'; - - @override - String get optionsClearHistory => 'Clear Download History'; - - @override - String get optionsClearHistorySubtitle => - 'Remove all downloaded tracks from history'; - - @override - String get optionsDetailedLogging => 'Detailed Logging'; - - @override - String get optionsDetailedLoggingOn => 'Detailed logs are being recorded'; - - @override - String get optionsDetailedLoggingOff => 'Enable for bug reports'; - - @override - String get extensionsTitle => 'Extensions'; - - @override - String get extensionsDisabled => 'Disabled'; - - @override - String extensionsVersion(String version) { - return 'Version $version'; - } - - @override - String get extensionsUninstall => 'Uninstall'; - - @override - String get storeTitle => 'Extension Repo'; - - @override - String get storeSearch => 'Search extensions...'; - - @override - String get storeInstall => 'Install'; - - @override - String get storeInstalled => 'Installed'; - - @override - String get storeUpdate => 'Update'; - - @override - String get aboutTitle => 'About'; - - @override - String get aboutContributors => 'Contributors'; - - @override - String get aboutMobileDeveloper => 'Mobile version developer'; - - @override - String get aboutOriginalCreator => 'Creator of the original SpotiFLAC'; - - @override - String get aboutLogoArtist => - 'The talented artist who created our beautiful app logo!'; - - @override - String get aboutTranslators => 'Translators'; - - @override - String get aboutSpecialThanks => 'Special Thanks'; - - @override - String get aboutLinks => 'Links'; - - @override - String get aboutMobileSource => 'Mobile source code'; - - @override - String get aboutPCSource => 'PC source code'; - - @override - String get aboutKeepAndroidOpen => 'Keep Android Open'; - - @override - String get aboutReportIssue => 'Report an issue'; - - @override - String get aboutReportIssueSubtitle => 'Report any problems you encounter'; - - @override - String get aboutFeatureRequest => 'Feature request'; - - @override - String get aboutFeatureRequestSubtitle => 'Suggest new features for the app'; - - @override - String get aboutTelegramChannel => 'Telegram Channel'; - - @override - String get aboutTelegramChannelSubtitle => 'Announcements and updates'; - - @override - String get aboutTelegramChat => 'Telegram Community'; - - @override - String get aboutTelegramChatSubtitle => 'Chat with other users'; - - @override - String get aboutSocial => 'Social'; - - @override - String get aboutApp => 'App'; - - @override - String get aboutVersion => 'Version'; - - @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 => - 'Creator of I Don\'t Have Spotify (IDHS). The fallback link resolver that saves the day!'; - - @override - String get aboutAppDescription => - 'Search music metadata, manage extensions, and organize your library.'; - - @override - String get artistAlbums => 'Albums'; - - @override - String get artistSingles => 'Singles & EPs'; - - @override - String get artistCompilations => 'Compilations'; - - @override - String get artistPopular => 'Popular'; - - @override - String artistMonthlyListeners(String count) { - return '$count monthly listeners'; - } - - @override - String get trackMetadataService => 'Service'; - - @override - String get trackMetadataPlay => 'Play'; - - @override - String get trackMetadataShare => 'Share'; - - @override - String get trackMetadataDelete => 'Delete'; - - @override - String get setupGrantPermission => 'Grant Permission'; - - @override - String get setupSkip => 'Skip for now'; - - @override - String get setupStorageAccessRequired => 'Storage Access Required'; - - @override - String get setupStorageAccessMessageAndroid11 => - 'Android 11+ requires \"All files access\" permission to save files to your chosen download folder.'; - - @override - String get setupOpenSettings => 'Open Settings'; - - @override - String get setupPermissionDeniedMessage => - 'Permission denied. Please grant all permissions to continue.'; - - @override - String setupPermissionRequired(String permissionType) { - return '$permissionType Permission Required'; - } - - @override - String setupPermissionRequiredMessage(String permissionType) { - return '$permissionType permission is required for the best experience. You can change this later in Settings.'; - } - - @override - String get setupUseDefaultFolder => 'Use Default Folder?'; - - @override - String get setupNoFolderSelected => - 'No folder selected. Would you like to use the default Music folder?'; - - @override - String get setupUseDefault => 'Use Default'; - - @override - String get setupDownloadLocationTitle => 'Download Location'; - - @override - String get setupDownloadLocationIosMessage => - 'On iOS, downloads are saved to the app\'s Documents folder. You can access them via the Files app.'; - - @override - String get setupAppDocumentsFolder => 'App Documents Folder'; - - @override - String get setupAppDocumentsFolderSubtitle => - 'Recommended - accessible via Files app'; - - @override - String get setupChooseFromFiles => 'Choose from Files'; - - @override - String get setupChooseFromFilesSubtitle => 'Select iCloud or other location'; - - @override - String get setupIosEmptyFolderWarning => - 'iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.'; - - @override - String get setupIcloudNotSupported => - 'iCloud Drive is not supported. Please use the app Documents folder.'; - - @override - String get setupDownloadInFlac => 'Download Spotify tracks in FLAC'; - - @override - String get setupStorageGranted => 'Storage Permission Granted!'; - - @override - String get setupStorageRequired => 'Storage Permission Required'; - - @override - String get setupStorageDescription => - 'SpotiFLAC needs storage permission to save your downloaded music files.'; - - @override - String get setupNotificationGranted => 'Notification Permission Granted!'; - - @override - String get setupNotificationEnable => 'Enable Notifications'; - - @override - String get setupFolderChoose => 'Choose Download Folder'; - - @override - String get setupFolderDescription => - 'Select a folder where your downloaded music will be saved.'; - - @override - String get setupSelectFolder => 'Select Folder'; - - @override - String get setupEnableNotifications => 'Enable Notifications'; - - @override - String get setupNotificationBackgroundDescription => - 'Get notified about download progress and completion. This helps you track downloads when the app is in background.'; - - @override - String get setupSkipForNow => 'Skip for now'; - - @override - String get setupNext => 'Next'; - - @override - String get setupGetStarted => 'Get Started'; - - @override - String get setupAllowAccessToManageFiles => - 'Please enable \"Allow access to manage all files\" in the next screen.'; - - @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 => 'Cancel'; - - @override - String get dialogSave => 'Save'; - - @override - String get dialogDelete => 'Delete'; - - @override - String get dialogRetry => 'Retry'; - - @override - String get dialogClear => 'Clear'; - - @override - String get dialogDone => 'Done'; - - @override - String get dialogImport => 'Import'; - - @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 => 'Discard'; - - @override - String get dialogRemove => 'Remove'; - - @override - String get dialogUninstall => 'Uninstall'; - - @override - String get dialogDiscardChanges => 'Discard Changes?'; - - @override - String get dialogUnsavedChanges => - 'You have unsaved changes. Do you want to discard them?'; - - @override - String get dialogClearAll => 'Clear All'; - - @override - String get dialogRemoveExtension => 'Remove Extension'; - - @override - String get dialogRemoveExtensionMessage => - 'Are you sure you want to remove this extension? This cannot be undone.'; - - @override - String get dialogUninstallExtension => 'Uninstall Extension?'; - - @override - String dialogUninstallExtensionMessage(String extensionName) { - return 'Are you sure you want to remove $extensionName?'; - } - - @override - String get dialogClearHistoryTitle => 'Clear History'; - - @override - String get dialogClearHistoryMessage => - 'Are you sure you want to clear all download history? This cannot be undone.'; - - @override - String get dialogDeleteSelectedTitle => 'Delete Selected'; - - @override - String dialogDeleteSelectedMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0 from history?\n\nThis will also delete the files from storage.'; - } - - @override - String get dialogImportPlaylistTitle => 'Import Playlist'; - - @override - String dialogImportPlaylistMessage(int count) { - return 'Found $count tracks in CSV. Add them to download queue?'; - } - - @override - String csvImportTracks(int count) { - return '$count tracks from CSV'; - } - - @override - String snackbarAddedToQueue(String trackName) { - return 'Added \"$trackName\" to queue'; - } - - @override - String snackbarAddedTracksToQueue(int count) { - return 'Added $count tracks to queue'; - } - - @override - String snackbarAlreadyDownloaded(String trackName) { - return '\"$trackName\" already downloaded'; - } - - @override - String snackbarAlreadyInLibrary(String trackName) { - return '\"$trackName\" already exists in your library'; - } - - @override - String get snackbarHistoryCleared => 'History cleared'; - - @override - String snackbarDeletedTracks(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Deleted $count $_temp0'; - } - - @override - String snackbarCannotOpenFile(String error) { - return 'Cannot open file: $error'; - } - - @override - String get snackbarViewQueue => 'View Queue'; - - @override - String snackbarUrlCopied(String platform) { - return '$platform URL copied to clipboard'; - } - - @override - String get snackbarFileNotFound => 'File not found'; - - @override - String get snackbarSelectExtFile => 'Please select a .spotiflac-ext file'; - - @override - String get snackbarProviderPrioritySaved => 'Provider priority saved'; - - @override - String get snackbarMetadataProviderSaved => - 'Metadata provider priority saved'; - - @override - String snackbarExtensionInstalled(String extensionName) { - return '$extensionName installed.'; - } - - @override - String snackbarExtensionUpdated(String extensionName) { - return '$extensionName updated.'; - } - - @override - String get snackbarFailedToInstall => 'Failed to install extension'; - - @override - String get snackbarFailedToUpdate => 'Failed to update extension'; - - @override - String get errorRateLimited => 'Rate Limited'; - - @override - String get errorRateLimitedMessage => - 'Too many requests. Please wait a moment before searching again.'; - - @override - String get errorNoTracksFound => 'No tracks found'; - - @override - String get searchEmptyResultSubtitle => 'Try another keyword'; - - @override - String get errorUrlNotRecognized => 'Link not recognized'; - - @override - String get errorUrlNotRecognizedMessage => - 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; - - @override - String get errorUrlFetchFailed => - 'Failed to load content from this link. Please try again.'; - - @override - String errorMissingExtensionSource(String item) { - return 'Cannot load $item: missing extension source'; - } - - @override - String get actionPause => 'Pause'; - - @override - String get actionResume => 'Resume'; - - @override - String get actionCancel => 'Cancel'; - - @override - String get actionSelectAll => 'Select All'; - - @override - String get actionDeselect => 'Deselect'; - - @override - String selectionSelected(int count) { - return '$count selected'; - } - - @override - String get selectionAllSelected => 'All tracks selected'; - - @override - String get selectionSelectToDelete => 'Select tracks to delete'; - - @override - String progressFetchingMetadata(int current, int total) { - return 'Fetching metadata... $current/$total'; - } - - @override - String get progressReadingCsv => 'Reading CSV...'; - - @override - String get searchSongs => 'Songs'; - - @override - String get searchArtists => 'Artists'; - - @override - String get searchAlbums => 'Albums'; - - @override - String get searchPlaylists => 'Playlists'; - - @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 => 'Play'; - - @override - String get filenameFormat => 'Filename Format'; - - @override - String get filenameShowAdvancedTags => 'Show advanced tags'; - - @override - String get filenameShowAdvancedTagsDescription => - 'Enable formatted tags for track padding and date patterns'; - - @override - String get folderOrganizationNone => 'No organization'; - - @override - String get folderOrganizationByPlaylist => 'By Playlist'; - - @override - String get folderOrganizationByPlaylistSubtitle => - 'Separate folder for each playlist'; - - @override - String get folderOrganizationByArtist => 'By Artist'; - - @override - String get folderOrganizationByAlbum => 'By Album'; - - @override - String get folderOrganizationByArtistAlbum => 'Artist/Album'; - - @override - String get folderOrganizationDescription => - 'Organize downloaded files into folders'; - - @override - String get folderOrganizationNoneSubtitle => 'All files in download folder'; - - @override - String get folderOrganizationByArtistSubtitle => - 'Separate folder for each artist'; - - @override - String get folderOrganizationByAlbumSubtitle => - 'Separate folder for each album'; - - @override - String get folderOrganizationByArtistAlbumSubtitle => - 'Nested folders for artist and album'; - - @override - String get updateAvailable => 'Update Available'; - - @override - String get updateLater => 'Later'; - - @override - String get updateStartingDownload => 'Starting download...'; - - @override - String get updateDownloadFailed => 'Download failed'; - - @override - String get updateFailedMessage => 'Failed to download update'; - - @override - String get updateNewVersionReady => 'A new version is ready'; - - @override - String get updateRequiredTitle => 'Update required'; - - @override - String updateRequiredNotice(int count) { - return 'This version is $count releases behind and is no longer supported. Update to keep using the app.'; - } - - @override - String get updateCurrent => 'Current'; - - @override - String get updateNew => 'New'; - - @override - String get updateDownloading => 'Downloading...'; - - @override - String get updateWhatsNew => 'What\'s New'; - - @override - String get updateDownloadInstall => 'Download & Install'; - - @override - String get updateDontRemind => 'Don\'t remind'; - - @override - String get providerPriorityTitle => 'Provider Priority'; - - @override - String get providerPriorityDescription => - 'Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.'; - - @override - String get providerPriorityInfo => - 'If a track is not available on the first provider, the app will automatically try the next one.'; - - @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 providerExtension => 'Extension'; - - @override - String get metadataProviderPriorityTitle => 'Metadata Priority'; - - @override - String get metadataProviderPriorityDescription => - 'Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.'; - - @override - String get metadataProviderPriorityInfo => - 'Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.'; - - @override - String get logTitle => 'Logs'; - - @override - String get logCopied => 'Logs copied to clipboard'; - - @override - String get logSearchHint => 'Search logs...'; - - @override - String get logFilterLevel => 'Level'; - - @override - String get logFilterSection => 'Filter'; - - @override - String get logShareLogs => 'Share logs'; - - @override - String get logClearLogs => 'Clear logs'; - - @override - String get logClearLogsTitle => 'Clear Logs'; - - @override - String get logClearLogsMessage => 'Are you sure you want to clear all logs?'; - - @override - String get logFilterBySeverity => 'Filter logs by severity'; - - @override - String get logNoLogsYet => 'No logs yet'; - - @override - String get logNoLogsYetSubtitle => 'Logs will appear here as you use the app'; - - @override - String logEntriesFiltered(int count) { - return 'Entries ($count filtered)'; - } - - @override - String logEntries(int count) { - return 'Entries ($count)'; - } - - @override - String get channelStable => 'Stable'; - - @override - String get channelPreview => 'Preview'; - - @override - String get sectionSearchSource => 'Search Source'; - - @override - String get sectionDownload => 'Download'; - - @override - String get sectionPerformance => 'Performance'; - - @override - String get sectionApp => 'App'; - - @override - String get sectionData => 'Data'; - - @override - String get sectionDebug => 'Debug'; - - @override - String get sectionService => 'Service'; - - @override - String get sectionAudioQuality => 'Audio Quality'; - - @override - String get sectionFileSettings => 'File Settings'; - - @override - String get sectionLyrics => 'Lyrics'; - - @override - String get lyricsMode => 'Lyrics Mode'; - - @override - String get lyricsModeDescription => - 'Choose how lyrics are saved with your downloads'; - - @override - String get lyricsModeEmbed => 'Embed in file'; - - @override - String get lyricsModeEmbedSubtitle => 'Lyrics stored inside FLAC metadata'; - - @override - String get lyricsModeExternal => 'External .lrc file'; - - @override - String get lyricsModeExternalSubtitle => - 'Separate .lrc file for players like Samsung Music'; - - @override - String get lyricsModeBoth => 'Both'; - - @override - String get lyricsModeBothSubtitle => 'Embed and save .lrc file'; - - @override - String get sectionColor => 'Color'; - - @override - String get sectionTheme => 'Theme'; - - @override - String get sectionLayout => 'Layout'; - - @override - String get sectionLanguage => 'Language'; - - @override - String get appearanceLanguage => 'App Language'; - - @override - String get settingsAppearanceSubtitle => 'Theme, colors, display'; - - @override - String get settingsDownloadSubtitle => 'Service, quality, filename format'; - - @override - String get settingsExtensionsSubtitle => 'Manage download providers'; - - @override - String get settingsLogsSubtitle => 'View app logs for debugging'; - - @override - String get loadingSharedLink => 'Loading shared link...'; - - @override - String get pressBackAgainToExit => 'Press back again to exit'; - - @override - String downloadAllCount(int count) { - return 'Download All ($count)'; - } - - @override - String tracksCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count tracks', - one: '1 track', - ); - return '$_temp0'; - } - - @override - String get trackCopyFilePath => 'Copy file path'; - - @override - String get trackRemoveFromDevice => 'Remove from device'; - - @override - String get trackLoadLyrics => 'Load Lyrics'; - - @override - String get trackMetadata => 'Metadata'; - - @override - String get trackFileInfo => 'File Info'; - - @override - String get trackLyrics => 'Lyrics'; - - @override - String get trackFileNotFound => 'File not found'; - - @override - String get trackOpenInDeezer => 'Open in Deezer'; - - @override - String get trackOpenInSpotify => 'Open in Spotify'; - - @override - String get trackTrackName => 'Track name'; - - @override - String get trackArtist => 'Artist'; - - @override - String get trackAlbumArtist => 'Album artist'; - - @override - String get trackAlbum => 'Album'; - - @override - String get trackTrackNumber => 'Track number'; - - @override - String get trackDiscNumber => 'Disc number'; - - @override - String get trackDuration => 'Duration'; - - @override - String get trackAudioQuality => 'Audio quality'; - - @override - String get trackReleaseDate => 'Release date'; - - @override - String get trackGenre => 'Genre'; - - @override - String get trackLabel => 'Label'; - - @override - String get trackCopyright => 'Copyright'; - - @override - String get trackDownloaded => 'Downloaded'; - - @override - String get trackCopyLyrics => 'Copy lyrics'; - - @override - String trackLyricsSource(String source) { - return 'Source: $source'; - } - - @override - String get trackLyricsNotAvailable => 'Lyrics not available for this track'; - - @override - String get trackLyricsNotInFile => 'No lyrics found in this file'; - - @override - String get trackFetchOnlineLyrics => 'Fetch from Online'; - - @override - String get trackLyricsTimeout => 'Request timed out. Try again later.'; - - @override - String get trackLyricsLoadFailed => 'Failed to load lyrics'; - - @override - String get trackEmbedLyrics => 'Embed Lyrics'; - - @override - String get trackLyricsEmbedded => 'Lyrics embedded successfully'; - - @override - String get trackInstrumental => 'Instrumental track'; - - @override - String get trackCopiedToClipboard => 'Copied to clipboard'; - - @override - String get trackDeleteConfirmTitle => 'Remove from device?'; - - @override - String get trackDeleteConfirmMessage => - 'This will permanently delete the downloaded file and remove it from your history.'; - - @override - String get dateToday => 'Today'; - - @override - String get dateYesterday => 'Yesterday'; - - @override - String dateDaysAgo(int count) { - return '$count days ago'; - } - - @override - String dateWeeksAgo(int count) { - return '$count weeks ago'; - } - - @override - String dateMonthsAgo(int count) { - return '$count months ago'; - } - - @override - String get storeFilterAll => 'All'; - - @override - String get storeFilterMetadata => 'Metadata'; - - @override - String get storeFilterDownload => 'Download'; - - @override - String get storeFilterUtility => 'Utility'; - - @override - String get storeFilterLyrics => 'Lyrics'; - - @override - String get storeFilterIntegration => 'Integration'; - - @override - String get storeClearFilters => 'Clear filters'; - - @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 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 extensionId => 'ID'; - - @override - String get extensionError => 'Error'; - - @override - String get extensionCapabilities => 'Capabilities'; - - @override - String get extensionMetadataProvider => 'Metadata Provider'; - - @override - String get extensionDownloadProvider => 'Download Provider'; - - @override - String get extensionLyricsProvider => 'Lyrics Provider'; - - @override - String get extensionUrlHandler => 'URL Handler'; - - @override - String get extensionQualityOptions => 'Quality Options'; - - @override - String get extensionPostProcessingHooks => 'Post-Processing Hooks'; - - @override - String get extensionPermissions => 'Permissions'; - - @override - String get extensionSettings => 'Settings'; - - @override - String get extensionRemoveButton => 'Remove Extension'; - - @override - String get extensionUpdated => 'Updated'; - - @override - String get extensionMinAppVersion => 'Min App Version'; - - @override - String get extensionCustomTrackMatching => 'Custom Track Matching'; - - @override - String get extensionPostProcessing => 'Post-Processing'; - - @override - String extensionHooksAvailable(int count) { - return '$count hook(s) available'; - } - - @override - String extensionPatternsCount(int count) { - return '$count pattern(s)'; - } - - @override - String extensionStrategy(String strategy) { - return 'Strategy: $strategy'; - } - - @override - String get extensionsProviderPrioritySection => 'Provider Priority'; - - @override - String get extensionsInstalledSection => 'Installed Extensions'; - - @override - String get extensionsNoExtensions => 'No extensions installed'; - - @override - String get extensionsNoExtensionsSubtitle => - 'Install .spotiflac-ext files to add new providers'; - - @override - String get extensionsInstallButton => 'Install Extension'; - - @override - String get extensionsInfoTip => - 'Extensions can add new metadata and download providers. Only install extensions from trusted sources.'; - - @override - String get extensionsInstalledSuccess => 'Extension installed successfully'; - - @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 => 'Download Priority'; - - @override - String get extensionsDownloadPrioritySubtitle => 'Set download service order'; - - @override - String get extensionsFallbackTitle => 'Fallback Extensions'; - - @override - String get extensionsFallbackSubtitle => - 'Choose which installed download extensions can be used as fallback'; - - @override - String get extensionsNoDownloadProvider => - 'No extensions with download provider'; - - @override - String get extensionsMetadataPriority => 'Metadata Priority'; - - @override - String get extensionsMetadataPrioritySubtitle => - 'Set search & metadata source order'; - - @override - String get extensionsNoMetadataProvider => - 'No extensions with metadata provider'; - - @override - String get extensionsSearchProvider => 'Search Provider'; - - @override - String get extensionsNoCustomSearch => 'No extensions with custom search'; - - @override - String get extensionsSearchProviderDescription => - 'Choose which service to use for searching tracks'; - - @override - String get extensionsCustomSearch => 'Custom search'; - - @override - String get extensionsErrorLoading => 'Error loading extension'; - - @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 / up to 96kHz'; - - @override - String get qualityHiResFlacMax => 'Hi-Res FLAC Max'; - - @override - String get qualityHiResFlacMaxSubtitle => '24-bit / up to 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 downloadAskBeforeDownload => 'Ask Before Download'; - - @override - String get downloadDirectory => 'Download Directory'; - - @override - String get downloadSeparateSinglesFolder => 'Separate Singles Folder'; - - @override - String get downloadAlbumFolderStructure => 'Album Folder Structure'; - - @override - String get albumFolderStructureDescription => - 'Choose how album folders are structured'; - - @override - String get downloadUseAlbumArtistForFolders => 'Use Album Artist for folders'; - - @override - String get downloadUsePrimaryArtistOnly => 'Primary artist only for folders'; - - @override - String get downloadUsePrimaryArtistOnlyEnabled => - 'Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)'; - - @override - String get downloadUsePrimaryArtistOnlyDisabled => - 'Full artist string used for folder name'; - - @override - String get downloadSelectQuality => 'Select Quality'; - - @override - String get downloadFrom => 'Download From'; - - @override - String get appearanceAmoledDark => 'AMOLED Dark'; - - @override - String get appearanceAmoledDarkSubtitle => 'Pure black background'; - - @override - String get appearanceHeroAnimations => 'Hero animations'; - - @override - String get appearanceHeroAnimationsSubtitle => - 'Fly covers between screens, e.g. when opening the player'; - - @override - String get queueClearAll => 'Clear All'; - - @override - String get queueClearAllMessage => - 'Are you sure you want to clear all downloads?'; - - @override - String get settingsAutoExportFailed => 'Auto-export failed downloads'; - - @override - String get settingsAutoExportFailedSubtitle => - 'Save failed downloads to TXT file automatically'; - - @override - String get settingsDownloadNetwork => 'Download Network'; - - @override - String get settingsDownloadNetworkAny => 'WiFi + Mobile Data'; - - @override - String get settingsDownloadNetworkWifiOnly => 'WiFi Only'; - - @override - String get settingsDownloadNetworkSubtitle => - 'Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.'; - - @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 => 'Artist / Album'; - - @override - String get albumFolderArtistAlbumSubtitle => 'Albums/Artist Name/Album Name/'; - - @override - String get albumFolderArtistYearAlbum => 'Artist / [Year] Album'; - - @override - String get albumFolderArtistYearAlbumSubtitle => - 'Albums/Artist Name/[2005] Album Name/'; - - @override - String get albumFolderAlbumOnly => 'Album Only'; - - @override - String get albumFolderAlbumOnlySubtitle => 'Albums/Album Name/'; - - @override - String get albumFolderYearAlbum => '[Year] Album'; - - @override - String get albumFolderYearAlbumSubtitle => 'Albums/[2005] Album Name/'; - - @override - String get albumFolderArtistAlbumSingles => 'Artist / Album + Singles'; - - @override - String get albumFolderArtistAlbumSinglesSubtitle => - 'Artist/Album/ and Artist/Singles/'; - - @override - String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; - - @override - String get albumFolderArtistAlbumFlatSubtitle => - 'Artist/Album/ and Artist/song.flac'; - - @override - String get downloadedAlbumDeleteSelected => 'Delete Selected'; - - @override - String downloadedAlbumDeleteMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0 from this album?\n\nThis will also delete the files from storage.'; - } - - @override - String downloadedAlbumSelectedCount(int count) { - return '$count selected'; - } - - @override - String get downloadedAlbumTapToSelect => 'Tap tracks to select'; - - @override - String downloadedAlbumDeleteCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0'; - } - - @override - String get downloadedAlbumSelectToDelete => 'Select tracks to delete'; - - @override - String downloadedAlbumDiscHeader(int discNumber) { - return 'Disc $discNumber'; - } - - @override - String get recentTypeArtist => 'Artist'; - - @override - String get recentTypeAlbum => 'Album'; - - @override - String get recentTypeSong => 'Song'; - - @override - String get recentTypePlaylist => 'Playlist'; - - @override - String get recentEmpty => 'No recent items yet'; - - @override - String get recentShowAllDownloads => 'Show All Downloads'; - - @override - String recentPlaylistInfo(String name) { - return 'Playlist: $name'; - } - - @override - String get discographyDownload => 'Download Discography'; - - @override - String get discographyDownloadAll => 'Download All'; - - @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 => - 'Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.'; - - @override - String libraryTracksUnit(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$_temp0'; - } - - @override - String 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 => 'Welcome to SpotiFLAC!'; - - @override - String get tutorialWelcomeDesc => - 'Let\'s learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.'; - - @override - String get tutorialWelcomeTip1 => - 'Download music from Spotify, Deezer, or paste any supported URL'; - - @override - String get tutorialWelcomeTip2 => - 'Get FLAC quality audio from installed download extensions'; - - @override - String get tutorialWelcomeTip3 => - 'Automatic metadata, cover art, and lyrics embedding'; - - @override - String get tutorialSearchTitle => 'Finding Music'; - - @override - String get tutorialSearchDesc => - 'There are two easy ways to find music you want to download.'; - - @override - String get tutorialDownloadTitle => 'Downloading Music'; - - @override - String get tutorialDownloadDesc => - 'Downloading music is simple and fast. Here\'s how it works.'; - - @override - String get tutorialLibraryTitle => 'Your Library'; - - @override - String get tutorialLibraryDesc => - 'All your downloaded music is organized in the Library tab.'; - - @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 libraryPlaybackNormalization => 'Volume normalization'; - - @override - String get libraryPlaybackNormalizationSubtitle => - 'Even out loudness between tracks using their ReplayGain or R128 tags, when present'; - - @override - String get cacheAudioAnalysis => 'Audio analysis cache'; - - @override - String get cacheAudioAnalysisDesc => - 'Saved spectrograms and analysis results. Will re-analyze on next open.'; - - @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 trackSaveLyrics => 'Save Lyrics (.lrc)'; - - @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 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 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 trackConvertTitle => 'Convert Audio'; - - @override - String get trackConvertTargetFormat => 'Target Format'; - - @override - String get trackConvertBitrate => 'Bitrate'; - - @override - String get trackConvertKeepOriginal => 'Keep original file'; - - @override - String get trackConvertKeepOriginalDescription => - 'Add the converted file as a separate library entry'; - - @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 trackConvertConfirmKeepOriginal( - String sourceFormat, - String targetFormat, - ) { - return 'Convert from $sourceFormat to $targetFormat?\n\nThe original file will be kept and the converted file will be added as a separate library entry.'; - } - - @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 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 collectionPlaylist => 'Playlist'; - - @override - String get collectionAddToPlaylist => 'Add to playlist'; - - @override - String get collectionCreatePlaylist => 'Create playlist'; - - @override - String get collectionNoPlaylistsYet => 'No playlists yet'; - - @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 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 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 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 selectionBatchConvertConfirmKeepOriginal(int count, String format) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Convert $count $_temp0 to $format?\n\nOriginal files will be kept and converted files will be added as separate library entries.'; - } - - @override - String selectionBatchConvertSuccess(int success, int total, String format) { - return 'Converted $success of $total tracks to $format'; - } - - @override - String downloadedAlbumDownloadedCount(int count) { - return '$count downloaded'; - } - - @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 => 'Backup & Restore'; - - @override - String get settingsBackupSubtitle => - 'Move your library, history and settings to a new device'; - - @override - String get backupTitle => 'Backup & Restore'; - - @override - String get backupExportSectionTitle => 'Create backup'; - - @override - String get backupExportSectionDescription => - 'Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.'; - - @override - String get backupExportButton => 'Create backup file'; - - @override - String get backupImportSectionTitle => 'Restore backup'; - - @override - String get backupImportSectionDescription => - 'Pick a backup file to restore your data. This replaces the current settings, history and library on this device.'; - - @override - String get backupImportButton => 'Choose backup file'; - - @override - String get backupCreated => 'Backup created'; - - @override - String get backupCreateFailed => 'Failed to create backup'; - - @override - String get backupRestoreConfirmTitle => 'Restore this backup?'; - - @override - String get backupRestoreConfirmMessage => - 'This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.'; - - @override - String get backupRestoreConfirmButton => 'Restore'; - - @override - String get backupRestored => 'Backup restored successfully'; - - @override - String get backupRestoreFailed => 'Failed to restore backup'; - - @override - String get backupInvalidFile => 'This file is not a valid SpotiFLAC backup'; - - @override - String get backupRestoreRestartHint => - 'Restart the app to make sure every change is applied.'; - - @override - String get backupContentsTitle => 'Backup contents'; - - @override - String get backupContentsSettings => 'App settings'; - - @override - String backupContentsHistory(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'items', - one: 'item', - ); - return '$count history $_temp0'; - } - - @override - String backupContentsLiked(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$count liked $_temp0'; - } - - @override - String backupContentsWishlist(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$count wishlist $_temp0'; - } - - @override - String backupContentsPlaylists(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count playlists', - one: '1 playlist', - ); - return '$_temp0'; - } - - @override - String backupContentsArtists(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count favorite artists', - one: '1 favorite artist', - ); - return '$_temp0'; - } - - @override - String backupContentsExtensions(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count extensions', - one: '1 extension', - ); - return '$_temp0'; - } - - @override - String get backupIncludeSecrets => 'Include extension credentials'; - - @override - String get backupIncludeSecretsDescription => - 'Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.'; - - @override - String backupExtensionsRestoreFailed(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'extensions', - one: 'extension', - ); - return '$count $_temp0 could not be reinstalled. Install them manually from the repo.'; - } - - @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 => 'Allow Local Network Access'; - - @override - String get downloadAllowLocalNetworkEnabled => - 'Requests to local/private addresses are allowed (for local proxy or custom DNS)'; - - @override - String get downloadAllowLocalNetworkDisabled => - 'Local/private addresses are blocked for security'; - - @override - String get downloadSelectServiceToEnable => - 'Select a provider with quality options to enable this option'; - - @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 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 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 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 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) { - return '$count tracks downloaded successfully'; - } - - @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 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 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 queueDownloadNext => 'Download next'; - - @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 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 downloadDeduplicationWithQualityVariants => - 'Existing files at the selected quality will be skipped'; - - @override - String get downloadDeduplicationDisabled => - 'All tracks will be downloaded regardless of history'; - - @override - String get downloadQualityVariants => 'Allow different quality versions'; - - @override - String get downloadQualityVariantsDescription => - 'Add the selected quality to the filename and keep each version in download history'; - - @override - String get trackOptionDownloadQualityVariant => 'Download another quality'; - - @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 queueCheckingDownloadSession => 'Checking download session...'; - - @override - String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; - - @override - String get queueResolvingDownloadStream => 'Preparing audio stream...'; - - @override - String get queueWaitingForVerification => 'Waiting for verification...'; - - @override - String get queueResumingAfterVerification => 'Resuming after verification...'; - - @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 => - 'Android background service 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 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 => 'Playback'; - - @override - String get libraryExternalPlayer => 'External player'; - - @override - String get libraryExternalPlayerSubtitle => - 'Recommended for listening, best quality, gapless playback, EQ, and wider format support'; - - @override - String get libraryBuiltInPreviewPlayer => 'Built-in preview player'; - - @override - String get libraryBuiltInPreviewPlayerSubtitle => - 'Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening'; - - @override - String get libraryBuiltInPlayerInfo => - 'The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.'; - - @override - String get nowPlayingTitle => 'Now Playing'; - - @override - String get nowPlayingNothingPlaying => 'Nothing is playing'; - - @override - String get nowPlayingMinimize => 'Minimize'; - - @override - String get nowPlayingUpNext => 'Up next'; - - @override - String get nowPlayingDetails => 'Details'; - - @override - String get nowPlayingOpenInExternalPlayer => 'Open in external player'; - - @override - String get nowPlayingTabPlayer => 'Player'; - - @override - String get nowPlayingTabLyrics => 'Lyrics'; - - @override - String get nowPlayingNoLyrics => 'No lyrics in this file'; - - @override - String get nowPlayingLibraryEmpty => 'Your library is empty'; - - @override - String nowPlayingShuffleLibraryFailed(String error) { - return 'Could not shuffle library: $error'; - } - - @override - String get nowPlayingShuffleOn => 'Shuffle on'; - - @override - String get nowPlayingPlayInOrder => 'Play in order'; - - @override - String get nowPlayingShuffleLibrary => 'Shuffle library'; - - @override - String get nowPlayingQueueEmpty => 'Queue is empty'; - - @override - String get nowPlayingNoMetadata => 'No metadata available'; - - @override - String get announcementUnableToOpenLink => - 'Unable to open link. Please try again.'; - - @override - String trackConvertLosslessOutputWithCap(String quality) { - return 'Lossless output with $quality cap'; - } - - @override - String trackConvertConfirmMessageLosslessCapped( - String sourceFormat, - String targetFormat, - String quality, - ) { - return 'Convert from $sourceFormat to $targetFormat ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.'; - } - - @override - String selectionBatchConvertConfirmMessageLosslessCapped( - int count, - String format, - String quality, - ) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Convert $count $_temp0 to $format ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.'; - } - - @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 => - 'Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius'; - - @override - String get snackbarPlayingNext => 'Playing next'; - - @override - String get snackbarAddedToQueueGeneric => 'Added to queue'; - - @override - String selectionDeletePlaylistsCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'playlists', - one: 'playlist', - ); - return 'Delete $count $_temp0'; - } - - @override - String get actionShuffle => 'Shuffle'; - - @override - String get downloadPrimaryArtistOnlyOn => 'Primary only: On'; - - @override - String get downloadPrimaryArtistOnlyOff => 'Primary only: Off'; - - @override - String get downloadAlbumArtistMetadataPrimaryOnly => - 'Album Artist metadata: Primary only'; - - @override - String get downloadAlbumArtistMetadataFull => 'Album Artist metadata: Full'; - - @override - String get trackConvertOriginal => 'Original'; - - @override - String get trackConvertOriginalQuality => 'Original quality'; - - @override - String get trackConvertLosslessSuffix => 'Lossless'; - - @override - String get trackConvertDithering => 'Dithering'; - - @override - String get trackConvertResampler => 'Resampler'; - - @override - String get trackConvertDitherNone => 'None'; - - @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 => 'See release notes for details.'; - - @override - String get unknownTitle => 'Unknown title'; - - @override - String get trackPlayNext => 'Play next'; - - @override - String get trackAddToQueue => 'Add to queue'; - - @override - String snackbarExtensionInstalledEnable(String extensionName) { - return '$extensionName installed. Enable it in Settings > Extensions'; - } - - @override - String snackbarExtensionUpdatedVersion(String extensionName, String version) { - return '$extensionName updated to v$version'; - } - - @override - String snackbarFailedToInstallNamed(String extensionName) { - return 'Failed to install $extensionName'; - } - - @override - String snackbarFailedToUpdateNamed(String extensionName) { - return 'Failed to update $extensionName'; - } - - @override - String get releaseTypeEp => 'EP'; - - @override - String get releaseTypeSingle => 'Single'; - - @override - String get trackCoverOnline => 'Online cover'; - - @override - String get regionCountryUS => 'United States'; - - @override - String get regionCountryGB => 'United Kingdom'; - - @override - String get regionCountryFR => 'France'; - - @override - String get regionCountryDE => 'Germany'; - - @override - String get regionCountryJP => 'Japan'; - - @override - String get regionCountryKR => 'South Korea'; - - @override - String get regionCountryIN => 'India'; - - @override - String get regionCountryID => 'Indonesia'; - - @override - String get regionCountryBR => 'Brazil'; - - @override - String get regionCountryMX => 'Mexico'; - - @override - String get regionCountryAU => 'Australia'; - - @override - String get regionCountryCA => 'Canada'; - - @override - String get regionCountryXK => 'Kosovo'; - - @override - String get extensionVerificationBrowserTitle => 'Verification browser'; - - @override - String get extensionVerificationBrowserSubtitleExternal => - 'Open challenges in the default browser first'; - - @override - String get extensionVerificationBrowserSubtitleInApp => - 'Open challenges in the in-app browser first'; - - @override - String get extensionVerificationBrowserExternal => 'External'; - - @override - String get extensionVerificationBrowserInApp => 'In-app'; - - @override - String get extensionVerificationHelpTitleManual => - 'Open verification manually'; - - @override - String get extensionVerificationHelpTitleWaiting => - 'Verification still waiting'; - - @override - String get extensionVerificationHelpMessageManual => - 'SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.'; - - @override - String get extensionVerificationHelpMessageWaiting => - 'If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.'; - - @override - String get extensionVerificationClose => 'Close'; - - @override - String get extensionVerificationCopyLink => 'Copy link'; - - @override - String get extensionVerificationLinkCopied => 'Verification link copied'; - - @override - String get extensionVerificationOpenBrowser => 'Open browser'; -} - -/// The translations for Chinese, as used in China (`zh_CN`). -class AppLocalizationsZhCn extends AppLocalizationsZh { - AppLocalizationsZhCn() : super('zh_CN'); - - @override - String get appName => 'SpotiFLAC 移动版'; - - @override - String get navHome => '主页'; - - @override - String get navLibrary => '乐库'; - - @override - String get navSettings => '设置'; - - @override - String get navStore => '仓库'; - - @override - String get homeTitle => '主页'; - - @override - String get homeSubtitle => '粘贴支持的 URL 或按名称搜索'; - - @override - String get homeEmptyTitle => '暂无搜索提供商'; - - @override - String get homeEmptySubtitle => '安装一个拓展以继续。'; - - @override - String get homeSupports => '支持:歌曲、专辑、播放列表、艺人网址'; - - @override - String get homeRecent => '最近'; - - @override - String get historyFilterAll => '全部'; - - @override - String get historyFilterAlbums => '专辑'; - - @override - String get historyFilterSingles => '单曲'; - - @override - String get historySearchHint => '搜索历史……'; - - @override - String get settingsTitle => '设置'; - - @override - String get settingsDownload => '下载'; - - @override - String get settingsAppearance => '外观'; - - @override - String get settingsExtensions => '扩展'; - - @override - String get settingsAbout => '关于'; - - @override - String get downloadTitle => '下载'; - - @override - String get downloadAskQualitySubtitle => '为每次下载显示质量选择器'; - - @override - String get downloadFilenameFormat => '文件名格式'; - - @override - String get downloadSingleFilenameFormat => '单曲文件名格式'; - - @override - String get downloadSingleFilenameFormatDescription => - '单曲和EP的文件名格式。使用与专辑格式相同的标签。'; - - @override - String get downloadFolderOrganization => '文件夹结构'; - - @override - String get appearanceTitle => '外观'; - - @override - String get appearanceThemeSystem => '系统'; - - @override - String get appearanceThemeLight => '浅色'; - - @override - String get appearanceThemeDark => '深色'; - - @override - String get appearanceDynamicColor => '动态色彩'; - - @override - String get appearanceDynamicColorSubtitle => '使用壁纸的颜色'; - - @override - String get appearanceHistoryView => '历史记录'; - - @override - String get appearanceHistoryViewList => '列表'; - - @override - String get appearanceHistoryViewGrid => '网格'; - - @override - String get optionsPrimaryProvider => '主要提供者'; - - @override - String get optionsPrimaryProviderSubtitle => '用于按曲目或专辑名称搜索的服务'; - - @override - String optionsUsingExtension(String extensionName) { - return '使用扩展:$extensionName'; - } - - @override - String get optionsDefaultSearchTab => '默认搜索栏'; - - @override - String get optionsDefaultSearchTabSubtitle => '选择新搜索结果首先打开的标签页。'; - - @override - String get optionsAutoFallback => '自动回退'; - - @override - String get optionsAutoFallbackSubtitle => '如果下载失败,请尝试其他服务'; - - @override - String get optionsEmbedLyrics => '内嵌歌词'; - - @override - String get optionsEmbedLyricsSubtitle => '将同步的歌词与你下载的音轨一起保存'; - - @override - String get optionsMaxQualityCover => '最高质量封面'; - - @override - String get optionsMaxQualityCoverSubtitle => '下载最高分辨率封面'; - - @override - String get optionsReplayGain => '回放增益'; - - @override - String get optionsReplayGainSubtitleOn => '扫描响度并嵌入 ReplayGain 标签(EBU R128)'; - - @override - String get optionsReplayGainSubtitleOff => '已禁用:不添加响度标准化标签'; - - @override - String get trackReplayGain => '重新扫描ReplayGain '; - - @override - String get trackReplayGainScanning => '正在分析声音……'; - - @override - String get trackReplayGainSuccess => 'ReplayGain标签已添加'; - - @override - String get trackReplayGainFailed => '添加ReplayGain标签失败'; - - @override - String selectionReplayGainCount(int count) { - return 'ReplayGain ($count)'; - } - - @override - String get replayGainBatchConfirmTitle => '添加ReplayGain'; - - @override - String replayGainBatchConfirmMessage(int count) { - return '要分析响度并向 $count 首歌曲写入 ReplayGain 标签吗?'; - } - - @override - String get replayGainBatchAnalyzing => '正在分析ReplayGain...'; - - @override - String replayGainBatchSuccess(int success, int total) { - return '已为 $success/$total 首歌曲添加 ReplayGain'; - } - - @override - String get optionsArtistTagMode => '艺术家标签模式'; - - @override - String get optionsArtistTagModeDescription => '选择将多位艺人写入嵌入标签的方式'; - - @override - String get optionsArtistTagModeJoined => '合并为单个值'; - - @override - String get optionsArtistTagModeJoinedSubtitle => - '写一个ARTIST 值,如“艺术家A,艺人B”,以实现最大兼容性。'; - - @override - String get optionsArtistTagModeSplitVorbis => '用于 FLAC/Opus 的拆分标签'; - - @override - String get optionsArtistTagModeSplitVorbisSubtitle => - '为 FLAC 和 Opus 的每位艺人各写入一个艺人标签;MP3 和 M4A 保持合并'; - - @override - String get optionsExtensionStore => '扩展仓库'; - - @override - String get optionsExtensionStoreSubtitle => '在导航中显示仓库标签页'; - - @override - String get optionsCheckUpdates => '检查更新'; - - @override - String get optionsCheckUpdatesSubtitle => '当有新版本可用时通知'; - - @override - String get optionsUpdateChannel => '更新频道'; - - @override - String get optionsUpdateChannelStable => '仅稳定版本'; - - @override - String get optionsUpdateChannelPreview => '获取预览版本'; - - @override - String get optionsUpdateChannelWarning => '预览版本可能包含错误或者尚未完善的功能'; - - @override - String get optionsClearHistory => '清除下载历史记录'; - - @override - String get optionsClearHistorySubtitle => '从历史记录中清除所有已下载的曲目'; - - @override - String get optionsDetailedLogging => '详细日志'; - - @override - String get optionsDetailedLoggingOn => '正在记录详细日志'; - - @override - String get optionsDetailedLoggingOff => '为错误报告启用'; - - @override - String get extensionsTitle => '扩展'; - - @override - String get extensionsDisabled => '禁用'; - - @override - String extensionsVersion(String version) { - return '版本 $version'; - } - - @override - String get extensionsUninstall => '卸载'; - - @override - String get storeTitle => '扩展仓库地址'; - - @override - String get storeSearch => '搜索扩展……'; - - @override - String get storeInstall => '安装'; - - @override - String get storeInstalled => '已安装'; - - @override - String get storeUpdate => '更新'; - - @override - String get aboutTitle => '关于'; - - @override - String get aboutContributors => '贡献者'; - - @override - String get aboutMobileDeveloper => '移动版本开发者'; - - @override - String get aboutOriginalCreator => '原 SpotiLDAC 创建者'; - - @override - String get aboutLogoArtist => '有才华的艺术家创建了我们美丽的应用图标!'; - - @override - String get aboutTranslators => '译者'; - - @override - String get aboutSpecialThanks => '特别鸣谢'; - - @override - String get aboutLinks => '相关链接'; - - @override - String get aboutMobileSource => '移动版本源代码'; - - @override - String get aboutPCSource => '桌面版本源代码'; - - @override - String get aboutKeepAndroidOpen => 'Keep Android Open(保持安卓开放)'; - - @override - String get aboutReportIssue => '报告一个问题'; - - @override - String get aboutReportIssueSubtitle => '报告您遇到的任何问题'; - - @override - String get aboutFeatureRequest => '功能建议'; - - @override - String get aboutFeatureRequestSubtitle => '为应用建议新功能'; - - @override - String get aboutTelegramChannel => 'Telegram 频道'; - - @override - String get aboutTelegramChannelSubtitle => '公告和更新'; - - @override - String get aboutTelegramChat => 'Telegram 社区'; - - @override - String get aboutTelegramChatSubtitle => '与其他用户聊天'; - - @override - String get aboutSocial => '社交'; - - @override - String get aboutApp => 'App'; - - @override - String get aboutVersion => '版本'; - - @override - String get aboutBinimumDesc => 'QQDL 和 HiFi API 的创建者。本项目帮助完善了无损下载支持。'; - - @override - String get aboutSachinsenalDesc => '原 HiFi 项目创建者,为无损来源集成奠定了基础。'; - - @override - String get aboutSjdonadoDesc => - 'I Don\'t Have Spotify (IDHS) 的创建者。备用链接解析器很有帮助!'; - - @override - String get aboutAppDescription => '搜索音乐元数据、管理扩展并整理你的乐库。'; - - @override - String get artistAlbums => '专辑'; - - @override - String get artistSingles => '单曲 & EP'; - - @override - String get artistCompilations => '合辑'; - - @override - String get artistPopular => '热门'; - - @override - String artistMonthlyListeners(String count) { - return '$count 位月听众'; - } - - @override - String get trackMetadataService => '服务商'; - - @override - String get trackMetadataPlay => '播放'; - - @override - String get trackMetadataShare => '分享'; - - @override - String get trackMetadataDelete => '删除'; - - @override - String get setupGrantPermission => '授予权限'; - - @override - String get setupSkip => '暂时跳过'; - - @override - String get setupStorageAccessRequired => '需要存储访问权限'; - - @override - String get setupStorageAccessMessageAndroid11 => - 'Android 11+ 需要“所有文件访问权限”才能将文件保存到你选择的下载文件夹。'; - - @override - String get setupOpenSettings => '打开设置'; - - @override - String get setupPermissionDeniedMessage => '权限被拒绝。请授予所有权限以继续。'; - - @override - String setupPermissionRequired(String permissionType) { - return '需要 $permissionType 权限'; - } - - @override - String setupPermissionRequiredMessage(String permissionType) { - return '为了获得最佳体验,需要 $permissionType 权限。你可以稍后在设置中更改。'; - } - - @override - String get setupUseDefaultFolder => '使用默认文件夹?'; - - @override - String get setupNoFolderSelected => '未选择文件夹。要使用默认音乐文件夹吗?'; - - @override - String get setupUseDefault => '使用默认'; - - @override - String get setupDownloadLocationTitle => '下载位置'; - - @override - String get setupDownloadLocationIosMessage => - '在 iOS 上,下载内容会保存到应用的 Documents 文件夹。你可以通过“文件”应用访问。'; - - @override - String get setupAppDocumentsFolder => '应用程序文档文件夹'; - - @override - String get setupAppDocumentsFolderSubtitle => '推荐 - 可通过“文件”应用访问'; - - @override - String get setupChooseFromFiles => '从“文件”中选择'; - - @override - String get setupChooseFromFilesSubtitle => '选择 iCloud 或其他位置'; - - @override - String get setupIosEmptyFolderWarning => 'iOS 限制:无法选择空文件夹。请选择至少包含一个文件的文件夹。'; - - @override - String get setupIcloudNotSupported => '不支持 iCloud Drive。请使用应用 Documents 文件夹。'; - - @override - String get setupDownloadInFlac => '以 FLAC 下载 Spotify 曲目'; - - @override - String get setupStorageGranted => '已授予存储权限!'; - - @override - String get setupStorageRequired => '需要存储权限'; - - @override - String get setupStorageDescription => 'SpotiFLAC 需要存储权限来保存下载的音乐文件。'; - - @override - String get setupNotificationGranted => '已授予通知权限!'; - - @override - String get setupNotificationEnable => '启用通知'; - - @override - String get setupFolderChoose => '选择下载文件夹'; - - @override - String get setupFolderDescription => '选择保存您下载的音乐的文件夹。'; - - @override - String get setupSelectFolder => '选择文件夹'; - - @override - String get setupEnableNotifications => '启用通知'; - - @override - String get setupNotificationBackgroundDescription => - '接收下载进度和完成通知,方便你在应用后台时跟踪下载。'; - - @override - String get setupSkipForNow => '暂时跳过'; - - @override - String get setupNext => '下一步'; - - @override - String get setupGetStarted => '开始使用'; - - @override - String get setupAllowAccessToManageFiles => '请在下一个屏幕中启用“允许管理所有文件”。'; - - @override - String get setupLanguageTitle => '选择语言'; - - @override - String get setupLanguageDescription => '选择应用的首选语言。你可以稍后在设置中更改。'; - - @override - String get setupLanguageSystemDefault => '跟随系统'; - - @override - String get dialogCancel => '取消'; - - @override - String get dialogSave => '保存'; - - @override - String get dialogDelete => '删除'; - - @override - String get dialogRetry => '重试'; - - @override - String get dialogClear => '清空'; - - @override - String get dialogDone => '完成'; - - @override - String get dialogImport => '导入'; - - @override - String get dialogDownload => '下载'; - - @override - String get previewPlay => 'Play preview'; - - @override - String get previewStop => 'Stop preview'; - - @override - String get previewUnavailable => 'Preview unavailable'; - - @override - String get dialogDiscard => '放弃'; - - @override - String get dialogRemove => '移除'; - - @override - String get dialogUninstall => '卸载'; - - @override - String get dialogDiscardChanges => '放弃更改?'; - - @override - String get dialogUnsavedChanges => '您有未保存的更改,要放弃它们吗?'; - - @override - String get dialogClearAll => '全部清除'; - - @override - String get dialogRemoveExtension => '移除扩展'; - - @override - String get dialogRemoveExtensionMessage => '确定要移除此扩展吗?此操作无法撤销。'; - - @override - String get dialogUninstallExtension => '卸载扩展?'; - - @override - String dialogUninstallExtensionMessage(String extensionName) { - return '确定要移除 $extensionName 吗?'; - } - - @override - String get dialogClearHistoryTitle => '清除历史'; - - @override - String get dialogClearHistoryMessage => '您确定要清除所有下载记录吗?此操作无法撤销!'; - - @override - String get dialogDeleteSelectedTitle => '删除所选项'; - - @override - String dialogDeleteSelectedMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '首歌曲', - one: '首歌曲', - ); - return '确定要从历史记录中删除 $count $_temp0吗?\n\n这也会从存储中删除文件。'; - } - - @override - String get dialogImportPlaylistTitle => '导入播放列表'; - - @override - String dialogImportPlaylistMessage(int count) { - return '在 CSV 中找到 $count 首歌曲。要将它们加入下载队列吗?'; - } - - @override - String csvImportTracks(int count) { - return 'CSV 中的 $count 首歌曲'; - } - - @override - String snackbarAddedToQueue(String trackName) { - return '已将“$trackName”加入队列'; - } - - @override - String snackbarAddedTracksToQueue(int count) { - return '已将 $count 首歌曲加入队列'; - } - - @override - String snackbarAlreadyDownloaded(String trackName) { - return '“$trackName”已下载'; - } - - @override - String snackbarAlreadyInLibrary(String trackName) { - return '“$trackName”已存在于你的乐库中'; - } - - @override - String get snackbarHistoryCleared => '历史记录已清除'; - - @override - String snackbarDeletedTracks(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '首歌曲', - one: '首歌曲', - ); - return '已删除 $count $_temp0'; - } - - @override - String snackbarCannotOpenFile(String error) { - return '无法打开文件:$error'; - } - - @override - String get snackbarViewQueue => '查看队列'; - - @override - String snackbarUrlCopied(String platform) { - return '$platform URL copied to clipboard'; - } - - @override - String get snackbarFileNotFound => 'File not found'; - - @override - String get snackbarSelectExtFile => 'Please select a .spotiflac-ext file'; - - @override - String get snackbarProviderPrioritySaved => 'Provider priority saved'; - - @override - String get snackbarMetadataProviderSaved => - 'Metadata provider priority saved'; - - @override - String snackbarExtensionInstalled(String extensionName) { - return '$extensionName installed.'; - } - - @override - String snackbarExtensionUpdated(String extensionName) { - return '$extensionName updated.'; - } - - @override - String get snackbarFailedToInstall => 'Failed to install extension'; - - @override - String get snackbarFailedToUpdate => 'Failed to update extension'; - - @override - String get errorRateLimited => 'Rate Limited'; - - @override - String get errorRateLimitedMessage => '请求过多。请等一会再搜索。'; - - @override - String get errorNoTracksFound => '未找到曲目'; - - @override - String get searchEmptyResultSubtitle => 'Try another keyword'; - - @override - String get errorUrlNotRecognized => 'Link not recognized'; - - @override - String get errorUrlNotRecognizedMessage => - 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; - - @override - String get errorUrlFetchFailed => - 'Failed to load content from this link. Please try again.'; - - @override - String errorMissingExtensionSource(String item) { - return 'Cannot load $item: missing extension source'; - } - - @override - String get actionPause => 'Pause'; - - @override - String get actionResume => 'Resume'; - - @override - String get actionCancel => 'Cancel'; - - @override - String get actionSelectAll => 'Select All'; - - @override - String get actionDeselect => 'Deselect'; - - @override - String selectionSelected(int count) { - return '$count selected'; - } - - @override - String get selectionAllSelected => 'All tracks selected'; - - @override - String get selectionSelectToDelete => 'Select tracks to delete'; - - @override - String progressFetchingMetadata(int current, int total) { - return 'Fetching metadata... $current/$total'; - } - - @override - String get progressReadingCsv => 'Reading CSV...'; - - @override - String get searchSongs => 'Songs'; - - @override - String get searchArtists => 'Artists'; - - @override - String get searchAlbums => 'Albums'; - - @override - String get searchPlaylists => 'Playlists'; - - @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 => 'Play'; - - @override - String get filenameFormat => 'Filename Format'; - - @override - String get filenameShowAdvancedTags => 'Show advanced tags'; - - @override - String get filenameShowAdvancedTagsDescription => - 'Enable formatted tags for track padding and date patterns'; - - @override - String get folderOrganizationNone => 'No organization'; - - @override - String get folderOrganizationByPlaylist => 'By Playlist'; - - @override - String get folderOrganizationByPlaylistSubtitle => - 'Separate folder for each playlist'; - - @override - String get folderOrganizationByArtist => 'By Artist'; - - @override - String get folderOrganizationByAlbum => 'By Album'; - - @override - String get folderOrganizationByArtistAlbum => 'Artist/Album'; - - @override - String get folderOrganizationDescription => - 'Organize downloaded files into folders'; - - @override - String get folderOrganizationNoneSubtitle => 'All files in download folder'; - - @override - String get folderOrganizationByArtistSubtitle => - 'Separate folder for each artist'; - - @override - String get folderOrganizationByAlbumSubtitle => - 'Separate folder for each album'; - - @override - String get folderOrganizationByArtistAlbumSubtitle => - 'Nested folders for artist and album'; - - @override - String get updateAvailable => 'Update Available'; - - @override - String get updateLater => 'Later'; - - @override - String get updateStartingDownload => 'Starting download...'; - - @override - String get updateDownloadFailed => 'Download failed'; - - @override - String get updateFailedMessage => 'Failed to download update'; - - @override - String get updateNewVersionReady => 'A new version is ready'; - - @override - String get updateCurrent => 'Current'; - - @override - String get updateNew => 'New'; - - @override - String get updateDownloading => 'Downloading...'; - - @override - String get updateWhatsNew => 'What\'s New'; - - @override - String get updateDownloadInstall => 'Download & Install'; - - @override - String get updateDontRemind => 'Don\'t remind'; - - @override - String get providerPriorityTitle => 'Provider Priority'; - - @override - String get providerPriorityDescription => - 'Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.'; - - @override - String get providerPriorityInfo => - 'If a track is not available on the first provider, the app will automatically try the next one.'; - - @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 providerExtension => 'Extension'; - - @override - String get metadataProviderPriorityTitle => 'Metadata Priority'; - - @override - String get metadataProviderPriorityDescription => - 'Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.'; - - @override - String get metadataProviderPriorityInfo => - 'Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.'; - - @override - String get logTitle => 'Logs'; - - @override - String get logCopied => 'Logs copied to clipboard'; - - @override - String get logSearchHint => 'Search logs...'; - - @override - String get logFilterLevel => 'Level'; - - @override - String get logFilterSection => 'Filter'; - - @override - String get logShareLogs => 'Share logs'; - - @override - String get logClearLogs => 'Clear logs'; - - @override - String get logClearLogsTitle => 'Clear Logs'; - - @override - String get logClearLogsMessage => 'Are you sure you want to clear all logs?'; - - @override - String get logFilterBySeverity => 'Filter logs by severity'; - - @override - String get logNoLogsYet => 'No logs yet'; - - @override - String get logNoLogsYetSubtitle => 'Logs will appear here as you use the app'; - - @override - String logEntriesFiltered(int count) { - return 'Entries ($count filtered)'; - } - - @override - String logEntries(int count) { - return 'Entries ($count)'; - } - - @override - String get channelStable => 'Stable'; - - @override - String get channelPreview => 'Preview'; - - @override - String get sectionSearchSource => 'Search Source'; - - @override - String get sectionDownload => 'Download'; - - @override - String get sectionPerformance => 'Performance'; - - @override - String get sectionApp => 'App'; - - @override - String get sectionData => 'Data'; - - @override - String get sectionDebug => 'Debug'; - - @override - String get sectionService => 'Service'; - - @override - String get sectionAudioQuality => 'Audio Quality'; - - @override - String get sectionFileSettings => 'File Settings'; - - @override - String get sectionLyrics => 'Lyrics'; - - @override - String get lyricsMode => 'Lyrics Mode'; - - @override - String get lyricsModeDescription => - 'Choose how lyrics are saved with your downloads'; - - @override - String get lyricsModeEmbed => 'Embed in file'; - - @override - String get lyricsModeEmbedSubtitle => 'Lyrics stored inside FLAC metadata'; - - @override - String get lyricsModeExternal => 'External .lrc file'; - - @override - String get lyricsModeExternalSubtitle => - 'Separate .lrc file for players like Samsung Music'; - - @override - String get lyricsModeBoth => 'Both'; - - @override - String get lyricsModeBothSubtitle => 'Embed and save .lrc file'; - - @override - String get sectionColor => 'Color'; - - @override - String get sectionTheme => 'Theme'; - - @override - String get sectionLayout => 'Layout'; - - @override - String get sectionLanguage => 'Language'; - - @override - String get appearanceLanguage => 'App Language'; - - @override - String get settingsAppearanceSubtitle => 'Theme, colors, display'; - - @override - String get settingsDownloadSubtitle => 'Service, quality, fallback'; - - @override - String get settingsExtensionsSubtitle => 'Manage download providers'; - - @override - String get settingsLogsSubtitle => 'View app logs for debugging'; - - @override - String get loadingSharedLink => 'Loading shared link...'; - - @override - String get pressBackAgainToExit => 'Press back again to exit'; - - @override - String downloadAllCount(int count) { - return 'Download All ($count)'; - } - - @override - String tracksCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count tracks', - one: '1 track', - ); - return '$_temp0'; - } - - @override - String get trackCopyFilePath => 'Copy file path'; - - @override - String get trackRemoveFromDevice => 'Remove from device'; - - @override - String get trackLoadLyrics => 'Load Lyrics'; - - @override - String get trackMetadata => 'Metadata'; - - @override - String get trackFileInfo => 'File Info'; - - @override - String get trackLyrics => 'Lyrics'; - - @override - String get trackFileNotFound => 'File not found'; - - @override - String get trackOpenInDeezer => 'Open in Deezer'; - - @override - String get trackOpenInSpotify => 'Open in Spotify'; - - @override - String get trackTrackName => 'Track name'; - - @override - String get trackArtist => 'Artist'; - - @override - String get trackAlbumArtist => 'Album artist'; - - @override - String get trackAlbum => 'Album'; - - @override - String get trackTrackNumber => 'Track number'; - - @override - String get trackDiscNumber => 'Disc number'; - - @override - String get trackDuration => 'Duration'; - - @override - String get trackAudioQuality => 'Audio quality'; - - @override - String get trackReleaseDate => 'Release date'; - - @override - String get trackGenre => 'Genre'; - - @override - String get trackLabel => 'Label'; - - @override - String get trackCopyright => 'Copyright'; - - @override - String get trackDownloaded => 'Downloaded'; - - @override - String get trackCopyLyrics => 'Copy lyrics'; - - @override - String trackLyricsSource(String source) { - return 'Source: $source'; - } - - @override - String get trackLyricsNotAvailable => 'Lyrics not available for this track'; - - @override - String get trackLyricsNotInFile => 'No lyrics found in this file'; - - @override - String get trackFetchOnlineLyrics => 'Fetch from Online'; - - @override - String get trackLyricsTimeout => 'Request timed out. Try again later.'; - - @override - String get trackLyricsLoadFailed => 'Failed to load lyrics'; - - @override - String get trackEmbedLyrics => 'Embed Lyrics'; - - @override - String get trackLyricsEmbedded => 'Lyrics embedded successfully'; - - @override - String get trackInstrumental => 'Instrumental track'; - - @override - String get trackCopiedToClipboard => 'Copied to clipboard'; - - @override - String get trackDeleteConfirmTitle => 'Remove from device?'; - - @override - String get trackDeleteConfirmMessage => - 'This will permanently delete the downloaded file and remove it from your history.'; - - @override - String get dateToday => 'Today'; - - @override - String get dateYesterday => 'Yesterday'; - - @override - String dateDaysAgo(int count) { - return '$count days ago'; - } - - @override - String dateWeeksAgo(int count) { - return '$count weeks ago'; - } - - @override - String dateMonthsAgo(int count) { - return '$count months ago'; - } - - @override - String get storeFilterAll => 'All'; - - @override - String get storeFilterMetadata => 'Metadata'; - - @override - String get storeFilterDownload => 'Download'; - - @override - String get storeFilterUtility => 'Utility'; - - @override - String get storeFilterLyrics => 'Lyrics'; - - @override - String get storeFilterIntegration => 'Integration'; - - @override - String get storeClearFilters => 'Clear filters'; - - @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 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 extensionId => 'ID'; - - @override - String get extensionError => 'Error'; - - @override - String get extensionCapabilities => 'Capabilities'; - - @override - String get extensionMetadataProvider => 'Metadata Provider'; - - @override - String get extensionDownloadProvider => 'Download Provider'; - - @override - String get extensionLyricsProvider => 'Lyrics Provider'; - - @override - String get extensionUrlHandler => 'URL Handler'; - - @override - String get extensionQualityOptions => 'Quality Options'; - - @override - String get extensionPostProcessingHooks => 'Post-Processing Hooks'; - - @override - String get extensionPermissions => 'Permissions'; - - @override - String get extensionSettings => 'Settings'; - - @override - String get extensionRemoveButton => 'Remove Extension'; - - @override - String get extensionUpdated => 'Updated'; - - @override - String get extensionMinAppVersion => 'Min App Version'; - - @override - String get extensionCustomTrackMatching => 'Custom Track Matching'; - - @override - String get extensionPostProcessing => 'Post-Processing'; - - @override - String extensionHooksAvailable(int count) { - return '$count hook(s) available'; - } - - @override - String extensionPatternsCount(int count) { - return '$count pattern(s)'; - } - - @override - String extensionStrategy(String strategy) { - return 'Strategy: $strategy'; - } - - @override - String get extensionsProviderPrioritySection => 'Provider Priority'; - - @override - String get extensionsInstalledSection => 'Installed Extensions'; - - @override - String get extensionsNoExtensions => 'No extensions installed'; - - @override - String get extensionsNoExtensionsSubtitle => - 'Install .spotiflac-ext files to add new providers'; - - @override - String get extensionsInstallButton => 'Install Extension'; - - @override - String get extensionsInfoTip => - 'Extensions can add new metadata and download providers. Only install extensions from trusted sources.'; - - @override - String get extensionsInstalledSuccess => 'Extension installed successfully'; - - @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 => 'Download Priority'; - - @override - String get extensionsDownloadPrioritySubtitle => 'Set download service order'; - - @override - String get extensionsFallbackTitle => 'Fallback Extensions'; - - @override - String get extensionsFallbackSubtitle => - 'Choose which installed download extensions can be used as fallback'; - - @override - String get extensionsNoDownloadProvider => - 'No extensions with download provider'; - - @override - String get extensionsMetadataPriority => 'Metadata Priority'; - - @override - String get extensionsMetadataPrioritySubtitle => - 'Set search & metadata source order'; - - @override - String get extensionsNoMetadataProvider => - 'No extensions with metadata provider'; - - @override - String get extensionsSearchProvider => 'Search Provider'; - - @override - String get extensionsNoCustomSearch => 'No extensions with custom search'; - - @override - String get extensionsSearchProviderDescription => - 'Choose which service to use for searching tracks'; - - @override - String get extensionsCustomSearch => 'Custom search'; - - @override - String get extensionsErrorLoading => 'Error loading extension'; - - @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 / up to 96kHz'; - - @override - String get qualityHiResFlacMax => 'Hi-Res FLAC Max'; - - @override - String get qualityHiResFlacMaxSubtitle => '24-bit / up to 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 downloadAskBeforeDownload => 'Ask Before Download'; - - @override - String get downloadDirectory => 'Download Directory'; - - @override - String get downloadSeparateSinglesFolder => 'Separate Singles Folder'; - - @override - String get downloadAlbumFolderStructure => 'Album Folder Structure'; - - @override - String get albumFolderStructureDescription => - 'Choose how album folders are structured'; - - @override - String get downloadUseAlbumArtistForFolders => 'Use Album Artist for folders'; - - @override - String get downloadUsePrimaryArtistOnly => 'Primary artist only for folders'; - - @override - String get downloadUsePrimaryArtistOnlyEnabled => - 'Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)'; - - @override - String get downloadUsePrimaryArtistOnlyDisabled => - 'Full artist string used for folder name'; - - @override - String get downloadSelectQuality => 'Select Quality'; - - @override - String get downloadFrom => 'Download From'; - - @override - String get appearanceAmoledDark => 'AMOLED Dark'; - - @override - String get appearanceAmoledDarkSubtitle => 'Pure black background'; - - @override - String get queueClearAll => 'Clear All'; - - @override - String get queueClearAllMessage => - 'Are you sure you want to clear all downloads?'; - - @override - String get settingsAutoExportFailed => 'Auto-export failed downloads'; - - @override - String get settingsAutoExportFailedSubtitle => - 'Save failed downloads to TXT file automatically'; - - @override - String get settingsDownloadNetwork => 'Download Network'; - - @override - String get settingsDownloadNetworkAny => 'WiFi + Mobile Data'; - - @override - String get settingsDownloadNetworkWifiOnly => 'WiFi Only'; - - @override - String get settingsDownloadNetworkSubtitle => - 'Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.'; - - @override - String get albumFolderArtistAlbum => 'Artist / Album'; - - @override - String get albumFolderArtistAlbumSubtitle => 'Albums/Artist Name/Album Name/'; - - @override - String get albumFolderArtistYearAlbum => 'Artist / [Year] Album'; - - @override - String get albumFolderArtistYearAlbumSubtitle => - 'Albums/Artist Name/[2005] Album Name/'; - - @override - String get albumFolderAlbumOnly => 'Album Only'; - - @override - String get albumFolderAlbumOnlySubtitle => 'Albums/Album Name/'; - - @override - String get albumFolderYearAlbum => '[Year] Album'; - - @override - String get albumFolderYearAlbumSubtitle => 'Albums/[2005] Album Name/'; - - @override - String get albumFolderArtistAlbumSingles => 'Artist / Album + Singles'; - - @override - String get albumFolderArtistAlbumSinglesSubtitle => - 'Artist/Album/ and Artist/Singles/'; - - @override - String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; - - @override - String get albumFolderArtistAlbumFlatSubtitle => - 'Artist/Album/ and Artist/song.flac'; - - @override - String get downloadedAlbumDeleteSelected => 'Delete Selected'; - - @override - String downloadedAlbumDeleteMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0 from this album?\n\nThis will also delete the files from storage.'; - } - - @override - String downloadedAlbumSelectedCount(int count) { - return '$count selected'; - } - - @override - String get downloadedAlbumTapToSelect => 'Tap tracks to select'; - - @override - String downloadedAlbumDeleteCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0'; - } - - @override - String get downloadedAlbumSelectToDelete => 'Select tracks to delete'; - - @override - String downloadedAlbumDiscHeader(int discNumber) { - return 'Disc $discNumber'; - } - - @override - String get recentTypeArtist => 'Artist'; - - @override - String get recentTypeAlbum => 'Album'; - - @override - String get recentTypeSong => 'Song'; - - @override - String get recentTypePlaylist => 'Playlist'; - - @override - String get recentEmpty => 'No recent items yet'; - - @override - String get recentShowAllDownloads => 'Show All Downloads'; - - @override - String recentPlaylistInfo(String name) { - return 'Playlist: $name'; - } - - @override - String get discographyDownload => 'Download Discography'; - - @override - String get discographyDownloadAll => 'Download All'; - - @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 => - 'Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.'; - - @override - String libraryTracksUnit(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$_temp0'; - } - - @override - String 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 => 'Welcome to SpotiFLAC!'; - - @override - String get tutorialWelcomeDesc => - 'Let\'s learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.'; - - @override - String get tutorialWelcomeTip1 => - 'Download music from Spotify, Deezer, or paste any supported URL'; - - @override - String get tutorialWelcomeTip2 => - 'Get FLAC quality audio from installed download extensions'; - - @override - String get tutorialWelcomeTip3 => - 'Automatic metadata, cover art, and lyrics embedding'; - - @override - String get tutorialSearchTitle => 'Finding Music'; - - @override - String get tutorialSearchDesc => - 'There are two easy ways to find music you want to download.'; - - @override - String get tutorialDownloadTitle => 'Downloading Music'; - - @override - String get tutorialDownloadDesc => - 'Downloading music is simple and fast. Here\'s how it works.'; - - @override - String get tutorialLibraryTitle => 'Your Library'; - - @override - String get tutorialLibraryDesc => - 'All your downloaded music is organized in the Library tab.'; - - @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 trackSaveLyrics => 'Save Lyrics (.lrc)'; - - @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 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 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 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 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 collectionPlaylist => 'Playlist'; - - @override - String get collectionAddToPlaylist => 'Add to playlist'; - - @override - String get collectionCreatePlaylist => 'Create playlist'; - - @override - String get collectionNoPlaylistsYet => 'No playlists yet'; - - @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 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 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 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 selectionBatchConvertSuccess(int success, int total, String format) { - return 'Converted $success of $total tracks to $format'; - } - - @override - String downloadedAlbumDownloadedCount(int count) { - return '$count downloaded'; - } - - @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 => 'Backup & Restore'; - - @override - String get settingsBackupSubtitle => - 'Move your library, history and settings to a new device'; - - @override - String get backupTitle => 'Backup & Restore'; - - @override - String get backupExportSectionTitle => 'Create backup'; - - @override - String get backupExportSectionDescription => - 'Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.'; - - @override - String get backupExportButton => 'Create backup file'; - - @override - String get backupImportSectionTitle => 'Restore backup'; - - @override - String get backupImportSectionDescription => - 'Pick a backup file to restore your data. This replaces the current settings, history and library on this device.'; - - @override - String get backupImportButton => 'Choose backup file'; - - @override - String get backupCreated => 'Backup created'; - - @override - String get backupCreateFailed => 'Failed to create backup'; - - @override - String get backupRestoreConfirmTitle => 'Restore this backup?'; - - @override - String get backupRestoreConfirmMessage => - 'This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.'; - - @override - String get backupRestoreConfirmButton => 'Restore'; - - @override - String get backupRestored => 'Backup restored successfully'; - - @override - String get backupRestoreFailed => 'Failed to restore backup'; - - @override - String get backupInvalidFile => 'This file is not a valid SpotiFLAC backup'; - - @override - String get backupRestoreRestartHint => - 'Restart the app to make sure every change is applied.'; - - @override - String get backupContentsTitle => 'Backup contents'; - - @override - String get backupContentsSettings => 'App settings'; - - @override - String backupContentsHistory(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'items', - one: 'item', - ); - return '$count history $_temp0'; - } - - @override - String backupContentsLiked(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$count liked $_temp0'; - } - - @override - String backupContentsWishlist(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$count wishlist $_temp0'; - } - - @override - String backupContentsPlaylists(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count playlists', - one: '1 playlist', - ); - return '$_temp0'; - } - - @override - String backupContentsArtists(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count favorite artists', - one: '1 favorite artist', - ); - return '$_temp0'; - } - - @override - String backupContentsExtensions(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count extensions', - one: '1 extension', - ); - return '$_temp0'; - } - - @override - String get backupIncludeSecrets => 'Include extension credentials'; - - @override - String get backupIncludeSecretsDescription => - 'Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.'; - - @override - String backupExtensionsRestoreFailed(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'extensions', - one: 'extension', - ); - return '$count $_temp0 could not be reinstalled. Install them manually from the repo.'; - } - - @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 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 => 'Allow Local Network Access'; - - @override - String get downloadAllowLocalNetworkEnabled => - 'Requests to local/private addresses are allowed (for local proxy or custom DNS)'; - - @override - String get downloadAllowLocalNetworkDisabled => - 'Local/private addresses are blocked for security'; - - @override - String get downloadSelectServiceToEnable => - 'Select a provider with quality options to enable this option'; - - @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 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 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 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 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 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 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 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 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 => '用于扩展下载的 Android 后台服务'; - - @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 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 => 'Playback'; - - @override - String get libraryExternalPlayer => 'External player'; - - @override - String get libraryExternalPlayerSubtitle => - 'Recommended for listening, best quality, gapless playback, EQ, and wider format support'; - - @override - String get libraryBuiltInPreviewPlayer => 'Built-in preview player'; - - @override - String get libraryBuiltInPreviewPlayerSubtitle => - 'Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening'; - - @override - String get libraryBuiltInPlayerInfo => - 'The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.'; - - @override - String get nowPlayingTitle => 'Now Playing'; - - @override - String get nowPlayingNothingPlaying => 'Nothing is playing'; - - @override - String get nowPlayingMinimize => 'Minimize'; - - @override - String get nowPlayingUpNext => 'Up next'; - - @override - String get nowPlayingDetails => 'Details'; - - @override - String get nowPlayingOpenInExternalPlayer => 'Open in external player'; - - @override - String get nowPlayingTabPlayer => 'Player'; - - @override - String get nowPlayingTabLyrics => 'Lyrics'; - - @override - String get nowPlayingNoLyrics => 'No lyrics in this file'; - - @override - String get nowPlayingLibraryEmpty => 'Your library is empty'; - - @override - String nowPlayingShuffleLibraryFailed(String error) { - return 'Could not shuffle library: $error'; - } - - @override - String get nowPlayingShuffleOn => 'Shuffle on'; - - @override - String get nowPlayingPlayInOrder => 'Play in order'; - - @override - String get nowPlayingShuffleLibrary => 'Shuffle library'; - - @override - String get nowPlayingQueueEmpty => 'Queue is empty'; - - @override - String get nowPlayingNoMetadata => 'No metadata available'; - - @override - String get announcementUnableToOpenLink => - 'Unable to open link. Please try again.'; - - @override - String trackConvertLosslessOutputWithCap(String quality) { - return 'Lossless output with $quality cap'; - } - - @override - String trackConvertConfirmMessageLosslessCapped( - String sourceFormat, - String targetFormat, - String quality, - ) { - return 'Convert from $sourceFormat to $targetFormat ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.'; - } - - @override - String selectionBatchConvertConfirmMessageLosslessCapped( - int count, - String format, - String quality, - ) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Convert $count $_temp0 to $format ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.'; - } - - @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 => - 'Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius'; - - @override - String get snackbarPlayingNext => 'Playing next'; - - @override - String get snackbarAddedToQueueGeneric => 'Added to queue'; - - @override - String selectionDeletePlaylistsCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'playlists', - one: 'playlist', - ); - return 'Delete $count $_temp0'; - } - - @override - String get actionShuffle => 'Shuffle'; - - @override - String get downloadPrimaryArtistOnlyOn => 'Primary only: On'; - - @override - String get downloadPrimaryArtistOnlyOff => 'Primary only: Off'; - - @override - String get downloadAlbumArtistMetadataPrimaryOnly => - 'Album Artist metadata: Primary only'; - - @override - String get downloadAlbumArtistMetadataFull => 'Album Artist metadata: Full'; - - @override - String get trackConvertOriginal => 'Original'; - - @override - String get trackConvertOriginalQuality => 'Original quality'; - - @override - String get trackConvertLosslessSuffix => 'Lossless'; - - @override - String get trackConvertDithering => 'Dithering'; - - @override - String get trackConvertResampler => 'Resampler'; - - @override - String get trackConvertDitherNone => 'None'; - - @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 => 'See release notes for details.'; - - @override - String get unknownTitle => 'Unknown title'; - - @override - String get trackPlayNext => 'Play next'; - - @override - String get trackAddToQueue => 'Add to queue'; - - @override - String snackbarExtensionInstalledEnable(String extensionName) { - return '$extensionName installed. Enable it in Settings > Extensions'; - } - - @override - String snackbarExtensionUpdatedVersion(String extensionName, String version) { - return '$extensionName updated to v$version'; - } - - @override - String snackbarFailedToInstallNamed(String extensionName) { - return 'Failed to install $extensionName'; - } - - @override - String snackbarFailedToUpdateNamed(String extensionName) { - return 'Failed to update $extensionName'; - } - - @override - String get releaseTypeEp => 'EP'; - - @override - String get releaseTypeSingle => 'Single'; - - @override - String get trackCoverOnline => 'Online cover'; - - @override - String get regionCountryUS => 'United States'; - - @override - String get regionCountryGB => 'United Kingdom'; - - @override - String get regionCountryFR => 'France'; - - @override - String get regionCountryDE => 'Germany'; - - @override - String get regionCountryJP => 'Japan'; - - @override - String get regionCountryKR => 'South Korea'; - - @override - String get regionCountryIN => 'India'; - - @override - String get regionCountryID => 'Indonesia'; - - @override - String get regionCountryBR => 'Brazil'; - - @override - String get regionCountryMX => 'Mexico'; - - @override - String get regionCountryAU => 'Australia'; - - @override - String get regionCountryCA => 'Canada'; - - @override - String get regionCountryXK => 'Kosovo'; - - @override - String get extensionVerificationBrowserTitle => 'Verification browser'; - - @override - String get extensionVerificationBrowserSubtitleExternal => - 'Open challenges in the default browser first'; - - @override - String get extensionVerificationBrowserSubtitleInApp => - 'Open challenges in the in-app browser first'; - - @override - String get extensionVerificationBrowserExternal => 'External'; - - @override - String get extensionVerificationBrowserInApp => 'In-app'; - - @override - String get extensionVerificationHelpTitleManual => - 'Open verification manually'; - - @override - String get extensionVerificationHelpTitleWaiting => - 'Verification still waiting'; - - @override - String get extensionVerificationHelpMessageManual => - 'SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.'; - - @override - String get extensionVerificationHelpMessageWaiting => - 'If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.'; - - @override - String get extensionVerificationClose => 'Close'; - - @override - String get extensionVerificationCopyLink => 'Copy link'; - - @override - String get extensionVerificationLinkCopied => 'Verification link copied'; - - @override - String get extensionVerificationOpenBrowser => 'Open browser'; -} - -/// The translations for Chinese, as used in Taiwan (`zh_TW`). -class AppLocalizationsZhTw extends AppLocalizationsZh { - AppLocalizationsZhTw() : super('zh_TW'); - - @override - String get appName => 'SpotiFLAC Mobile'; - - @override - String get navHome => 'Home'; - - @override - String get navLibrary => 'Library'; - - @override - String get navSettings => 'Settings'; - - @override - String get navStore => 'Repo'; - - @override - String get homeTitle => 'Home'; - - @override - String get homeSubtitle => 'Paste a supported URL or search by name'; - - @override - String get homeEmptyTitle => 'No search providers yet'; - - @override - String get homeEmptySubtitle => 'Install an extension to continue.'; - - @override - String get homeSupports => 'Supports: Track, Album, Playlist, Artist URLs'; - - @override - String get homeRecent => '最新的'; - - @override - String get historyFilterAll => 'All'; - - @override - String get historyFilterAlbums => 'Albums'; - - @override - String get historyFilterSingles => 'Singles'; - - @override - String get historySearchHint => 'Search history...'; - - @override - String get settingsTitle => 'Settings'; - - @override - String get settingsDownload => 'Download'; - - @override - String get settingsAppearance => 'Appearance'; - - @override - String get settingsExtensions => 'Extensions'; - - @override - String get settingsAbout => 'About'; - - @override - String get downloadTitle => 'Download'; - - @override - String get downloadAskQualitySubtitle => - 'Show quality picker for each download'; - - @override - String get downloadFilenameFormat => 'Filename Format'; - - @override - String get downloadSingleFilenameFormat => 'Single Filename Format'; - - @override - String get downloadSingleFilenameFormatDescription => - 'Filename pattern for singles and EPs. Uses the same tags as the album format.'; - - @override - String get downloadFolderOrganization => 'Folder Organization'; - - @override - String get appearanceTitle => 'Appearance'; - - @override - String get appearanceThemeSystem => 'System'; - - @override - String get appearanceThemeLight => 'Light'; - - @override - String get appearanceThemeDark => 'Dark'; - - @override - String get appearanceDynamicColor => 'Dynamic Color'; - - @override - String get appearanceDynamicColorSubtitle => 'Use colors from your wallpaper'; - - @override - String get appearanceHistoryView => 'History View'; - - @override - String get appearanceHistoryViewList => 'List'; - - @override - String get appearanceHistoryViewGrid => 'Grid'; - - @override - String get optionsPrimaryProvider => 'Primary Provider'; - - @override - String get optionsPrimaryProviderSubtitle => - 'Service used for searching by track or album name'; - - @override - String optionsUsingExtension(String extensionName) { - return 'Using extension: $extensionName'; - } - - @override - String get optionsDefaultSearchTab => 'Default Search Tab'; - - @override - String get optionsDefaultSearchTabSubtitle => - 'Choose which tab opens first for new search results.'; - - @override - String get optionsAutoFallback => 'Auto Fallback'; - - @override - String get optionsAutoFallbackSubtitle => - 'Try other services if download fails'; - - @override - String get optionsEmbedLyrics => 'Embed Lyrics'; - - @override - String get optionsEmbedLyricsSubtitle => - 'Save synced lyrics alongside your downloaded tracks'; - - @override - String get optionsMaxQualityCover => 'Max Quality Cover'; - - @override - String get optionsMaxQualityCoverSubtitle => - 'Download highest resolution cover art'; - - @override - String get optionsReplayGain => 'ReplayGain'; - - @override - String get optionsReplayGainSubtitleOn => - 'Scan loudness and embed ReplayGain tags (EBU R128)'; - - @override - String get optionsReplayGainSubtitleOff => - 'Disabled: no loudness normalization tags'; - - @override - String get trackReplayGain => 'Rescan ReplayGain'; - - @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 => 'Artist Tag Mode'; - - @override - String get optionsArtistTagModeDescription => - 'Choose how multiple artists are written into embedded tags.'; - - @override - String get optionsArtistTagModeJoined => 'Single joined value'; - - @override - String get optionsArtistTagModeJoinedSubtitle => - 'Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.'; - - @override - String get optionsArtistTagModeSplitVorbis => 'Split tags for FLAC/Opus'; - - @override - String get optionsArtistTagModeSplitVorbisSubtitle => - 'Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.'; - - @override - String get optionsExtensionStore => 'Extension Repo'; - - @override - String get optionsExtensionStoreSubtitle => 'Show Repo tab in navigation'; - - @override - String get optionsCheckUpdates => 'Check for Updates'; - - @override - String get optionsCheckUpdatesSubtitle => - 'Notify when new version is available'; - - @override - String get optionsUpdateChannel => 'Update Channel'; - - @override - String get optionsUpdateChannelStable => 'Stable releases only'; - - @override - String get optionsUpdateChannelPreview => 'Get preview releases'; - - @override - String get optionsUpdateChannelWarning => - 'Preview may contain bugs or incomplete features'; - - @override - String get optionsClearHistory => 'Clear Download History'; - - @override - String get optionsClearHistorySubtitle => - 'Remove all downloaded tracks from history'; - - @override - String get optionsDetailedLogging => 'Detailed Logging'; - - @override - String get optionsDetailedLoggingOn => 'Detailed logs are being recorded'; - - @override - String get optionsDetailedLoggingOff => 'Enable for bug reports'; - - @override - String get extensionsTitle => 'Extensions'; - - @override - String get extensionsDisabled => 'Disabled'; - - @override - String extensionsVersion(String version) { - return 'Version $version'; - } - - @override - String get extensionsUninstall => 'Uninstall'; - - @override - String get storeTitle => 'Extension Repo'; - - @override - String get storeSearch => 'Search extensions...'; - - @override - String get storeInstall => 'Install'; - - @override - String get storeInstalled => 'Installed'; - - @override - String get storeUpdate => 'Update'; - - @override - String get aboutTitle => 'About'; - - @override - String get aboutContributors => 'Contributors'; - - @override - String get aboutMobileDeveloper => 'Mobile version developer'; - - @override - String get aboutOriginalCreator => 'Creator of the original SpotiFLAC'; - - @override - String get aboutLogoArtist => - 'The talented artist who created our beautiful app logo!'; - - @override - String get aboutTranslators => 'Translators'; - - @override - String get aboutSpecialThanks => 'Special Thanks'; - - @override - String get aboutLinks => 'Links'; - - @override - String get aboutMobileSource => 'Mobile source code'; - - @override - String get aboutPCSource => 'PC source code'; - - @override - String get aboutKeepAndroidOpen => 'Keep Android Open'; - - @override - String get aboutReportIssue => 'Report an issue'; - - @override - String get aboutReportIssueSubtitle => 'Report any problems you encounter'; - - @override - String get aboutFeatureRequest => 'Feature request'; - - @override - String get aboutFeatureRequestSubtitle => 'Suggest new features for the app'; - - @override - String get aboutTelegramChannel => 'Telegram Channel'; - - @override - String get aboutTelegramChannelSubtitle => 'Announcements and updates'; - - @override - String get aboutTelegramChat => 'Telegram Community'; - - @override - String get aboutTelegramChatSubtitle => 'Chat with other users'; - - @override - String get aboutSocial => 'Social'; - - @override - String get aboutApp => 'App'; - - @override - String get aboutVersion => 'Version'; - - @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 => - 'Creator of I Don\'t Have Spotify (IDHS). The fallback link resolver that saves the day!'; - - @override - String get aboutAppDescription => - 'Search music metadata, manage extensions, and organize your library.'; - - @override - String get artistAlbums => 'Albums'; - - @override - String get artistSingles => 'Singles & EPs'; - - @override - String get artistCompilations => 'Compilations'; - - @override - String get artistPopular => 'Popular'; - - @override - String artistMonthlyListeners(String count) { - return '$count monthly listeners'; - } - - @override - String get trackMetadataService => 'Service'; - - @override - String get trackMetadataPlay => 'Play'; - - @override - String get trackMetadataShare => 'Share'; - - @override - String get trackMetadataDelete => 'Delete'; - - @override - String get setupGrantPermission => 'Grant Permission'; - - @override - String get setupSkip => 'Skip for now'; - - @override - String get setupStorageAccessRequired => 'Storage Access Required'; - - @override - String get setupStorageAccessMessageAndroid11 => - 'Android 11+ requires \"All files access\" permission to save files to your chosen download folder.'; - - @override - String get setupOpenSettings => 'Open Settings'; - - @override - String get setupPermissionDeniedMessage => - 'Permission denied. Please grant all permissions to continue.'; - - @override - String setupPermissionRequired(String permissionType) { - return '$permissionType Permission Required'; - } - - @override - String setupPermissionRequiredMessage(String permissionType) { - return '$permissionType permission is required for the best experience. You can change this later in Settings.'; - } - - @override - String get setupUseDefaultFolder => 'Use Default Folder?'; - - @override - String get setupNoFolderSelected => - 'No folder selected. Would you like to use the default Music folder?'; - - @override - String get setupUseDefault => 'Use Default'; - - @override - String get setupDownloadLocationTitle => 'Download Location'; - - @override - String get setupDownloadLocationIosMessage => - 'On iOS, downloads are saved to the app\'s Documents folder. You can access them via the Files app.'; - - @override - String get setupAppDocumentsFolder => 'App Documents Folder'; - - @override - String get setupAppDocumentsFolderSubtitle => - 'Recommended - accessible via Files app'; - - @override - String get setupChooseFromFiles => 'Choose from Files'; - - @override - String get setupChooseFromFilesSubtitle => 'Select iCloud or other location'; - - @override - String get setupIosEmptyFolderWarning => - 'iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.'; - - @override - String get setupIcloudNotSupported => - 'iCloud Drive is not supported. Please use the app Documents folder.'; - - @override - String get setupDownloadInFlac => 'Download Spotify tracks in FLAC'; - - @override - String get setupStorageGranted => 'Storage Permission Granted!'; - - @override - String get setupStorageRequired => 'Storage Permission Required'; - - @override - String get setupStorageDescription => - 'SpotiFLAC needs storage permission to save your downloaded music files.'; - - @override - String get setupNotificationGranted => 'Notification Permission Granted!'; - - @override - String get setupNotificationEnable => 'Enable Notifications'; - - @override - String get setupFolderChoose => 'Choose Download Folder'; - - @override - String get setupFolderDescription => - 'Select a folder where your downloaded music will be saved.'; - - @override - String get setupSelectFolder => 'Select Folder'; - - @override - String get setupEnableNotifications => 'Enable Notifications'; - - @override - String get setupNotificationBackgroundDescription => - 'Get notified about download progress and completion. This helps you track downloads when the app is in background.'; - - @override - String get setupSkipForNow => 'Skip for now'; - - @override - String get setupNext => 'Next'; - - @override - String get setupGetStarted => 'Get Started'; - - @override - String get setupAllowAccessToManageFiles => - 'Please enable \"Allow access to manage all files\" in the next screen.'; - - @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 => 'Cancel'; - - @override - String get dialogSave => 'Save'; - - @override - String get dialogDelete => 'Delete'; - - @override - String get dialogRetry => 'Retry'; - - @override - String get dialogClear => 'Clear'; - - @override - String get dialogDone => 'Done'; - - @override - String get dialogImport => 'Import'; - - @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 => 'Discard'; - - @override - String get dialogRemove => 'Remove'; - - @override - String get dialogUninstall => 'Uninstall'; - - @override - String get dialogDiscardChanges => 'Discard Changes?'; - - @override - String get dialogUnsavedChanges => - 'You have unsaved changes. Do you want to discard them?'; - - @override - String get dialogClearAll => 'Clear All'; - - @override - String get dialogRemoveExtension => 'Remove Extension'; - - @override - String get dialogRemoveExtensionMessage => - 'Are you sure you want to remove this extension? This cannot be undone.'; - - @override - String get dialogUninstallExtension => 'Uninstall Extension?'; - - @override - String dialogUninstallExtensionMessage(String extensionName) { - return 'Are you sure you want to remove $extensionName?'; - } - - @override - String get dialogClearHistoryTitle => 'Clear History'; - - @override - String get dialogClearHistoryMessage => - 'Are you sure you want to clear all download history? This cannot be undone.'; - - @override - String get dialogDeleteSelectedTitle => 'Delete Selected'; - - @override - String dialogDeleteSelectedMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0 from history?\n\nThis will also delete the files from storage.'; - } - - @override - String get dialogImportPlaylistTitle => 'Import Playlist'; - - @override - String dialogImportPlaylistMessage(int count) { - return 'Found $count tracks in CSV. Add them to download queue?'; - } - - @override - String csvImportTracks(int count) { - return '$count tracks from CSV'; - } - - @override - String snackbarAddedToQueue(String trackName) { - return 'Added \"$trackName\" to queue'; - } - - @override - String snackbarAddedTracksToQueue(int count) { - return 'Added $count tracks to queue'; - } - - @override - String snackbarAlreadyDownloaded(String trackName) { - return '\"$trackName\" already downloaded'; - } - - @override - String snackbarAlreadyInLibrary(String trackName) { - return '\"$trackName\" already exists in your library'; - } - - @override - String get snackbarHistoryCleared => 'History cleared'; - - @override - String snackbarDeletedTracks(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Deleted $count $_temp0'; - } - - @override - String snackbarCannotOpenFile(String error) { - return 'Cannot open file: $error'; - } - - @override - String get snackbarViewQueue => 'View Queue'; - - @override - String snackbarUrlCopied(String platform) { - return '$platform URL copied to clipboard'; - } - - @override - String get snackbarFileNotFound => 'File not found'; - - @override - String get snackbarSelectExtFile => 'Please select a .spotiflac-ext file'; - - @override - String get snackbarProviderPrioritySaved => 'Provider priority saved'; - - @override - String get snackbarMetadataProviderSaved => - 'Metadata provider priority saved'; - - @override - String snackbarExtensionInstalled(String extensionName) { - return '$extensionName installed.'; - } - - @override - String snackbarExtensionUpdated(String extensionName) { - return '$extensionName updated.'; - } - - @override - String get snackbarFailedToInstall => 'Failed to install extension'; - - @override - String get snackbarFailedToUpdate => 'Failed to update extension'; - - @override - String get errorRateLimited => 'Rate Limited'; - - @override - String get errorRateLimitedMessage => - 'Too many requests. Please wait a moment before searching again.'; - - @override - String get errorNoTracksFound => 'No tracks found'; - - @override - String get searchEmptyResultSubtitle => 'Try another keyword'; - - @override - String get errorUrlNotRecognized => 'Link not recognized'; - - @override - String get errorUrlNotRecognizedMessage => - 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; - - @override - String get errorUrlFetchFailed => - 'Failed to load content from this link. Please try again.'; - - @override - String errorMissingExtensionSource(String item) { - return 'Cannot load $item: missing extension source'; - } - - @override - String get actionPause => 'Pause'; - - @override - String get actionResume => 'Resume'; - - @override - String get actionCancel => 'Cancel'; - - @override - String get actionSelectAll => 'Select All'; - - @override - String get actionDeselect => 'Deselect'; - - @override - String selectionSelected(int count) { - return '$count selected'; - } - - @override - String get selectionAllSelected => 'All tracks selected'; - - @override - String get selectionSelectToDelete => 'Select tracks to delete'; - - @override - String progressFetchingMetadata(int current, int total) { - return 'Fetching metadata... $current/$total'; - } - - @override - String get progressReadingCsv => 'Reading CSV...'; - - @override - String get searchSongs => 'Songs'; - - @override - String get searchArtists => 'Artists'; - - @override - String get searchAlbums => 'Albums'; - - @override - String get searchPlaylists => 'Playlists'; - - @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 => 'Play'; - - @override - String get filenameFormat => 'Filename Format'; - - @override - String get filenameShowAdvancedTags => 'Show advanced tags'; - - @override - String get filenameShowAdvancedTagsDescription => - 'Enable formatted tags for track padding and date patterns'; - - @override - String get folderOrganizationNone => 'No organization'; - - @override - String get folderOrganizationByPlaylist => 'By Playlist'; - - @override - String get folderOrganizationByPlaylistSubtitle => - 'Separate folder for each playlist'; - - @override - String get folderOrganizationByArtist => 'By Artist'; - - @override - String get folderOrganizationByAlbum => 'By Album'; - - @override - String get folderOrganizationByArtistAlbum => 'Artist/Album'; - - @override - String get folderOrganizationDescription => - 'Organize downloaded files into folders'; - - @override - String get folderOrganizationNoneSubtitle => 'All files in download folder'; - - @override - String get folderOrganizationByArtistSubtitle => - 'Separate folder for each artist'; - - @override - String get folderOrganizationByAlbumSubtitle => - 'Separate folder for each album'; - - @override - String get folderOrganizationByArtistAlbumSubtitle => - 'Nested folders for artist and album'; - - @override - String get updateAvailable => 'Update Available'; - - @override - String get updateLater => 'Later'; - - @override - String get updateStartingDownload => 'Starting download...'; - - @override - String get updateDownloadFailed => 'Download failed'; - - @override - String get updateFailedMessage => 'Failed to download update'; - - @override - String get updateNewVersionReady => 'A new version is ready'; - - @override - String get updateCurrent => 'Current'; - - @override - String get updateNew => 'New'; - - @override - String get updateDownloading => 'Downloading...'; - - @override - String get updateWhatsNew => 'What\'s New'; - - @override - String get updateDownloadInstall => 'Download & Install'; - - @override - String get updateDontRemind => 'Don\'t remind'; - - @override - String get providerPriorityTitle => 'Provider Priority'; - - @override - String get providerPriorityDescription => - 'Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.'; - - @override - String get providerPriorityInfo => - 'If a track is not available on the first provider, the app will automatically try the next one.'; - - @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 providerExtension => 'Extension'; - - @override - String get metadataProviderPriorityTitle => 'Metadata Priority'; - - @override - String get metadataProviderPriorityDescription => - 'Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.'; - - @override - String get metadataProviderPriorityInfo => - 'Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.'; - - @override - String get logTitle => 'Logs'; - - @override - String get logCopied => 'Logs copied to clipboard'; - - @override - String get logSearchHint => 'Search logs...'; - - @override - String get logFilterLevel => 'Level'; - - @override - String get logFilterSection => 'Filter'; - - @override - String get logShareLogs => 'Share logs'; - - @override - String get logClearLogs => 'Clear logs'; - - @override - String get logClearLogsTitle => 'Clear Logs'; - - @override - String get logClearLogsMessage => 'Are you sure you want to clear all logs?'; - - @override - String get logFilterBySeverity => 'Filter logs by severity'; - - @override - String get logNoLogsYet => 'No logs yet'; - - @override - String get logNoLogsYetSubtitle => 'Logs will appear here as you use the app'; - - @override - String logEntriesFiltered(int count) { - return 'Entries ($count filtered)'; - } - - @override - String logEntries(int count) { - return 'Entries ($count)'; - } - - @override - String get channelStable => 'Stable'; - - @override - String get channelPreview => 'Preview'; - - @override - String get sectionSearchSource => 'Search Source'; - - @override - String get sectionDownload => 'Download'; - - @override - String get sectionPerformance => 'Performance'; - - @override - String get sectionApp => 'App'; - - @override - String get sectionData => 'Data'; - - @override - String get sectionDebug => 'Debug'; - - @override - String get sectionService => 'Service'; - - @override - String get sectionAudioQuality => 'Audio Quality'; - - @override - String get sectionFileSettings => 'File Settings'; - - @override - String get sectionLyrics => 'Lyrics'; - - @override - String get lyricsMode => 'Lyrics Mode'; - - @override - String get lyricsModeDescription => - 'Choose how lyrics are saved with your downloads'; - - @override - String get lyricsModeEmbed => 'Embed in file'; - - @override - String get lyricsModeEmbedSubtitle => 'Lyrics stored inside FLAC metadata'; - - @override - String get lyricsModeExternal => 'External .lrc file'; - - @override - String get lyricsModeExternalSubtitle => - 'Separate .lrc file for players like Samsung Music'; - - @override - String get lyricsModeBoth => 'Both'; - - @override - String get lyricsModeBothSubtitle => 'Embed and save .lrc file'; - - @override - String get sectionColor => 'Color'; - - @override - String get sectionTheme => 'Theme'; - - @override - String get sectionLayout => 'Layout'; - - @override - String get sectionLanguage => 'Language'; - - @override - String get appearanceLanguage => 'App Language'; - - @override - String get settingsAppearanceSubtitle => 'Theme, colors, display'; - - @override - String get settingsDownloadSubtitle => 'Service, quality, fallback'; - - @override - String get settingsExtensionsSubtitle => 'Manage download providers'; - - @override - String get settingsLogsSubtitle => 'View app logs for debugging'; - - @override - String get loadingSharedLink => 'Loading shared link...'; - - @override - String get pressBackAgainToExit => 'Press back again to exit'; - - @override - String downloadAllCount(int count) { - return 'Download All ($count)'; - } - - @override - String tracksCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count tracks', - one: '1 track', - ); - return '$_temp0'; - } - - @override - String get trackCopyFilePath => 'Copy file path'; - - @override - String get trackRemoveFromDevice => 'Remove from device'; - - @override - String get trackLoadLyrics => 'Load Lyrics'; - - @override - String get trackMetadata => 'Metadata'; - - @override - String get trackFileInfo => 'File Info'; - - @override - String get trackLyrics => 'Lyrics'; - - @override - String get trackFileNotFound => 'File not found'; - - @override - String get trackOpenInDeezer => 'Open in Deezer'; - - @override - String get trackOpenInSpotify => 'Open in Spotify'; - - @override - String get trackTrackName => 'Track name'; - - @override - String get trackArtist => 'Artist'; - - @override - String get trackAlbumArtist => 'Album artist'; - - @override - String get trackAlbum => 'Album'; - - @override - String get trackTrackNumber => 'Track number'; - - @override - String get trackDiscNumber => 'Disc number'; - - @override - String get trackDuration => 'Duration'; - - @override - String get trackAudioQuality => 'Audio quality'; - - @override - String get trackReleaseDate => 'Release date'; - - @override - String get trackGenre => 'Genre'; - - @override - String get trackLabel => 'Label'; - - @override - String get trackCopyright => 'Copyright'; - - @override - String get trackDownloaded => 'Downloaded'; - - @override - String get trackCopyLyrics => 'Copy lyrics'; - - @override - String trackLyricsSource(String source) { - return 'Source: $source'; - } - - @override - String get trackLyricsNotAvailable => 'Lyrics not available for this track'; - - @override - String get trackLyricsNotInFile => 'No lyrics found in this file'; - - @override - String get trackFetchOnlineLyrics => 'Fetch from Online'; - - @override - String get trackLyricsTimeout => 'Request timed out. Try again later.'; - - @override - String get trackLyricsLoadFailed => 'Failed to load lyrics'; - - @override - String get trackEmbedLyrics => 'Embed Lyrics'; - - @override - String get trackLyricsEmbedded => 'Lyrics embedded successfully'; - - @override - String get trackInstrumental => 'Instrumental track'; - - @override - String get trackCopiedToClipboard => 'Copied to clipboard'; - - @override - String get trackDeleteConfirmTitle => 'Remove from device?'; - - @override - String get trackDeleteConfirmMessage => - 'This will permanently delete the downloaded file and remove it from your history.'; - - @override - String get dateToday => 'Today'; - - @override - String get dateYesterday => 'Yesterday'; - - @override - String dateDaysAgo(int count) { - return '$count days ago'; - } - - @override - String dateWeeksAgo(int count) { - return '$count weeks ago'; - } - - @override - String dateMonthsAgo(int count) { - return '$count months ago'; - } - - @override - String get storeFilterAll => 'All'; - - @override - String get storeFilterMetadata => 'Metadata'; - - @override - String get storeFilterDownload => 'Download'; - - @override - String get storeFilterUtility => 'Utility'; - - @override - String get storeFilterLyrics => 'Lyrics'; - - @override - String get storeFilterIntegration => 'Integration'; - - @override - String get storeClearFilters => 'Clear filters'; - - @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 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 extensionId => 'ID'; - - @override - String get extensionError => 'Error'; - - @override - String get extensionCapabilities => 'Capabilities'; - - @override - String get extensionMetadataProvider => 'Metadata Provider'; - - @override - String get extensionDownloadProvider => 'Download Provider'; - - @override - String get extensionLyricsProvider => 'Lyrics Provider'; - - @override - String get extensionUrlHandler => 'URL Handler'; - - @override - String get extensionQualityOptions => 'Quality Options'; - - @override - String get extensionPostProcessingHooks => 'Post-Processing Hooks'; - - @override - String get extensionPermissions => 'Permissions'; - - @override - String get extensionSettings => 'Settings'; - - @override - String get extensionRemoveButton => 'Remove Extension'; - - @override - String get extensionUpdated => 'Updated'; - - @override - String get extensionMinAppVersion => 'Min App Version'; - - @override - String get extensionCustomTrackMatching => 'Custom Track Matching'; - - @override - String get extensionPostProcessing => 'Post-Processing'; - - @override - String extensionHooksAvailable(int count) { - return '$count hook(s) available'; - } - - @override - String extensionPatternsCount(int count) { - return '$count pattern(s)'; - } - - @override - String extensionStrategy(String strategy) { - return 'Strategy: $strategy'; - } - - @override - String get extensionsProviderPrioritySection => 'Provider Priority'; - - @override - String get extensionsInstalledSection => 'Installed Extensions'; - - @override - String get extensionsNoExtensions => 'No extensions installed'; - - @override - String get extensionsNoExtensionsSubtitle => - 'Install .spotiflac-ext files to add new providers'; - - @override - String get extensionsInstallButton => 'Install Extension'; - - @override - String get extensionsInfoTip => - 'Extensions can add new metadata and download providers. Only install extensions from trusted sources.'; - - @override - String get extensionsInstalledSuccess => 'Extension installed successfully'; - - @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 => 'Download Priority'; - - @override - String get extensionsDownloadPrioritySubtitle => 'Set download service order'; - - @override - String get extensionsFallbackTitle => 'Fallback Extensions'; - - @override - String get extensionsFallbackSubtitle => - 'Choose which installed download extensions can be used as fallback'; - - @override - String get extensionsNoDownloadProvider => - 'No extensions with download provider'; - - @override - String get extensionsMetadataPriority => 'Metadata Priority'; - - @override - String get extensionsMetadataPrioritySubtitle => - 'Set search & metadata source order'; - - @override - String get extensionsNoMetadataProvider => - 'No extensions with metadata provider'; - - @override - String get extensionsSearchProvider => 'Search Provider'; - - @override - String get extensionsNoCustomSearch => 'No extensions with custom search'; - - @override - String get extensionsSearchProviderDescription => - 'Choose which service to use for searching tracks'; - - @override - String get extensionsCustomSearch => 'Custom search'; - - @override - String get extensionsErrorLoading => 'Error loading extension'; - - @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 / up to 96kHz'; - - @override - String get qualityHiResFlacMax => 'Hi-Res FLAC Max'; - - @override - String get qualityHiResFlacMaxSubtitle => '24-bit / up to 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 downloadAskBeforeDownload => 'Ask Before Download'; - - @override - String get downloadDirectory => 'Download Directory'; - - @override - String get downloadSeparateSinglesFolder => 'Separate Singles Folder'; - - @override - String get downloadAlbumFolderStructure => 'Album Folder Structure'; - - @override - String get albumFolderStructureDescription => - 'Choose how album folders are structured'; - - @override - String get downloadUseAlbumArtistForFolders => 'Use Album Artist for folders'; - - @override - String get downloadUsePrimaryArtistOnly => 'Primary artist only for folders'; - - @override - String get downloadUsePrimaryArtistOnlyEnabled => - 'Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)'; - - @override - String get downloadUsePrimaryArtistOnlyDisabled => - 'Full artist string used for folder name'; - - @override - String get downloadSelectQuality => 'Select Quality'; - - @override - String get downloadFrom => 'Download From'; - - @override - String get appearanceAmoledDark => 'AMOLED Dark'; - - @override - String get appearanceAmoledDarkSubtitle => 'Pure black background'; - - @override - String get queueClearAll => 'Clear All'; - - @override - String get queueClearAllMessage => - 'Are you sure you want to clear all downloads?'; - - @override - String get settingsAutoExportFailed => 'Auto-export failed downloads'; - - @override - String get settingsAutoExportFailedSubtitle => - 'Save failed downloads to TXT file automatically'; - - @override - String get settingsDownloadNetwork => 'Download Network'; - - @override - String get settingsDownloadNetworkAny => 'WiFi + Mobile Data'; - - @override - String get settingsDownloadNetworkWifiOnly => 'WiFi Only'; - - @override - String get settingsDownloadNetworkSubtitle => - 'Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.'; - - @override - String get albumFolderArtistAlbum => 'Artist / Album'; - - @override - String get albumFolderArtistAlbumSubtitle => 'Albums/Artist Name/Album Name/'; - - @override - String get albumFolderArtistYearAlbum => 'Artist / [Year] Album'; - - @override - String get albumFolderArtistYearAlbumSubtitle => - 'Albums/Artist Name/[2005] Album Name/'; - - @override - String get albumFolderAlbumOnly => 'Album Only'; - - @override - String get albumFolderAlbumOnlySubtitle => 'Albums/Album Name/'; - - @override - String get albumFolderYearAlbum => '[Year] Album'; - - @override - String get albumFolderYearAlbumSubtitle => 'Albums/[2005] Album Name/'; - - @override - String get albumFolderArtistAlbumSingles => 'Artist / Album + Singles'; - - @override - String get albumFolderArtistAlbumSinglesSubtitle => - 'Artist/Album/ and Artist/Singles/'; - - @override - String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; - - @override - String get albumFolderArtistAlbumFlatSubtitle => - 'Artist/Album/ and Artist/song.flac'; - - @override - String get downloadedAlbumDeleteSelected => 'Delete Selected'; - - @override - String downloadedAlbumDeleteMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0 from this album?\n\nThis will also delete the files from storage.'; - } - - @override - String downloadedAlbumSelectedCount(int count) { - return '$count selected'; - } - - @override - String get downloadedAlbumTapToSelect => 'Tap tracks to select'; - - @override - String downloadedAlbumDeleteCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0'; - } - - @override - String get downloadedAlbumSelectToDelete => 'Select tracks to delete'; - - @override - String downloadedAlbumDiscHeader(int discNumber) { - return 'Disc $discNumber'; - } - - @override - String get recentTypeArtist => 'Artist'; - - @override - String get recentTypeAlbum => 'Album'; - - @override - String get recentTypeSong => 'Song'; - - @override - String get recentTypePlaylist => 'Playlist'; - - @override - String get recentEmpty => 'No recent items yet'; - - @override - String get recentShowAllDownloads => 'Show All Downloads'; - - @override - String recentPlaylistInfo(String name) { - return 'Playlist: $name'; - } - - @override - String get discographyDownload => 'Download Discography'; - - @override - String get discographyDownloadAll => 'Download All'; - - @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 => - 'Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.'; - - @override - String libraryTracksUnit(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$_temp0'; - } - - @override - String 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 => 'Welcome to SpotiFLAC!'; - - @override - String get tutorialWelcomeDesc => - 'Let\'s learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.'; - - @override - String get tutorialWelcomeTip1 => - 'Download music from Spotify, Deezer, or paste any supported URL'; - - @override - String get tutorialWelcomeTip2 => - 'Get FLAC quality audio from installed download extensions'; - - @override - String get tutorialWelcomeTip3 => - 'Automatic metadata, cover art, and lyrics embedding'; - - @override - String get tutorialSearchTitle => 'Finding Music'; - - @override - String get tutorialSearchDesc => - 'There are two easy ways to find music you want to download.'; - - @override - String get tutorialDownloadTitle => 'Downloading Music'; - - @override - String get tutorialDownloadDesc => - 'Downloading music is simple and fast. Here\'s how it works.'; - - @override - String get tutorialLibraryTitle => 'Your Library'; - - @override - String get tutorialLibraryDesc => - 'All your downloaded music is organized in the Library tab.'; - - @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 trackSaveLyrics => 'Save Lyrics (.lrc)'; - - @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 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 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 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 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 collectionPlaylist => 'Playlist'; - - @override - String get collectionAddToPlaylist => 'Add to playlist'; - - @override - String get collectionCreatePlaylist => 'Create playlist'; - - @override - String get collectionNoPlaylistsYet => 'No playlists yet'; - - @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 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 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 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 selectionBatchConvertSuccess(int success, int total, String format) { - return 'Converted $success of $total tracks to $format'; - } - - @override - String downloadedAlbumDownloadedCount(int count) { - return '$count downloaded'; - } - - @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 => 'Backup & Restore'; - - @override - String get settingsBackupSubtitle => - 'Move your library, history and settings to a new device'; - - @override - String get backupTitle => 'Backup & Restore'; - - @override - String get backupExportSectionTitle => 'Create backup'; - - @override - String get backupExportSectionDescription => - 'Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.'; - - @override - String get backupExportButton => 'Create backup file'; - - @override - String get backupImportSectionTitle => 'Restore backup'; - - @override - String get backupImportSectionDescription => - 'Pick a backup file to restore your data. This replaces the current settings, history and library on this device.'; - - @override - String get backupImportButton => 'Choose backup file'; - - @override - String get backupCreated => 'Backup created'; - - @override - String get backupCreateFailed => 'Failed to create backup'; - - @override - String get backupRestoreConfirmTitle => 'Restore this backup?'; - - @override - String get backupRestoreConfirmMessage => - 'This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.'; - - @override - String get backupRestoreConfirmButton => 'Restore'; - - @override - String get backupRestored => 'Backup restored successfully'; - - @override - String get backupRestoreFailed => 'Failed to restore backup'; - - @override - String get backupInvalidFile => 'This file is not a valid SpotiFLAC backup'; - - @override - String get backupRestoreRestartHint => - 'Restart the app to make sure every change is applied.'; - - @override - String get backupContentsTitle => 'Backup contents'; - - @override - String get backupContentsSettings => 'App settings'; - - @override - String backupContentsHistory(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'items', - one: 'item', - ); - return '$count history $_temp0'; - } - - @override - String backupContentsLiked(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$count liked $_temp0'; - } - - @override - String backupContentsWishlist(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return '$count wishlist $_temp0'; - } - - @override - String backupContentsPlaylists(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count playlists', - one: '1 playlist', - ); - return '$_temp0'; - } - - @override - String backupContentsArtists(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count favorite artists', - one: '1 favorite artist', - ); - return '$_temp0'; - } - - @override - String backupContentsExtensions(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count extensions', - one: '1 extension', - ); - return '$_temp0'; - } - - @override - String get backupIncludeSecrets => 'Include extension credentials'; - - @override - String get backupIncludeSecretsDescription => - 'Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.'; - - @override - String backupExtensionsRestoreFailed(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'extensions', - one: 'extension', - ); - return '$count $_temp0 could not be reinstalled. Install them manually from the repo.'; - } - - @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 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 => 'Allow Local Network Access'; - - @override - String get downloadAllowLocalNetworkEnabled => - 'Requests to local/private addresses are allowed (for local proxy or custom DNS)'; - - @override - String get downloadAllowLocalNetworkDisabled => - 'Local/private addresses are blocked for security'; - - @override - String get downloadSelectServiceToEnable => - 'Select a provider with quality options to enable this option'; - - @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 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 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 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 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 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 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 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 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 => '用於擴充功能下載的 Android 背景服務'; - - @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 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 => 'Playback'; - - @override - String get libraryExternalPlayer => 'External player'; - - @override - String get libraryExternalPlayerSubtitle => - 'Recommended for listening, best quality, gapless playback, EQ, and wider format support'; - - @override - String get libraryBuiltInPreviewPlayer => 'Built-in preview player'; - - @override - String get libraryBuiltInPreviewPlayerSubtitle => - 'Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening'; - - @override - String get libraryBuiltInPlayerInfo => - 'The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.'; - - @override - String get nowPlayingTitle => 'Now Playing'; - - @override - String get nowPlayingNothingPlaying => 'Nothing is playing'; - - @override - String get nowPlayingMinimize => 'Minimize'; - - @override - String get nowPlayingUpNext => 'Up next'; - - @override - String get nowPlayingDetails => 'Details'; - - @override - String get nowPlayingOpenInExternalPlayer => 'Open in external player'; - - @override - String get nowPlayingTabPlayer => 'Player'; - - @override - String get nowPlayingTabLyrics => 'Lyrics'; - - @override - String get nowPlayingNoLyrics => 'No lyrics in this file'; - - @override - String get nowPlayingLibraryEmpty => 'Your library is empty'; - - @override - String nowPlayingShuffleLibraryFailed(String error) { - return 'Could not shuffle library: $error'; - } - - @override - String get nowPlayingShuffleOn => 'Shuffle on'; - - @override - String get nowPlayingPlayInOrder => 'Play in order'; - - @override - String get nowPlayingShuffleLibrary => 'Shuffle library'; - - @override - String get nowPlayingQueueEmpty => 'Queue is empty'; - - @override - String get nowPlayingNoMetadata => 'No metadata available'; - - @override - String get announcementUnableToOpenLink => - 'Unable to open link. Please try again.'; - - @override - String trackConvertLosslessOutputWithCap(String quality) { - return 'Lossless output with $quality cap'; - } - - @override - String trackConvertConfirmMessageLosslessCapped( - String sourceFormat, - String targetFormat, - String quality, - ) { - return 'Convert from $sourceFormat to $targetFormat ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.'; - } - - @override - String selectionBatchConvertConfirmMessageLosslessCapped( - int count, - String format, - String quality, - ) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Convert $count $_temp0 to $format ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.'; - } - - @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 => - 'Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius'; - - @override - String get snackbarPlayingNext => 'Playing next'; - - @override - String get snackbarAddedToQueueGeneric => 'Added to queue'; - - @override - String selectionDeletePlaylistsCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'playlists', - one: 'playlist', - ); - return 'Delete $count $_temp0'; - } - - @override - String get actionShuffle => 'Shuffle'; - - @override - String get downloadPrimaryArtistOnlyOn => 'Primary only: On'; - - @override - String get downloadPrimaryArtistOnlyOff => 'Primary only: Off'; - - @override - String get downloadAlbumArtistMetadataPrimaryOnly => - 'Album Artist metadata: Primary only'; - - @override - String get downloadAlbumArtistMetadataFull => 'Album Artist metadata: Full'; - - @override - String get trackConvertOriginal => 'Original'; - - @override - String get trackConvertOriginalQuality => 'Original quality'; - - @override - String get trackConvertLosslessSuffix => 'Lossless'; - - @override - String get trackConvertDithering => 'Dithering'; - - @override - String get trackConvertResampler => 'Resampler'; - - @override - String get trackConvertDitherNone => 'None'; - - @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 => 'See release notes for details.'; - - @override - String get unknownTitle => 'Unknown title'; - - @override - String get trackPlayNext => 'Play next'; - - @override - String get trackAddToQueue => 'Add to queue'; - - @override - String snackbarExtensionInstalledEnable(String extensionName) { - return '$extensionName installed. Enable it in Settings > Extensions'; - } - - @override - String snackbarExtensionUpdatedVersion(String extensionName, String version) { - return '$extensionName updated to v$version'; - } - - @override - String snackbarFailedToInstallNamed(String extensionName) { - return 'Failed to install $extensionName'; - } - - @override - String snackbarFailedToUpdateNamed(String extensionName) { - return 'Failed to update $extensionName'; - } - - @override - String get releaseTypeEp => 'EP'; - - @override - String get releaseTypeSingle => 'Single'; - - @override - String get trackCoverOnline => 'Online cover'; - - @override - String get regionCountryUS => 'United States'; - - @override - String get regionCountryGB => 'United Kingdom'; - - @override - String get regionCountryFR => 'France'; - - @override - String get regionCountryDE => 'Germany'; - - @override - String get regionCountryJP => 'Japan'; - - @override - String get regionCountryKR => 'South Korea'; - - @override - String get regionCountryIN => 'India'; - - @override - String get regionCountryID => 'Indonesia'; - - @override - String get regionCountryBR => 'Brazil'; - - @override - String get regionCountryMX => 'Mexico'; - - @override - String get regionCountryAU => 'Australia'; - - @override - String get regionCountryCA => 'Canada'; - - @override - String get regionCountryXK => 'Kosovo'; - - @override - String get extensionVerificationBrowserTitle => 'Verification browser'; - - @override - String get extensionVerificationBrowserSubtitleExternal => - 'Open challenges in the default browser first'; - - @override - String get extensionVerificationBrowserSubtitleInApp => - 'Open challenges in the in-app browser first'; - - @override - String get extensionVerificationBrowserExternal => 'External'; - - @override - String get extensionVerificationBrowserInApp => 'In-app'; - - @override - String get extensionVerificationHelpTitleManual => - 'Open verification manually'; - - @override - String get extensionVerificationHelpTitleWaiting => - 'Verification still waiting'; - - @override - String get extensionVerificationHelpMessageManual => - 'SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.'; - - @override - String get extensionVerificationHelpMessageWaiting => - 'If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.'; - - @override - String get extensionVerificationClose => 'Close'; - - @override - String get extensionVerificationCopyLink => 'Copy link'; - - @override - String get extensionVerificationLinkCopied => 'Verification link copied'; - - @override - String get extensionVerificationOpenBrowser => 'Open browser'; -} diff --git a/lib/l10n/arb/app_ar.arb b/lib/l10n/arb/app_ar.arb deleted file mode 100644 index af745817..00000000 --- a/lib/l10n/arb/app_ar.arb +++ /dev/null @@ -1,5887 +0,0 @@ -{ - "@@locale": "ar", - "@@last_modified": "2026-04-28", - "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", - "@libraryEnableLocalLibrarySubtitle": { - "description": "Subtitle for enable toggle" - }, - "@audioAnalysisCodec": { - "description": "Audio codec metric label" - }, - "extensionUtilityFunctions": "Utility Functions", - "@extensionUtilityFunctions": { - "description": "Capability label for utility-only extensions" - }, - "logClearLogsMessage": "هل أنت متأكد من رغبتك في مسح جميع السجلات؟", - "@logClearLogsMessage": { - "description": "Clear logs confirmation message" - }, - "@storeClearFilters": { - "description": "Button to clear all filters" - }, - "cacheCleanupUnused": "Cleanup unused data", - "@cacheCleanupUnused": { - "description": "Action title for cleaning unused entries" - }, - "trackConvertDitherNone": "None", - "@trackConvertDitherNone": { - "description": "Lossless conversion dither option with no dithering applied" - }, - "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", - "@libraryTracksUnit": { - "description": "Unit label for tracks count (without the number itself)", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "folderOrganizationNone": "لا توجد منظمة", - "@folderOrganizationNone": { - "description": "Folder option - flat structure" - }, - "@storeRepoUrlHint": { - "description": "Hint/placeholder for the repository URL input field" - }, - "@trackConvertConfirmTitle": { - "description": "Confirmation dialog title" - }, - "@extensionPatternsCount": { - "description": "URL patterns count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "audioAnalysisContainer": "Container", - "@audioAnalysisContainer": { - "description": "Audio container metric label" - }, - "libraryAutoScanOff": "Off", - "@libraryAutoScanOff": { - "description": "Auto scan disabled" - }, - "shareSheetLinkCopied": "{service} link copied", - "@shareSheetLinkCopied": { - "description": "Snackbar after copying a cross-service link", - "placeholders": { - "service": {} - } - }, - "providerPriorityFallbackExtensionsDescription": "اختر إضافات التحميل المثبتة التي يمكن استخدامها أثناء الرجوع التلقائي للمزود الاحتياطي.", - "@providerPriorityFallbackExtensionsDescription": { - "description": "Section description for extension fallback selection" - }, - "@replayGainBatchConfirmMessage": { - "description": "Message of the batch ReplayGain confirmation dialog", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@extensionsHomeFeedUse": { - "description": "Extensions page - subtitle for a specific extension home feed option", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", - "@selectionShareCount": { - "description": "Share button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@storeExtensionsCount": { - "description": "Store extension result count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@logSearchHint": { - "description": "Log search placeholder" - }, - "@audioAnalysisSamples": { - "description": "Total samples metric label" - }, - "trackCoverReplace": "Replace Cover", - "@trackCoverReplace": { - "description": "Button label for replacing selected cover art" - }, - "@discographyAddedToQueue": { - "description": "Snackbar - tracks added from discography", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", - "@downloadAppleElrcWordSyncEnabled": { - "description": "Subtitle when Apple Music eLRC word sync is enabled" - }, - "@nowPlayingDetails": { - "description": "Menu item and section title for track metadata details" - }, - "@trackGenre": { - "description": "Metadata label - music genre" - }, - "recentTypeSong": "Song", - "@recentTypeSong": { - "description": "Recent access item type - song/track" - }, - "logShareLogs": "مشاركة السجلات", - "@logShareLogs": { - "description": "Share button tooltip" - }, - "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" - }, - "extensionsInstallButton": "تثبيت الإضافة", - "@extensionsInstallButton": { - "description": "Button to install extension from file" - }, - "replayGainBatchSuccess": "تمت إضافة وسوم ReplyGain ل {success} أغنية من أصل {total}", - "@replayGainBatchSuccess": { - "description": "Snackbar after batch ReplayGain completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "nowPlayingMinimize": "Minimize", - "@nowPlayingMinimize": { - "description": "Tooltip for minimizing the now playing screen" - }, - "logIssueNetworkErrorSuggestion": "Check your internet connection", - "@logIssueNetworkErrorSuggestion": { - "description": "Diagnostic badge suggestion for generic network errors" - }, - "extensionsNoExtensions": "لا توجد إضافات مثبتة", - "@extensionsNoExtensions": { - "description": "Empty state - no extensions" - }, - "@cacheRefresh": { - "description": "Tooltip for refresh button on cache management page" - }, - "@snackbarHistoryCleared": { - "description": "Snackbar - history deleted" - }, - "cueSplitFailed": "CUE split failed", - "@cueSplitFailed": { - "description": "Snackbar when CUE split fails" - }, - "trackConvertLosslessSuffix": "Lossless", - "@trackConvertLosslessSuffix": { - "description": "Suffix used in converted lossless quality labels" - }, - "homeSubtitle": "ألصق عنوان URL مدعوم أو ابحث بالاسم", - "@homeSubtitle": { - "description": "Subtitle shown below search box" - }, - "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessageLossless": { - "description": "Confirmation dialog message for lossless batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "@extensionVerificationHelpMessageManual": { - "description": "Dialog message when automatic browser launch for verification fails" - }, - "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", - "@queueRateLimitMessage": { - "description": "Explanation shown on a failed queue item when the download service rate limits requests" - }, - "searchSortDateOldest": "تاريخ الإصدار (الأقدم)", - "@searchSortDateOldest": { - "description": "Sort option - oldest release first" - }, - "aboutSjdonadoDesc": "منشئ ل I Don't Have Spotify (IHDS). محلل الروابط الذي ينقذ اليوم!", - "@aboutSjdonadoDesc": { - "description": "Credit description for sjdonado" - }, - "nowPlayingShuffleOn": "Shuffle on", - "@nowPlayingShuffleOn": { - "description": "Tooltip when shuffle mode is enabled" - }, - "sectionColor": "اللون", - "@sectionColor": { - "description": "Settings section header" - }, - "@providerPriorityFallbackExtensionsHint": { - "description": "Hint below the extension fallback selection list" - }, - "cacheCoverImage": "Cover image cache", - "@cacheCoverImage": { - "description": "Cache item title for persistent cover images" - }, - "@navSettings": { - "description": "Bottom navigation - Settings tab" - }, - "@trackCoverReplaceNotice": { - "description": "Notice shown when a new cover has been selected but not saved yet" - }, - "cueSplitConfirmTitle": "Split CUE Album", - "@cueSplitConfirmTitle": { - "description": "CUE split confirmation dialog title" - }, - "@trackDeleteConfirmMessage": { - "description": "Delete confirmation message" - }, - "cacheClearSuccess": "Cleared: {target}", - "@cacheClearSuccess": { - "description": "Snackbar after clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "editMetadataFieldCover": "Cover Art", - "@editMetadataFieldCover": { - "description": "Chip label for cover art field in auto-fill selector" - }, - "snackbarSelectExtFile": "الرجاء تحديد ملف .spotiflac-ext", - "@snackbarSelectExtFile": { - "description": "Snackbar - wrong file type selected" - }, - "libraryFilterFormat": "Format", - "@libraryFilterFormat": { - "description": "Filter section - file format" - }, - "@downloadLossyAac": { - "description": "Lossy format option - AAC in M4A container at 320kbps" - }, - "@setupNext": { - "description": "Next button text" - }, - "@releaseTypeSingle": { - "description": "Badge label for single releases" - }, - "@optionsDefaultSearchTab": { - "description": "Title for the preferred default search tab setting" - }, - "trackConvertLosslessOutputWithCap": "Lossless output with {quality} cap", - "@trackConvertLosslessOutputWithCap": { - "description": "Hint shown when lossless conversion will cap bit depth or sample rate", - "placeholders": { - "quality": { - "type": "String" - } - } - }, - "bulkDownloadSelectPlaylists": "Select playlists to download", - "@bulkDownloadSelectPlaylists": { - "description": "Button label when no playlists are selected for download" - }, - "artistOptionAddToFavorites": "Add to Favorite Artists", - "@artistOptionAddToFavorites": { - "description": "Action label - add artist to favorite artists" - }, - "@timeJustNow": { - "description": "Relative time - less than a minute ago" - }, - "downloadLossyOpus256": "Opus 256kbps", - "@downloadLossyOpus256": { - "description": "Lossy format option - Opus 256kbps" - }, - "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", - "@discographySinglesOnlySubtitle": { - "description": "Subtitle showing singles tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "optionsExtensionStore": "مستودع الإضافات", - "@optionsExtensionStore": { - "description": "Show/hide store tab" - }, - "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", - "@libraryDownloadsHistoryExcluded": { - "description": "Library count note for downloaded history items excluded from the local list", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@errorUrlFetchFailed": { - "description": "Error message - generic URL fetch failure" - }, - "@trackOptionAddToWishlist": { - "description": "Bottom sheet action label - add track to wishlist" - }, - "discographySinglesOnly": "Singles & EPs Only", - "@discographySinglesOnly": { - "description": "Option - download only singles" - }, - "@downloadSongLinkRegionDesc": { - "description": "Description in SongLink region picker" - }, - "notifEmbeddingMetadata": "Embedding metadata...", - "@notifEmbeddingMetadata": { - "description": "Notification body while embedding metadata into a downloaded track" - }, - "@settingsLocalLibrarySubtitle": { - "description": "Subtitle for local library settings" - }, - "@downloadLocationSubtitle": { - "description": "Subtitle shown in the download location picker sheet" - }, - "trackConvertOriginalQuality": "Original quality", - "@trackConvertOriginalQuality": { - "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" - }, - "nowPlayingTabLyrics": "Lyrics", - "@nowPlayingTabLyrics": { - "description": "Tab label for the lyrics view" - }, - "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", - "@selectionConvertCount": { - "description": "Convert button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@extensionsInstalledSection": { - "description": "Section header - installed extensions" - }, - "@downloadNetworkCompatibilityModeDisabled": { - "description": "Subtitle when network compatibility mode is off" - }, - "nowPlayingShuffleLibrary": "Shuffle library", - "@nowPlayingShuffleLibrary": { - "description": "Button label to shuffle and play the entire local library" - }, - "trackReEnrichFieldCover": "Cover Art", - "@trackReEnrichFieldCover": { - "description": "Checkbox label for cover art field in re-enrich" - }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", - "@tutorialExtensionsTip3": { - "description": "Tutorial extensions tip 3" - }, - "@cacheCleanupUnusedDesc": { - "description": "Description of what cleanup unused data does" - }, - "a11yOpenAlbum": "Open album {albumName}", - "@a11yOpenAlbum": { - "description": "Accessibility label for opening an album", - "placeholders": { - "albumName": { - "type": "String" - } - } - }, - "@settingsLyrics": { - "description": "Settings menu item - lyrics settings" - }, - "nowPlayingQueueEmpty": "Queue is empty", - "@nowPlayingQueueEmpty": { - "description": "Empty state when the playback queue has no items" - }, - "@settingsDownload": { - "description": "Settings section - download options" - }, - "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", - "@notifTracksDownloadedSuccess": { - "description": "Notification body for queue complete - how many tracks were downloaded", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "storeCategoryDownload": "Download", - "@storeCategoryDownload": { - "description": "Store extension category - download" - }, - "aboutTelegramChannel": "قناة تيليجرام", - "@aboutTelegramChannel": { - "description": "Link to Telegram channel" - }, - "@downloadedAlbumDiscHeader": { - "description": "Header for disc separator in multi-disc albums", - "placeholders": { - "discNumber": { - "type": "int", - "example": "1" - } - } - }, - "@recentEmpty": { - "description": "Empty state text for recent access list" - }, - "@backupRestoreConfirmMessage": { - "description": "Confirmation dialog message before restoring a backup" - }, - "@shareSheetCopyLink": { - "description": "Tooltip for copying a cross-service link" - }, - "regionCountryID": "Indonesia", - "@regionCountryID": { - "description": "Country name for SongLink region picker" - }, - "@libraryInLibrary": { - "description": "Badge shown on tracks that exist in local library" - }, - "extensionPostProcessingHooks": "روابط المعالجة اللاحقة", - "@extensionPostProcessingHooks": { - "description": "Capability - post-processing" - }, - "@setupGrantPermission": { - "description": "Button to request permission" - }, - "storeFilterDownload": "التحميل", - "@storeFilterDownload": { - "description": "Store filter - download providers" - }, - "@collectionAddToPlaylist": { - "description": "Action to add a track to user playlist" - }, - "@discographyFailedToFetch": { - "description": "Error - some albums failed to load" - }, - "@updateWhatsNew": { - "description": "Changelog section title" - }, - "@setupLanguageDescription": { - "description": "Description for the language selection step in setup" - }, - "dialogDeleteSelectedTitle": "حذف المحدد", - "@dialogDeleteSelectedTitle": { - "description": "Dialog title - delete selected items" - }, - "trackCoverPick": "Pick Cover", - "@trackCoverPick": { - "description": "Button label for selecting cover art" - }, - "@collectionCreatePlaylist": { - "description": "Action to create a new playlist" - }, - "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", - "@selectionBatchConvertSuccess": { - "description": "Snackbar after batch conversion completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "qualityHiResFlacMax": "Hi-Res FLAC Max", - "@qualityHiResFlacMax": { - "description": "Quality option - maximum resolution FLAC" - }, - "audioAnalysisStereo": "Stereo", - "@audioAnalysisStereo": { - "description": "Audio channel layout label - stereo" - }, - "backupExportButton": "Create backup file", - "@backupExportButton": { - "description": "Button to create and share a backup file" - }, - "settingsApp": "App", - "@settingsApp": { - "description": "Settings menu item - app settings" - }, - "clickableInformationUnavailable": "{type} information not available", - "@clickableInformationUnavailable": { - "description": "Snackbar shown when clickable metadata cannot open a destination", - "placeholders": { - "type": { - "type": "String" - } - } - }, - "@logFilterLevel": { - "description": "Filter by log level" - }, - "sectionTheme": "الثيم", - "@sectionTheme": { - "description": "Settings section header" - }, - "@extensionActionFailed": { - "description": "Fallback error when an extension action fails without details" - }, - "@downloadAppleElrcWordSync": { - "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" - }, - "@extensionsNoCustomSearch": { - "description": "Empty state - no search providers" - }, - "@collectionPlaylistRemoveCover": { - "description": "Bottom sheet action to remove custom cover image from a playlist" - }, - "@tutorialWelcomeDesc": { - "description": "Tutorial welcome page description" - }, - "@tutorialSearchDesc": { - "description": "Tutorial search page description" - }, - "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", - "@collectionAddedToWishlist": { - "description": "Snackbar after adding track to wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "logAffectedDomains": "Affected: {domains}", - "@logAffectedDomains": { - "description": "Affected domains in log issue analysis", - "placeholders": { - "domains": { - "type": "String" - } - } - }, - "@folderOrganizationByArtistSubtitle": { - "description": "Subtitle for artist folder option" - }, - "errorNoTracksFound": "لم يتم العثور على الأغنية", - "@errorNoTracksFound": { - "description": "Error - search returned no results" - }, - "providerPriorityTitle": "أولوية مقدم الخدمة", - "@providerPriorityTitle": { - "description": "Provider priority page title" - }, - "@notifUpdateReadyBody": { - "description": "Notification body when app update is ready to install", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "@settingsExtensions": { - "description": "Settings section - extension management" - }, - "trackDeleteConfirmTitle": "حذف من الجهاز؟", - "@trackDeleteConfirmTitle": { - "description": "Delete confirmation title" - }, - "@settingsDownloadNetwork": { - "description": "Setting for network type preference" - }, - "downloadProvidersNoneEnabled": "No providers enabled", - "@downloadProvidersNoneEnabled": { - "description": "Shown when no lyrics providers are active" - }, - "@homeEmptySubtitle": { - "description": "Subtitle shown on home when no providers are available yet" - }, - "trackReEnrichFieldBasicTags": "Album, Album Artist", - "@trackReEnrichFieldBasicTags": { - "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" - }, - "@audioAnalysisSpectralCutoff": { - "description": "Estimated spectral cutoff metric label" - }, - "@logClearLogsTitle": { - "description": "Clear logs dialog title" - }, - "storageModeSafSubtitle": "Pick any folder, including SD card", - "@storageModeSafSubtitle": { - "description": "Subtitle for SAF storage mode" - }, - "@notifUpdateProgress": { - "description": "Notification body showing update download progress", - "placeholders": { - "received": { - "type": "String" - }, - "total": { - "type": "String" - }, - "percentage": { - "type": "int" - } - } - }, - "downloadUsePrimaryArtistOnlyEnabled": "الفنانين المتميزين الذين تمت إزالتهم من اسم المجلد (على سبيل المثال جاستين بيبر، كويفو -> جاستين بيبر)", - "@downloadUsePrimaryArtistOnlyEnabled": { - "description": "Subtitle when primary artist only is enabled" - }, - "notifScanningLibrary": "Scanning local library", - "@notifScanningLibrary": { - "description": "Notification title while scanning local library" - }, - "@metadataProvidersSubtitle": { - "description": "Subtitle for metadata provider priority item" - }, - "setupGetStarted": "إبدأ الآن", - "@setupGetStarted": { - "description": "Final setup button" - }, - "libraryFilterQualityCD": "CD (16bit)", - "@libraryFilterQualityCD": { - "description": "Filter option - CD quality audio" - }, - "sectionLayout": "التخطيط", - "@sectionLayout": { - "description": "Settings section header" - }, - "@tooltipLoveAll": { - "description": "Tooltip for the Love All button on album/playlist screens" - }, - "queueFinalizingDownload": "Finalizing download", - "@queueFinalizingDownload": { - "description": "Accessibility label for a queue item that is finalizing" - }, - "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", - "@trackConvertActionLabelLossy": { - "description": "Convert button label for lossy conversion", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "extensionsMetadataPriority": "أولوية البيانات الوصفية (metadata)", - "@extensionsMetadataPriority": { - "description": "Setting - metadata provider order" - }, - "updateCurrent": "الحالي", - "@updateCurrent": { - "description": "Label for current version" - }, - "@aboutFeatureRequest": { - "description": "Link to suggest features" - }, - "@safMigrationSuccess": { - "description": "Snackbar after successfully migrating to SAF" - }, - "backupRestoreConfirmMessage": "This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.", - "@cleanupOrphanedDownloadsNone": { - "description": "Snackbar when no orphans found" - }, - "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", - "@lyricsProviderNeteaseDesc": { - "description": "Description for Netease provider" - }, - "libraryScanCancelledSubtitle": "You can retry the scan when ready.", - "@libraryScanCancelledSubtitle": { - "description": "Library scan status subtitle after cancellation" - }, - "@collectionFavoriteArtists": { - "description": "Custom folder for favorite artists" - }, - "@trackAlbum": { - "description": "Metadata label - album name" - }, - "dialogDeleteSelectedMessage": "حذف {count} {count, plural, =1{أغنية} other{الأغاني}} من التاريخ؟\n\nسيؤدي هذا أيضا إلى حذف الملفات من وحدة التخزين.", - "@dialogDeleteSelectedMessage": { - "description": "Dialog message - delete selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackReEnrich": "Re-enrich", - "@trackReEnrich": { - "description": "Menu action - re-embed metadata into audio file" - }, - "@lyricsProvidersSaved": { - "description": "Snackbar after saving lyrics provider priority" - }, - "@storageModeSaf": { - "description": "Storage mode option - Storage Access Framework" - }, - "libraryStorageAccessRequired": "Storage Access Required", - "@libraryStorageAccessRequired": { - "description": "Dialog title for storage permission" - }, - "@cacheClearAllConfirmTitle": { - "description": "Dialog title before clearing all caches" - }, - "@unknownArtist": { - "description": "Fallback artist name when metadata is missing" - }, - "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", - "@downloadCreatePlaylistSourceFolderEnabled": { - "description": "Subtitle when playlist folder is enabled" - }, - "dialogClearHistoryMessage": "هل أنت متأكد من أنك تريد مسح كل سجل التنزيلات؟ لا يمكن التراجع عن هذا.", - "@dialogClearHistoryMessage": { - "description": "Dialog message - clear history confirmation" - }, - "@sectionData": { - "description": "Settings section header" - }, - "audioAnalysisRms": "RMS", - "@audioAnalysisRms": { - "description": "RMS level metric label" - }, - "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", - "@downloadFilterContributingEnabled": { - "description": "Subtitle when contributing artist filter is on" - }, - "timeJustNow": "Just now", - "@extensionCustomUrlHandlingShareHint": { - "description": "Extension detail hint explaining share-to-app URL handling" - }, - "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", - "@cleanupOrphanedDownloads": { - "description": "Button to remove history entries for deleted files" - }, - "@audioAnalysisNoClipping": { - "description": "Displayed when no clipped samples were detected" - }, - "@tutorialWelcomeTitle": { - "description": "Tutorial welcome page title" - }, - "collectionFavoriteArtists": "Favorite Artists", - "audioAnalysisRescanning": "Re-analyzing audio...", - "@audioAnalysisRescanning": { - "description": "Loading text while audio is being re-analyzed after an explicit refresh" - }, - "logTitle": "السجلات", - "@logTitle": { - "description": "Logs screen title" - }, - "@regionCountryGB": { - "description": "Country name for SongLink region picker" - }, - "@progressFetchingMetadata": { - "description": "Progress indicator - loading track info", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "aboutLogoArtist": "الفنان الموهوب الذي أنشأ شعار التطبيق الجميل!", - "@aboutLogoArtist": { - "description": "Role description for logo artist" - }, - "channelPreview": "تجريبي", - "@channelPreview": { - "description": "Update channel - beta/preview releases" - }, - "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", - "@collectionPlaylistsDeleted": { - "description": "Snackbar after deleting selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@libraryFilterMetadataMissingGenre": { - "description": "Filter option - items missing genre" - }, - "homeTitle": "الصفحة الرئيسية", - "@homeTitle": { - "description": "Home screen title" - }, - "extensionMinAppVersion": "اصدار التطبيق الأدنى", - "@extensionMinAppVersion": { - "description": "Extension detail - minimum app version" - }, - "backupContentsLiked": "{count} liked {count, plural, =1{track} other{tracks}}", - "@backupContentsLiked": { - "description": "Backup contents row for liked tracks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "audioAnalysisTruePeak": "True Peak", - "@audioAnalysisTruePeak": { - "description": "True peak metric label" - }, - "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", - "@notifDownloadsCanceledBody": { - "description": "Notification body when downloads are canceled by the user", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@dialogRetry": { - "description": "Dialog button - retry action" - }, - "@homeChangeSearchProviderTooltip": { - "description": "Tooltip for the Home search provider picker" - }, - "@sectionLyricsProviderOptions": { - "description": "Settings section header for per-provider lyrics options" - }, - "@trackReEnrichSuccessWithFailures": { - "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", - "placeholders": { - "successCount": { - "type": "int" - }, - "total": { - "type": "int" - }, - "failedCount": { - "type": "int" - } - } - }, - "previewUnavailable": "المعاينة غير متوفرة", - "@previewUnavailable": { - "description": "Snackbar shown when a track preview snippet cannot be played" - }, - "nowPlayingTabPlayer": "Player", - "@nowPlayingTabPlayer": { - "description": "Tab label for the player view" - }, - "backupContentsPlaylists": "{count, plural, =1{1 playlist} other{{count} playlists}}", - "@backupContentsPlaylists": { - "description": "Backup contents row for playlist count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryLastScannedNever": "Never", - "@libraryLastScannedNever": { - "description": "Shown when library has never been scanned" - }, - "trackTrackNumber": "رقم الأغنية", - "@trackTrackNumber": { - "description": "Metadata label - track number" - }, - "trackReplayGainScanning": "تحليل الصوت...", - "@trackReplayGainScanning": { - "description": "Snackbar/progress message while scanning ReplayGain for a single track" - }, - "downloadLossyMp3": "MP3 320kbps", - "@downloadLossyMp3": { - "description": "Lossy format option - MP3 320kbps" - }, - "@albumFolderArtistAlbumSingles": { - "description": "Album folder option with singles inside artist" - }, - "@extensionHealthNotConfigured": { - "description": "Extension service health status - not configured" - }, - "@downloadSeparateSinglesDisabled": { - "description": "Subtitle when separate singles folder is off" - }, - "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", - "@downloadCreatePlaylistSourceFolder": { - "description": "Setting to create a subfolder per playlist source" - }, - "@trackReleaseDate": { - "description": "Metadata label - release date" - }, - "aboutContributors": "المساهمون", - "@aboutContributors": { - "description": "Section for contributors" - }, - "@audioAnalysisMono": { - "description": "Audio channel layout label - mono" - }, - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, - "@audioAnalysisNyquist": { - "description": "Nyquist frequency metric label" - }, - "permissionStorage": "Storage", - "@permissionStorage": { - "description": "Storage permission type label" - }, - "permissionAudio": "Audio", - "@permissionAudio": { - "description": "Audio permission type label" - }, - "@libraryScanSubtitle": { - "description": "Subtitle for scan button" - }, - "@snackbarUnsupportedAudioFormat": { - "description": "Snackbar when the audio format is not supported for the requested operation" - }, - "@notifLibraryScanStopped": { - "description": "Notification body when library scan is cancelled" - }, - "@downloadMusixmatchAuto": { - "description": "Button to clear Musixmatch language (use auto)" - }, - "@trackLyricsTimeout": { - "description": "Message when lyrics request times out" - }, - "@trackReEnrichFieldReleaseInfo": { - "description": "Checkbox label for release info in re-enrich" - }, - "@regionCountryXK": { - "description": "Country name for SongLink region picker" - }, - "aboutTelegramChatSubtitle": "الدردشة مع المستخدمين الآخرين", - "@aboutTelegramChatSubtitle": { - "description": "Subtitle for Telegram chat" - }, - "selectionAllPlaylistsSelected": "All playlists selected", - "@selectionAllPlaylistsSelected": { - "description": "Shown when all playlists are selected in selection mode" - }, - "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", - "@cacheTrackLookupDesc": { - "description": "Description of what track lookup cache contains" - }, - "@unknownAlbum": { - "description": "Fallback album name when metadata is missing" - }, - "@extensionsErrorLoading": { - "description": "Error message when extension fails to load" - }, - "@cacheTitle": { - "description": "Cache management page title" - }, - "@downloadFilenameFormat": { - "description": "Setting for output filename pattern" - }, - "errorUrlNotRecognized": "رابط غير معروف", - "@errorUrlNotRecognized": { - "description": "Error title - URL not handled by any extension or service" - }, - "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", - "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { - "description": "Subtitle when album artist is used for folder names" - }, - "@qualityFlacLossless": { - "description": "Quality option - CD quality FLAC" - }, - "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", - "@downloadNeteaseIncludeTranslationEnabled": { - "description": "Subtitle when Netease translation is on" - }, - "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", - "@collectionLovedEmptySubtitle": { - "description": "Loved empty state subtitle" - }, - "@libraryBuiltInPlayerInfo": { - "description": "Info note explaining the built-in player is for previews only" - }, - "@notifLibraryScanProgressNoTotal": { - "description": "Notification body for library scan progress when total is unknown", - "placeholders": { - "scanned": { - "type": "int" - }, - "percentage": { - "type": "int" - } - } - }, - "@tutorialSearchTitle": { - "description": "Tutorial search page title" - }, - "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", - "@a11yTrackByArtist": { - "description": "Accessibility label for a queue or list track item", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "libraryFilterMetadataMissingLabel": "Missing label", - "@libraryFilterMetadataMissingLabel": { - "description": "Filter option - items missing record label" - }, - "@badgeBeta": { - "description": "Badge label for beta features" - }, - "@audioAnalysisLufs": { - "description": "Integrated loudness metric label" - }, - "trackMetadata": "البيانات الوصفية (Metadata)", - "@trackMetadata": { - "description": "Tab title - track metadata" - }, - "trackOptionRemoveFromLoved": "Remove from Loved", - "@trackOptionRemoveFromLoved": { - "description": "Bottom sheet action label - remove track from loved folder" - }, - "@aboutTelegramChat": { - "description": "Link to Telegram chat group" - }, - "@trackCopiedToClipboard": { - "description": "Snackbar - content copied" - }, - "aboutKeepAndroidOpen": "ابقي اندرويد مفتوحا", - "@aboutKeepAndroidOpen": { - "description": "Link to Keep Android Open campaign website" - }, - "@lyricsProvidersDisabledSection": { - "description": "Section header for disabled providers", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@downloadAllowLocalNetwork": { - "description": "Setting title for allowing requests to private/local network targets" - }, - "@openInOtherServices": { - "description": "Title and tooltip for finding the current collection in other services" - }, - "@extensionVerificationBrowserInApp": { - "description": "Chip label for in-app browser verification mode" - }, - "sectionSearchSource": "مصدر البحث", - "@sectionSearchSource": { - "description": "Settings section header" - }, - "allFilesAccess": "All Files Access", - "@allFilesAccess": { - "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" - }, - "extensionsInstalledCount": "تم تثبيت {count} إضافات بنجاح", - "@extensionsInstalledCount": { - "description": "Success message after installing multiple extensions", - "placeholders": { - "count": { - "type": "int", - "description": "Number of installed extensions" - } - } - }, - "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", - "@snackbarFailedToEmbedLyrics": { - "description": "Snackbar when lyrics embedding fails" - }, - "@lyricsProviderMusixmatchDesc": { - "description": "Description for Musixmatch provider" - }, - "queueRateLimitTitle": "Service rate limited", - "@queueRateLimitTitle": { - "description": "Title shown on a failed queue item when the download service rate limits requests" - }, - "@notifDownloadComplete": { - "description": "Notification title when a single download is complete" - }, - "@homeSupports": { - "description": "Info text about supported URL types" - }, - "notifDownloadsCanceledTitle": "Downloads canceled", - "@notifDownloadsCanceledTitle": { - "description": "Notification title when downloads are canceled by the user" - }, - "@lyricsModeEmbedSubtitle": { - "description": "Subtitle for embed option" - }, - "optionsReplayGain": "ReplyGain", - "@optionsReplayGain": { - "description": "Title for ReplayGain setting toggle" - }, - "@storeLoadError": { - "description": "Error heading when the store cannot be loaded" - }, - "@trackArtist": { - "description": "Metadata label - artist name" - }, - "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", - "@cacheCoverImageDesc": { - "description": "Description of what cover image cache contains" - }, - "queueClearAll": "مسح الكل", - "@queueClearAll": { - "description": "Button - clear all queue items" - }, - "downloadUsePrimaryArtistOnlyDisabled": "اسم الفنان الكامل المستخدمة لاسم المجلد", - "@downloadUsePrimaryArtistOnlyDisabled": { - "description": "Subtitle when primary artist only is disabled" - }, - "backupImportSectionTitle": "Restore backup", - "@backupImportSectionTitle": { - "description": "Section title for the import/restore card" - }, - "@downloadMusixmatchLanguageHint": { - "description": "Placeholder for Musixmatch language input" - }, - "collectionRemoveFromFolder": "Remove from folder", - "@collectionRemoveFromFolder": { - "description": "Tooltip for removing track from wishlist/loved folder" - }, - "storeFilterMetadata": "البيانات الوصفية (Metadata)", - "@storeFilterMetadata": { - "description": "Store filter - metadata providers" - }, - "shareSheetCopyLink": "Copy Link", - "errorRateLimitedMessage": "طلبات كثيرة جداً. الرجاء الانتظار قليلاً قبل البحث مرة أخرى.", - "@errorRateLimitedMessage": { - "description": "Error message - rate limit explanation" - }, - "libraryFilterSortGenreDesc": "Genre (Z-A)", - "@libraryFilterSortGenreDesc": { - "description": "Sort option - genre descending" - }, - "trackFileNotFound": "لم يتم العثور على الملف", - "@trackFileNotFound": { - "description": "Error - file doesn't exist" - }, - "@queueEmptySinglesSubtitle": { - "description": "Empty state subtitle for single track downloads" - }, - "@queueDownloadStarting": { - "description": "Queue status before download progress is available" - }, - "metadataProviderPriorityInfo": "Deezer ليس لديه حدود للطلبات ومُوصى به كأساسي. Spotify لديه حد للطلبات وقد لا يعمل بعد عدة عمليات.", - "@metadataProviderPriorityInfo": { - "description": "Info tip about rate limits" - }, - "aboutPCSource": "كود مصدر برنامج الكمبيوتر", - "@aboutPCSource": { - "description": "Link to PC GitHub repo" - }, - "editMetadataAutoFill": "Auto-fill from online", - "@editMetadataAutoFill": { - "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" - }, - "snackbarDeletedTracks": "تم حذف {count} {count, plural, =1{أغنية} other{أغانٍ}}", - "@snackbarDeletedTracks": { - "description": "Snackbar - tracks deleted", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@extensionHealthServiceDegraded": { - "description": "Tooltip for degraded extension service" - }, - "lyricsProviderLrclibDesc": "Open-source synced lyrics database", - "@lyricsProviderLrclibDesc": { - "description": "Description for LRCLIB provider" - }, - "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", - "@downloadMusixmatchLanguageDesc": { - "description": "Description in Musixmatch language picker" - }, - "@optionsEmbedMetadataSubtitleOn": { - "description": "Subtitle when metadata embedding is enabled" - }, - "@setupSkipForNow": { - "description": "Skip button text" - }, - "@a11ySelectTrack": { - "description": "Accessibility label for selecting a track" - }, - "@folderOrganizationByAlbumSubtitle": { - "description": "Subtitle for album folder option" - }, - "downloadLossyAac": "AAC/M4A 320kbps", - "@extensionVerificationBrowserTitle": { - "description": "Settings option title for extension verification browser preference" - }, - "@backupContentsExtensions": { - "description": "Backup contents row for installed extensions count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarUrlCopied": "رابط {platform} تم نسخه إلى الحافظة", - "@snackbarUrlCopied": { - "description": "Snackbar - URL copied", - "placeholders": { - "platform": { - "type": "String", - "description": "Platform name (Spotify/Deezer)" - } - } - }, - "aboutBinimumDesc": "منشئ API QQDL و HiFi. ساعد هذا المشروع في تشكيل دعم تحميل غير فاقد للجودة.", - "@aboutBinimumDesc": { - "description": "Credit description for binimum" - }, - "discographyFetchingAlbum": "Fetching {current} of {total}...", - "@discographyFetchingAlbum": { - "description": "Progress - fetching specific album", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "logAutoScrollOn": "Auto-scroll ON", - "@logAutoScrollOn": { - "description": "Tooltip when auto-scroll is enabled on the log screen" - }, - "@settingsMetadataSubtitle": { - "description": "Subtitle for metadata settings" - }, - "@regionCountryBR": { - "description": "Country name for SongLink region picker" - }, - "@lyricsProvidersTitle": { - "description": "Settings item title for lyrics provider order" - }, - "trackMetadataService": "الخدمة", - "@trackMetadataService": { - "description": "Metadata field - download service used" - }, - "discographyAddedToQueue": "Added {count} tracks to queue", - "cueSplitTrackCount": "{count} tracks", - "@cueSplitTrackCount": { - "description": "Number of tracks in CUE sheet", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogImportPlaylistTitle": "استيراد قائمة تشغيل", - "@dialogImportPlaylistTitle": { - "description": "Dialog title - import CSV playlist" - }, - "@cleanupOrphanedDownloadsSubtitle": { - "description": "Subtitle for orphaned cleanup button" - }, - "settingsLocalLibrary": "Local Library", - "@settingsLocalLibrary": { - "description": "Settings menu item - local library" - }, - "@metadataSaveFailedStorage": { - "description": "Snackbar error when writing metadata file back to storage fails" - }, - "logCopyLogs": "Copy logs", - "@logCopyLogs": { - "description": "Tooltip for copying logs" - }, - "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", - "@downloadNetworkWifiOnlySubtitle": { - "description": "Subtitle for WiFi-only option in picker" - }, - "@lyricsModeBothSubtitle": { - "description": "Subtitle for both option" - }, - "@collectionAlreadyInPlaylist": { - "description": "Snackbar when track already exists in playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "@collectionFoldersTitle": { - "description": "Library section title for custom folders" - }, - "searchSortDateNewest": "تاريخ الإصدار (الأحدث)", - "@searchSortDateNewest": { - "description": "Sort option - newest release first" - }, - "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", - "@downloadDeduplicationDisabled": { - "description": "Subtitle when deduplication is off" - }, - "@recentTypeAlbum": { - "description": "Recent access item type - album" - }, - "nowPlayingPlayInOrder": "Play in order", - "@nowPlayingPlayInOrder": { - "description": "Tooltip when shuffle mode is disabled" - }, - "@cueSplitConfirmMessage": { - "description": "CUE split confirmation dialog message", - "placeholders": { - "album": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "@audioAnalysisFileSize": { - "description": "File size metric label" - }, - "artistSingles": "الأغاني و ال EPs", - "@artistSingles": { - "description": "Section header for singles/EPs" - }, - "@snackbarProviderPrioritySaved": { - "description": "Snackbar - provider order saved" - }, - "@recentPlaylistInfo": { - "description": "Snackbar message when tapping playlist in recent access", - "placeholders": { - "name": { - "type": "String", - "description": "Playlist name" - } - } - }, - "@lyricsProviderLyricsPlusDesc": { - "description": "Description for LyricsPlus provider" - }, - "@libraryFilterDownloaded": { - "description": "Filter chip - show only downloaded items" - }, - "recentPlaylistInfo": "Playlist: {name}", - "@optionsReplayGainSubtitleOn": { - "description": "Subtitle when ReplayGain is enabled" - }, - "@actionCreate": { - "description": "Generic action button - create" - }, - "@downloadSelectQuality": { - "description": "Dialog title - choose audio quality" - }, - "cueSplitAlbum": "Album: {album}", - "@cueSplitAlbum": { - "description": "Album name in CUE split sheet", - "placeholders": { - "album": { - "type": "String" - } - } - }, - "@trackCoverNoSource": { - "description": "Snackbar when no cover art URL or embedded cover" - }, - "@storeRepoUrlLabel": { - "description": "Label for the repository URL input field" - }, - "@notifLibraryScanCompleteBody": { - "description": "Notification body for library scan complete - number of indexed tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "optionsDetailedLogging": "تسجيل تفصيلي", - "@optionsDetailedLogging": { - "description": "Enable verbose logs for debugging" - }, - "@lyricsProvidersDiscardContent": { - "description": "Body text of the discard-changes dialog on lyrics provider page" - }, - "@dialogDisableHistoryTitle": { - "description": "Confirmation dialog title shown before disabling download history" - }, - "downloadLossyOpus128Subtitle": "أصغر حجم, ~4 ميغابايت لكل مسار", - "@downloadLossyOpus128Subtitle": { - "description": "Subtitle for Opus 128kbps lossy option" - }, - "@appName": { - "description": "App name - DO NOT TRANSLATE" - }, - "libraryActions": "Actions", - "@libraryActions": { - "description": "Section header for library actions" - }, - "setupNoFolderSelected": "لم يتم تحديد مجلد. هل ترغب في استخدام مجلد الموسيقى الافتراضي؟", - "@setupNoFolderSelected": { - "description": "Prompt when no folder selected" - }, - "downloadMusixmatchLanguageHint": "e.g. en, de, ja", - "trackSaveFailed": "Failed: {error}", - "@trackSaveFailed": { - "description": "Snackbar when save operation fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "replayGainBatchConfirmTitle": "إضافة ReplyGain", - "@replayGainBatchConfirmTitle": { - "description": "Title of the batch ReplayGain confirmation dialog" - }, - "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", - "@tutorialExtensionsTip1": { - "description": "Tutorial extensions tip 1" - }, - "@trackAddToQueue": { - "description": "Menu action to add a track to the playback queue" - }, - "@cacheTrackLookup": { - "description": "Cache item title for track ID lookup cache" - }, - "@discographyNoAlbums": { - "description": "Error - no albums found for artist" - }, - "@updateLater": { - "description": "Update button - dismiss" - }, - "@snackbarFailedToInstall": { - "description": "Snackbar - extension install error" - }, - "@albumFolderArtistAlbumFlatSubtitle": { - "description": "Folder structure example for flat singles" - }, - "@errorMissingExtensionSource": { - "description": "Error - extension source not available", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "libraryFilterSortAlbumAsc": "Album (A-Z)", - "@libraryFilterSortAlbumAsc": { - "description": "Sort option - album ascending" - }, - "@queueTrackCount": { - "description": "Track count label with plural support", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "audioAnalysisMono": "Mono", - "@trackLyricsSource": { - "description": "Label showing the lyrics source/provider", - "placeholders": { - "source": { - "type": "String" - } - } - }, - "@lyricsModeEmbed": { - "description": "Lyrics mode option - embed in audio file" - }, - "@storeRepoDialogCurrent": { - "description": "Label shown above the current repository URL in the dialog" - }, - "@cacheRefreshStats": { - "description": "Button label to refresh cache statistics" - }, - "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", - "@lyricsProviderAppleMusicDesc": { - "description": "Description for Apple Music provider" - }, - "@downloadDeduplication": { - "description": "Setting - skip tracks already in download history" - }, - "updateFailedMessage": "فشل تنزيل التحديث", - "@updateFailedMessage": { - "description": "Update error message" - }, - "cacheEstimatedTotal": "Estimated cache usage: {size}", - "@cacheEstimatedTotal": { - "description": "Total cache size shown in summary", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "@aboutVersion": { - "description": "Version info label" - }, - "dialogRetry": "إعادة المحاولة", - "@cueSplitSplitting": { - "description": "Snackbar while splitting CUE", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "@searchSortTitleZA": { - "description": "Sort option - title descending" - }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", - "@tutorialLibraryTip2": { - "description": "Tutorial library tip 2" - }, - "extensionHealthServiceOffline": "Service offline", - "@extensionHealthServiceOffline": { - "description": "Tooltip for offline extension service" - }, - "actionDeselect": "إلغاء التحديد", - "@actionDeselect": { - "description": "Action button - deselect all" - }, - "@trackConvertOriginal": { - "description": "Label for keeping original bit depth or sample rate during conversion" - }, - "@libraryClearConfirmTitle": { - "description": "Dialog title for clear confirmation" - }, - "@dialogDownloadAllMessage": { - "description": "Body of the Download All confirmation dialog", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "homeSupports": "يدعم: الأغنية، الألبوم، قائمة التشغيل، عناوين URL للفنان", - "@downloadedAlbumDeleteSelected": { - "description": "Button - delete selected tracks" - }, - "@recentShowAllDownloads": { - "description": "Button label to unhide hidden downloads in recent access" - }, - "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", - "@artistOptionRemoveFromFavorites": { - "description": "Action label - remove artist from favorite artists" - }, - "collectionPlaylistEmptyTitle": "Playlist is empty", - "@collectionPlaylistEmptyTitle": { - "description": "Playlist empty state title" - }, - "libraryFilterSortLatest": "Latest", - "@libraryFilterSortLatest": { - "description": "Sort option - newest first" - }, - "@libraryFilterMetadataMissingYear": { - "description": "Filter option - items missing release year/date" - }, - "@selectionSelected": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@tracksCount": { - "description": "Track count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@optionsCheckUpdates": { - "description": "Auto update check toggle" - }, - "@qualityHiResFlacMaxSubtitle": { - "description": "Technical spec for hi-res max" - }, - "actionStop": "Stop", - "@actionStop": { - "description": "Generic action - stop" - }, - "@selectionSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "folderOrganizationNoneSubtitle": "جميع الملفات في مجلد التحميل", - "@folderOrganizationNoneSubtitle": { - "description": "Subtitle for no organization option" - }, - "@updateDownloading": { - "description": "Update status - downloading" - }, - "artistAlbums": "الألبومات", - "@artistAlbums": { - "description": "Section header for artist albums" - }, - "trackConvertDitherTriangular": "TPDF", - "@trackConvertDitherTriangular": { - "description": "Lossless conversion triangular probability density function dither option" - }, - "nowPlayingShuffleLibraryFailed": "Could not shuffle library: {error}", - "@nowPlayingShuffleLibraryFailed": { - "description": "Snackbar when shuffling the library fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "@setupIcloudNotSupported": { - "description": "Error when user selects iCloud Drive on iOS" - }, - "@optionsArtistTagModeSplitVorbis": { - "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" - }, - "@extensionsProviderPrioritySection": { - "description": "Section header - provider priority" - }, - "@libraryShowDuplicateIndicatorSubtitle": { - "description": "Subtitle for duplicate indicator toggle" - }, - "sectionDuplicates": "Duplicates", - "@sectionDuplicates": { - "description": "Settings section header for deduplication" - }, - "@backupTitle": { - "description": "App bar title for the backup and restore page" - }, - "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", - "cacheSectionMaintenance": "Maintenance", - "@cacheSectionMaintenance": { - "description": "Section header for cleanup actions" - }, - "@editMetadataFieldGenre": { - "description": "Chip label for genre field in auto-fill selector" - }, - "@extensionsFallbackSubtitle": { - "description": "Subtitle for download fallback extensions menu" - }, - "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessage": { - "description": "Confirmation dialog message for batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "@selectionTapPlaylistsToSelect": { - "description": "Hint shown in playlist selection mode" - }, - "qualityHiResFlacMaxSubtitle": "24 بت / ما يصل إلى 192 كيلو هرتز", - "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", - "@snackbarRemovedTracksFromLoved": { - "description": "Snackbar after removing multiple tracks from Loved folder", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "folderOrganizationByArtistAlbum": "ألبوم/الفنان", - "@folderOrganizationByArtistAlbum": { - "description": "Folder option - nested folders" - }, - "snackbarCannotOpenFile": "تعذر فتح الملف: {error}", - "@snackbarCannotOpenFile": { - "description": "Snackbar - file open error", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "@optionsDetailedLoggingOff": { - "description": "Status when logging disabled" - }, - "@setupStorageDescription": { - "description": "Explanation for storage permission" - }, - "audioAnalysisCodec": "Codec", - "@regionCountryFR": { - "description": "Country name for SongLink region picker" - }, - "@optionsArtistTagMode": { - "description": "Setting title for how artist metadata is written into files" - }, - "@libraryClearConfirmMessage": { - "description": "Dialog message for clear confirmation" - }, - "trackLyricsNotAvailable": "كلمات الأغنية غير متوفرة لهذه الأغنية", - "@trackLyricsNotAvailable": { - "description": "Message when lyrics not found" - }, - "storeFilterUtility": "الأدوات", - "@storeFilterUtility": { - "description": "Store filter - utility extensions" - }, - "collectionAddedToPlaylist": "Added to \"{playlistName}\"", - "@collectionAddedToPlaylist": { - "description": "Snackbar after adding track to playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "cacheClearConfirmTitle": "Clear cache?", - "@cacheClearConfirmTitle": { - "description": "Dialog title before clearing one cache category" - }, - "@downloadAppleElrcWordSyncDisabled": { - "description": "Subtitle when Apple Music eLRC word sync is disabled" - }, - "@aboutMobileDeveloper": { - "description": "Role description for mobile dev" - }, - "albumFolderYearAlbum": "[Year] الألبوم", - "@albumFolderYearAlbum": { - "description": "Album folder option with year" - }, - "cacheTitle": "Storage & Cache", - "@extensionPostProcessing": { - "description": "Capability - post-download processing" - }, - "extensionsNoMetadataProvider": "لا توجد إضافات مع إمكانية مزود البيانات الوصفية", - "@extensionsNoMetadataProvider": { - "description": "Empty state - no metadata providers" - }, - "searchSortTitleZA": "العنوان (ي-أ)", - "@queueClearAllMessage": { - "description": "Clear queue confirmation" - }, - "audioAnalysisTitle": "Audio Quality Analysis", - "@audioAnalysisTitle": { - "description": "Title for audio analysis section" - }, - "@aboutReportIssueSubtitle": { - "description": "Subtitle for report issue" - }, - "@audioAnalysisSampleRate": { - "description": "Sample rate metric label" - }, - "@discographySelectedCount": { - "description": "Selection count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", - "@qualityFlacLosslessSubtitle": { - "description": "Technical spec for lossless" - }, - "libraryScanFinalizing": "Finalizing library...", - "@libraryScanFinalizing": { - "description": "Status shown after file scanning finishes but library persistence is still running" - }, - "@trackEditMetadata": { - "description": "Menu action - edit embedded metadata" - }, - "@downloadNeteaseIncludeRomanization": { - "description": "Setting to include romanized lyrics from Netease" - }, - "@optionsArtistTagModeJoinedSubtitle": { - "description": "Subtitle for joined artist tag mode" - }, - "regionCountryDE": "Germany", - "@regionCountryDE": { - "description": "Country name for SongLink region picker" - }, - "optionsAutoFallback": "التراجع التلقائي", - "@optionsAutoFallback": { - "description": "Auto-retry with other services" - }, - "@trackMetadataPlay": { - "description": "Action button - play track" - }, - "settingsFiles": "Files & Folders", - "@settingsFiles": { - "description": "Settings menu item - file and folder settings" - }, - "aboutMobileDeveloper": "مطور نسخة الهاتف", - "@trackDownloaded": { - "description": "Metadata label - download date" - }, - "homeSkipAlreadyDownloaded": "Skip already downloaded songs", - "@homeSkipAlreadyDownloaded": { - "description": "Checkbox label in import dialog to skip already-downloaded songs" - }, - "dialogUninstall": "إلغاء التثبيت", - "@dialogUninstall": { - "description": "Dialog button - uninstall extension" - }, - "collectionDeletePlaylist": "Delete playlist", - "@collectionDeletePlaylist": { - "description": "Action to delete playlist" - }, - "trackCoverOnline": "Online cover", - "@trackCoverOnline": { - "description": "Label shown when metadata autofill downloaded cover art from the internet" - }, - "downloadTitle": "إعدادات التحميل", - "@downloadTitle": { - "description": "Download settings page title" - }, - "searchArtists": "فنانون", - "@searchArtists": { - "description": "Search result category - artists" - }, - "extensionUrlHandler": "معالج الروابط", - "@extensionUrlHandler": { - "description": "Capability - handles URLs" - }, - "@timeHoursAgo": { - "description": "Relative time - hours ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "editMetadataAdvanced": "Advanced", - "@editMetadataAdvanced": { - "description": "Expandable section label for advanced metadata fields" - }, - "@actionSelectAll": { - "description": "Action button - select all items" - }, - "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", - "@timeMinutesAgo": { - "description": "Relative time - minutes ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "regionCountryXK": "Kosovo", - "@downloadAskQualitySubtitle": { - "description": "Subtitle for ask quality toggle" - }, - "setupLanguageSystemDefault": "الوضع الافتراضي للنظام", - "@setupLanguageSystemDefault": { - "description": "Option to use the system language" - }, - "@updateAvailable": { - "description": "Update dialog title" - }, - "cacheEntries": "{count} entries", - "@cacheEntries": { - "description": "Track cache entry count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@notifLibraryScanExcluded": { - "description": "Library scan complete suffix - excluded track count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionsMetadataPrioritySubtitle": "تعيين ترتيب مصدر البحث والبيانات الوصفية", - "@extensionsMetadataPrioritySubtitle": { - "description": "Subtitle for metadata priority" - }, - "downloadedAlbumSelectToDelete": "Select tracks to delete", - "@downloadedAlbumSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "@dialogClearHistoryTitle": { - "description": "Dialog title - clear download history" - }, - "tutorialSettingsTip1": "Change download location and folder organization", - "@tutorialSettingsTip1": { - "description": "Tutorial settings tip 1" - }, - "@extensionsInstalledSuccess": { - "description": "Success message after install" - }, - "allFilesAccessDisabledSubtitle": "Limited to media folders only", - "@allFilesAccessDisabledSubtitle": { - "description": "Subtitle when all files access is disabled" - }, - "@appearanceHistoryViewList": { - "description": "List layout option" - }, - "@notifAlreadyInLibraryCount": { - "description": "Notification title when track is already in library, with count", - "placeholders": { - "completed": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "@libraryFilterAll": { - "description": "Filter chip - show all library items" - }, - "settingsDownload": "إعدادات التحميل", - "settingsFilesSubtitle": "Download location, filename, folder structure", - "@settingsFilesSubtitle": { - "description": "Subtitle for files & folders settings" - }, - "@libraryFilterSort": { - "description": "Filter section - sort order" - }, - "metadataProvidersSubtitle": "Drag to set search and metadata source order", - "@extensionPermissions": { - "description": "Section header - required permissions" - }, - "selectionSelectToDelete": "حدد الأغاني المراد حذفها", - "@libraryExternalPlayerSubtitle": { - "description": "Subtitle for external player option" - }, - "extensionVerificationOpenBrowser": "Open browser", - "@extensionVerificationOpenBrowser": { - "description": "Button to open the extension verification URL in a browser" - }, - "@trackConvertConfirmMessageLossless": { - "description": "Confirmation dialog message for lossless-to-lossless conversion", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - } - } - }, - "@snackbarAddedTracksToQueue": { - "description": "Snackbar - multiple tracks added to queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@backupContentsWishlist": { - "description": "Backup contents row for wishlist tracks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@cacheCleanupUnusedSubtitle": { - "description": "Subtitle for cleanup unused data action" - }, - "trackLabel": "تصنيف", - "@trackLabel": { - "description": "Metadata label - record label" - }, - "@collectionAddedToLoved": { - "description": "Snackbar after adding track to loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "regionCountryGB": "United Kingdom", - "dialogCancel": "إلغاء", - "@dialogCancel": { - "description": "Dialog button - cancel action" - }, - "@folderOrganizationByArtistAlbumSubtitle": { - "description": "Subtitle for nested folder option" - }, - "@notifAllDownloadsComplete": { - "description": "Notification title when all downloads finish successfully" - }, - "setupEnableNotifications": "تمكين الإشعارات", - "@setupEnableNotifications": { - "description": "Button to enable notifications" - }, - "@notifFinalizingTrack": { - "description": "Notification title while finalizing (embedding metadata) a track", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "@downloadLossy320FormatDesc": { - "description": "Description in the lossy format picker" - }, - "filenameFormat": "صيغة الملف", - "@filenameFormat": { - "description": "Setting title - filename pattern" - }, - "historySearchHint": "سجل البحث...", - "@historySearchHint": { - "description": "Search bar placeholder in history" - }, - "@tutorialReadyMessage": { - "description": "Tutorial completion message" - }, - "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", - "@cacheTempDirectoryDesc": { - "description": "Description of what temporary directory contains" - }, - "@trackSaveLyrics": { - "description": "Menu action - save lyrics as .lrc file" - }, - "@notifDownloadsFinished": { - "description": "Notification title when queue finishes with some failures", - "placeholders": { - "completed": { - "type": "int" - }, - "failed": { - "type": "int" - } - } - }, - "@historyFilterAlbums": { - "description": "Filter chip - show albums only" - }, - "trackEmbedLyrics": "تضمين كلمات الأغنية", - "@trackEmbedLyrics": { - "description": "Action - embed lyrics into audio file" - }, - "@downloadPrimaryArtistOnlyOff": { - "description": "Status label when primary-artist-only folder naming is disabled" - }, - "@trackReEnrichFieldTrackInfo": { - "description": "Checkbox label for track info in re-enrich" - }, - "snackbarHistoryCleared": "تم مسح السجل.", - "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", - "@artistPopular": { - "description": "Section header for popular/top tracks" - }, - "@trackFetchOnlineLyrics": { - "description": "Action - fetch lyrics from online providers" - }, - "extensionLyricsProvider": "موفر كلمات الأغاني", - "@extensionLyricsProvider": { - "description": "Capability - provides lyrics" - }, - "historyFilterAll": "الكل", - "@historyFilterAll": { - "description": "Filter chip - show all items" - }, - "tutorialSearchTitle": "Finding Music", - "@lyricsModeExternal": { - "description": "Lyrics mode option - separate LRC file" - }, - "@actionDismiss": { - "description": "Generic action - dismiss" - }, - "trackOpenInSpotify": "فتح في Spotify", - "@trackOpenInSpotify": { - "description": "Action - open track in Spotify app" - }, - "@libraryClear": { - "description": "Button to clear all library entries" - }, - "discographyFailedToFetch": "Failed to fetch some albums", - "@filenameShowAdvancedTagsDescription": { - "description": "Description for advanced filename tag toggle" - }, - "@storeUpdate": { - "description": "Update available button" - }, - "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", - "@collectionPlaylistTracks": { - "description": "Track count label for custom playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "optionsPrimaryProviderSubtitle": "الخدمة المستخدمة للبحث عن طريق اسم الأغنية أو الألبوم", - "@optionsPrimaryProviderSubtitle": { - "description": "Subtitle for primary provider" - }, - "@downloadEmbedLyricsDisabled": { - "description": "Subtitle when lyrics embedding is blocked by metadata toggle" - }, - "@librarySourceLocal": { - "description": "Badge for tracks from local library scan" - }, - "@searchSortDurationLong": { - "description": "Sort option - longest duration first" - }, - "@downloadFilterContributingDisabled": { - "description": "Subtitle when contributing artist filter is off" - }, - "queueDownloadingCount": "Downloading ({count})", - "@queueDownloadingCount": { - "description": "Header for active downloads section with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionVerificationBrowserInApp": "In-app", - "trackAudioQuality": "جودة الصوت", - "@trackAudioQuality": { - "description": "Metadata label - audio quality" - }, - "libraryRemovedMissingFiles": "Removed {count} missing files from library", - "@libraryRemovedMissingFiles": { - "description": "Snackbar after cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", - "@collectionFavoriteArtistsEmptyTitle": { - "description": "Favorite artists empty state title" - }, - "@errorInvalidFolderSelected": { - "description": "Error when the selected folder is invalid" - }, - "@searchSortArtistZA": { - "description": "Sort option - artist descending" - }, - "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", - "@snackbarAddedTracksToLoved": { - "description": "Snackbar after adding multiple tracks to Loved folder", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", - "@cancelDownloadContent": { - "description": "Dialog body when confirming cancellation of an active download", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "settingsCacheSubtitle": "View size and clear cached data", - "@settingsCacheSubtitle": { - "description": "Subtitle for cache management menu" - }, - "notifLibraryScanCompleteBody": "{count} tracks indexed", - "@cacheSizeWithFiles": { - "description": "Cache size and file count", - "placeholders": { - "size": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "@downloadAskBeforeDownload": { - "description": "Setting - show quality picker" - }, - "@extensionHealthDegraded": { - "description": "Extension service health status - degraded" - }, - "@sectionPerformance": { - "description": "Settings section header" - }, - "@trackCoverCurrent": { - "description": "Label for the currently embedded cover preview" - }, - "discographySelectAlbums": "Select Albums...", - "@discographySelectAlbums": { - "description": "Option - manually select albums to download" - }, - "aboutAppDescription": "البحث عن بيانات التعريف الموسيقي، وإدارة الملحقات، وتنظيم مكتبتك.", - "@aboutAppDescription": { - "description": "App description in header card" - }, - "extensionCustomTrackMatching": "مطابقة المسار المخصص", - "@extensionCustomTrackMatching": { - "description": "Capability - custom track matching algorithm" - }, - "@editMetadataSelectNone": { - "description": "Button to clear selected fields for auto-fill" - }, - "@trackPlayNext": { - "description": "Menu action to play a track as the next queue item" - }, - "extensionCapabilities": "الإمكانيات", - "@extensionCapabilities": { - "description": "Section header - extension features" - }, - "@downloadSelectServiceToEnable": { - "description": "Subtitle when quality picker is disabled due to extension service" - }, - "logIssueRateLimitedDescription": "Too many requests to the service", - "@logIssueRateLimitedDescription": { - "description": "Diagnostic badge description for rate limiting" - }, - "@actionResume": { - "description": "Action button - resume download" - }, - "@updateDownloadInstall": { - "description": "Update button - download and install" - }, - "downloadLossy320Format": "تنسيق 320kbps مضغوط", - "@downloadLossy320Format": { - "description": "Title of the lossy format picker bottom sheet" - }, - "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", - "@trackCopyright": { - "description": "Metadata label - copyright information" - }, - "@snackbarExtensionInstalled": { - "description": "Snackbar - extension installed successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "@regionCountryJP": { - "description": "Country name for SongLink region picker" - }, - "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", - "@trackReEnrichOnlineSubtitle": { - "description": "Subtitle for re-enrich metadata action for local items" - }, - "nowPlayingNothingPlaying": "Nothing is playing", - "@nowPlayingNothingPlaying": { - "description": "Empty state when no track is currently playing" - }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", - "@tutorialDownloadDesc": { - "description": "Tutorial download page description" - }, - "@appearanceTitle": { - "description": "Appearance settings page title" - }, - "@backupExportSectionDescription": { - "description": "Description of what a backup contains" - }, - "@downloadLossyOpus128": { - "description": "Lossy format option - Opus 128kbps" - }, - "@logFilterSection": { - "description": "Filter section title" - }, - "trackReEnrichSuccess": "Metadata re-enriched successfully", - "@trackReEnrichSuccess": { - "description": "Snackbar after successful re-enrichment" - }, - "backupContentsHistory": "{count} history {count, plural, =1{item} other{items}}", - "@backupContentsHistory": { - "description": "Backup contents row for history count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedToQueue": "تمت إضافة {trackName} إلى قائمة الانتظار", - "@snackbarAddedToQueue": { - "description": "Snackbar - track added to download queue", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "libraryAutoScanOnOpen": "Every app open", - "@libraryAutoScanOnOpen": { - "description": "Auto scan when app opens" - }, - "audioAnalysisChannels": "Channels", - "@audioAnalysisChannels": { - "description": "Channels metric label" - }, - "appearanceHistoryViewList": "قائمة", - "updateDownloadInstall": "تحميل وتثبيت", - "@libraryShowDuplicateIndicator": { - "description": "Toggle for duplicate indicator in search" - }, - "extensionsHomeFeedOff": "Off", - "@extensionsHomeFeedOff": { - "description": "Extensions page - home feed provider option: off" - }, - "searchSortTitleAZ": "العنوان (أ-ي)", - "@searchSortTitleAZ": { - "description": "Sort option - title ascending" - }, - "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", - "@collectionRemovedFromLoved": { - "description": "Snackbar after removing track from loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "sectionAudioQuality": "جودة الصوت", - "@sectionAudioQuality": { - "description": "Settings section header" - }, - "trackConvertSuccess": "Converted to {format} successfully", - "@trackConvertSuccess": { - "description": "Snackbar after successful conversion", - "placeholders": { - "format": { - "type": "String" - } - } - }, - "dialogUninstallExtensionMessage": "هل أنت متأكد من أنك تريد إزالة {extensionName}؟", - "@dialogUninstallExtensionMessage": { - "description": "Dialog message - uninstall specific extension", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "downloadNativeWorkerSubtitle": "خدمة Android في الخلفية لتنزيلات الإضافات", - "@downloadNativeWorkerSubtitle": { - "description": "Setting subtitle for Android native download worker" - }, - "storeUpdate": "تحديث", - "libraryFilterMetadataMissingAny": "Missing any metadata", - "@libraryFilterMetadataMissingAny": { - "description": "Filter option - items missing any tracked metadata field" - }, - "@selectionBatchConvertConfirmMessageLosslessCapped": { - "description": "Confirmation dialog message for capped lossless batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "editMetadataAutoFillDesc": "Select fields to fill automatically from online metadata", - "@editMetadataAutoFillDesc": { - "description": "Description for the auto-fill section" - }, - "@lyricsProviderExtensionDesc": { - "description": "Generic description for extension-based lyrics providers" - }, - "downloadSongLinkRegion": "SongLink Region", - "@downloadSongLinkRegion": { - "description": "Setting for SongLink region used during fallback resolution" - }, - "shareSheetNoExtensions": "No other compatible services", - "@shareSheetNoExtensions": { - "description": "Empty state when no extensions can be searched for cross-service links" - }, - "queueFlacConfirmMessage": "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", - "@queueFlacConfirmMessage": { - "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tooltipAddToPlaylist": "Add to Playlist", - "@tooltipAddToPlaylist": { - "description": "Tooltip for the Add to Playlist button" - }, - "@snackbarAddedToQueueGeneric": { - "description": "Snackbar when a track is added to the playback queue without naming it" - }, - "@tutorialSettingsTip2": { - "description": "Tutorial settings tip 2" - }, - "extensionPermissions": "الصلاحيات", - "releaseTypeSingle": "Single", - "aboutTelegramChannelSubtitle": "الإعلانات والتحديثات", - "@aboutTelegramChannelSubtitle": { - "description": "Subtitle for Telegram channel" - }, - "@dialogDisableAndClear": { - "description": "Confirmation action to disable download history and clear existing entries" - }, - "@homeSearchHintProvider": { - "description": "Placeholder for the main search field when a provider is selected", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, - "metadataProvidersTitle": "Metadata Provider Priority", - "@metadataProvidersTitle": { - "description": "Settings item title for metadata provider order" - }, - "trackAddToQueue": "Add to queue", - "audioAnalysisDecodedFormat": "Decoded Format", - "@audioAnalysisDecodedFormat": { - "description": "Decoded sample format metric label" - }, - "@editMetadataSelectEmpty": { - "description": "Button to select only fields that are currently empty" - }, - "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", - "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", - "@discographyAlbumsOnlySubtitle": { - "description": "Subtitle showing album tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "setupNotificationEnable": "تمكين الإشعارات", - "@setupNotificationEnable": { - "description": "Button to enable notifications" - }, - "settingsAppearanceSubtitle": "السمة والألوان والعرض", - "@settingsAppearanceSubtitle": { - "description": "Appearance settings description" - }, - "@notifUpdateFailedBody": { - "description": "Notification body when app update download fails" - }, - "@aboutOriginalCreator": { - "description": "Role description for original creator" - }, - "libraryBuiltInPreviewPlayer": "Built-in preview player", - "@libraryBuiltInPreviewPlayer": { - "description": "Setting option to use the built-in preview player" - }, - "tooltipPlay": "تشغيل", - "@tooltipPlay": { - "description": "Tooltip - play button" - }, - "@safMigrationMessage2": { - "description": "Second paragraph of SAF migration dialog" - }, - "@extensionsSearchProvider": { - "description": "Setting - search provider selection" - }, - "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", - "@libraryAboutDescription": { - "description": "Description of local library feature" - }, - "downloadAskBeforeDownload": "اسأل قبل التحميل", - "nowPlayingNoMetadata": "No metadata available", - "@nowPlayingNoMetadata": { - "description": "Empty state when track metadata cannot be loaded" - }, - "trackInstrumental": "المسار الآلي", - "@trackInstrumental": { - "description": "Message when track is instrumental (no lyrics)" - }, - "@collectionWishlistEmptyTitle": { - "description": "Wishlist empty state title" - }, - "selectionBatchConvertConfirmMessageLosslessCapped": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.", - "downloadDeduplication": "Skip Duplicate Downloads", - "libraryFilterSortOldest": "Oldest", - "@libraryFilterSortOldest": { - "description": "Sort option - oldest first" - }, - "setupSkip": "التخطي الآن", - "@setupSkip": { - "description": "Skip current step button" - }, - "@setupFolderDescription": { - "description": "Explanation for folder selection" - }, - "@settingsLogsSubtitle": { - "description": "Logs settings description" - }, - "storeNewRepoUrlLabel": "رابط المستودع", - "@storeNewRepoUrlLabel": { - "description": "Label for the new repository URL field inside the dialog" - }, - "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", - "@cacheClearConfirmMessage": { - "description": "Dialog message before clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "trackMetadataPlay": "تشغيل", - "@libraryEnableLocalLibrary": { - "description": "Toggle to enable library scanning" - }, - "optionsUpdateChannel": "قناة التحديث", - "@optionsUpdateChannel": { - "description": "Stable vs preview releases" - }, - "@downloadCreatePlaylistSourceFolderDisabled": { - "description": "Subtitle when playlist folder is disabled" - }, - "@extensionRefreshStatus": { - "description": "Tooltip for refreshing extension service health status" - }, - "backupRestoreRestartHint": "Restart the app to make sure every change is applied.", - "@backupRestoreRestartHint": { - "description": "Hint shown after restoring that an app restart is recommended" - }, - "@snackbarExtensionInstalledEnable": { - "description": "Snackbar after installing an extension from the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "settingsAutoExportFailedSubtitle": "حفظ التنزيلات التي فشلت إلى ملف TXT تلقائيًا", - "@settingsAutoExportFailedSubtitle": { - "description": "Subtitle for auto-export setting" - }, - "searchSortArtistAZ": "الفنان (أ-ي)", - "@searchSortArtistAZ": { - "description": "Sort option - artist ascending" - }, - "editMetadataFieldAlbumArtist": "Album Artist", - "@editMetadataFieldAlbumArtist": { - "description": "Chip label for album artist field in auto-fill selector" - }, - "@queueEmptyHistory": { - "description": "Empty state title when download history is empty" - }, - "@dialogDisableHistoryMessage": { - "description": "Confirmation dialog message shown before disabling download history" - }, - "queueFlacNoReliableMatches": "No reliable online matches found for the selection", - "@queueFlacNoReliableMatches": { - "description": "Snackbar when no safe FLAC redownload matches were found" - }, - "trackOpenInDeezer": "فتح في Deezer", - "@trackOpenInDeezer": { - "description": "Action - open track in Deezer app" - }, - "setupChooseFromFilesSubtitle": "حدد iCloud أو موقع آخر", - "@setupChooseFromFilesSubtitle": { - "description": "Subtitle for file picker" - }, - "artistMonthlyListeners": "{count} مستمع شهري", - "@artistMonthlyListeners": { - "description": "Monthly listener count display", - "placeholders": { - "count": { - "type": "String", - "description": "Formatted listener count" - } - } - }, - "@downloadLossyAacSubtitle": { - "description": "Subtitle for AAC/M4A 320kbps lossy option" - }, - "cacheSectionStorage": "Cached Data", - "@cacheSectionStorage": { - "description": "Section header for cache entries" - }, - "@libraryAutoScanWeekly": { - "description": "Auto scan once per week" - }, - "tutorialDownloadCompletedSemantics": "Download completed", - "@tutorialDownloadCompletedSemantics": { - "description": "Accessibility label for completed download state in tutorial demo" - }, - "@logNoLogsYet": { - "description": "Empty state title" - }, - "@selectionDeletePlaylistsCount": { - "description": "Button label for deleting multiple selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", - "@downloadSeparateSinglesEnabled": { - "description": "Subtitle when separate singles folder is on" - }, - "setupAppDocumentsFolder": "مجلد مستندات التطبيق", - "@setupAppDocumentsFolder": { - "description": "iOS documents folder option" - }, - "storeLoadError": "فشل تحميل المستودع", - "settingsDownloadNetwork": "تحميل الشبكة", - "metadataSaveFailedStorage": "Failed to write metadata back to storage", - "@logAutoScrollOff": { - "description": "Tooltip when auto-scroll is disabled on the log screen" - }, - "@trackConvertFormat": { - "description": "Menu item - convert audio format" - }, - "optionsArtistTagModeJoined": "قيمة مشتركة واحدة", - "@optionsArtistTagModeJoined": { - "description": "Artist tag mode option that joins multiple artists into one value" - }, - "@dateYesterday": { - "description": "Relative date - yesterday" - }, - "@settingsExtensionsSubtitle": { - "description": "Extensions settings description" - }, - "searchSortArtistZA": "الفنان (ي-أ)", - "@extensionSettings": { - "description": "Section header - extension settings" - }, - "@extensionOauthConnectHint": { - "description": "Hint for an OAuth login link field before connecting Spotify" - }, - "@notifUpdateReady": { - "description": "Notification title when app update download is complete" - }, - "@regionCountryMX": { - "description": "Country name for SongLink region picker" - }, - "@nowPlayingOpenInExternalPlayer": { - "description": "Menu item to open the current track in an external player" - }, - "trackConvertDithering": "Dithering", - "@trackConvertDithering": { - "description": "Section label for lossless conversion dithering options" - }, - "settingsDownloadSubtitle": "الخدمة والجودة الأحتياطات", - "@settingsDownloadSubtitle": { - "description": "Download settings description" - }, - "libraryLastScanned": "Last scanned: {time}", - "@libraryLastScanned": { - "description": "Last scan time display", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "setupIosEmptyFolderWarning": "حدود iOS: لا يمكن تحديد مجلدات فارغة. اختر مجلدا مع ملف واحد على الأقل.", - "@setupIosEmptyFolderWarning": { - "description": "iOS folder selection warning" - }, - "@storeAddRepoDescription": { - "description": "Store setup screen - explanatory text" - }, - "@snackbarFailedToInstallNamed": { - "description": "Snackbar when extension install fails in the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "@collectionAddedTracksToPlaylist": { - "description": "Snackbar after adding multiple tracks to a playlist", - "placeholders": { - "count": { - "type": "int" - }, - "playlistName": { - "type": "String" - } - } - }, - "updateNew": "جديد", - "@updateNew": { - "description": "Label for new version" - }, - "settingsExtensionsSubtitle": "إدارة موفري التحميل", - "@albumFolderArtistAlbumSinglesSubtitle": { - "description": "Folder structure example" - }, - "trackReEnrichSelectAll": "Select All", - "@trackReEnrichSelectAll": { - "description": "Select all fields checkbox in re-enrich" - }, - "@extensionsUninstall": { - "description": "Uninstall extension button" - }, - "@downloadUseAlbumArtistForFoldersTrackSubtitle": { - "description": "Subtitle when track artist is used for folder names" - }, - "@logIssueNetworkErrorLabel": { - "description": "Diagnostic badge label for generic network errors" - }, - "albumFolderArtistYearAlbumSubtitle": "الألبومات/اسم الفنان /[2005] اسم الألبوم/", - "@albumFolderArtistYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "itemCount": "{count} {count, plural, =1{item} other{items}}", - "@itemCount": { - "description": "Generic item count label", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographyFetchingTracks": "Fetching tracks...", - "@discographyFetchingTracks": { - "description": "Progress - fetching album tracks" - }, - "@libraryFolder": { - "description": "Folder selection setting" - }, - "queueEmptyAlbums": "No album downloads", - "@queueEmptyAlbums": { - "description": "Empty state title when no album downloads exist" - }, - "@metadataProviderPriorityDescription": { - "description": "Metadata priority page description" - }, - "@extensionVerificationHelpTitleManual": { - "description": "Dialog title when automatic browser launch for verification fails" - }, - "extensionError": "خطأ", - "@extensionError": { - "description": "Extension detail - error message" - }, - "@trackLyricsLoadFailed": { - "description": "Message when lyrics loading fails" - }, - "@downloadedAlbumDeleteCount": { - "description": "Delete button text with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@extensionsNoHomeFeedExtensions": { - "description": "Extensions page - shown when no installed extension has home feed" - }, - "@collectionArtistCount": { - "description": "Artist count label for favorite artists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsArtists": "{count, plural, =1{1 favorite artist} other{{count} favorite artists}}", - "@backupContentsArtists": { - "description": "Backup contents row for favorite artists count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@trackRemoveFromDevice": { - "description": "Action - delete downloaded file" - }, - "lyricsProvidersEnabledSection": "Enabled ({count})", - "@lyricsProvidersEnabledSection": { - "description": "Section header for enabled providers", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@cueSplitTitle": { - "description": "Title for CUE split bottom sheet" - }, - "@downloadedAlbumSelectedCount": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@trackOptionRemoveFromWishlist": { - "description": "Bottom sheet action label - remove track from wishlist" - }, - "notifDownloadingTrack": "Downloading {trackName}", - "@notifDownloadingTrack": { - "description": "Notification title while downloading a track", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "@discographySkippedDownloaded": { - "description": "Snackbar - with skipped tracks count", - "placeholders": { - "added": { - "type": "int" - }, - "skipped": { - "type": "int" - } - } - }, - "@tutorialSettingsTip3": { - "description": "Tutorial settings tip 3" - }, - "@announcementUnableToOpenLink": { - "description": "Snackbar shown when an announcement CTA link cannot be opened" - }, - "trackReleaseDate": "تاريخ الإصدار", - "discographySelectedCount": "{count} selected", - "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", - "logIssueNetworkErrorLabel": "NETWORK ERROR", - "updateStartingDownload": "جاري بدء التنزيل...", - "@updateStartingDownload": { - "description": "Update status - initializing" - }, - "trackDiscNumber": "رقم القرص", - "@trackDiscNumber": { - "description": "Metadata label - disc number" - }, - "optionsUsingExtension": "استخدام الإضافة: {extensionName}", - "@optionsUsingExtension": { - "description": "Shows active extension name", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "dialogDisableHistoryTitle": "Turn off download history?", - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", - "@tutorialWelcomeTip3": { - "description": "Tutorial welcome tip 3" - }, - "@collectionPlaylistEmptySubtitle": { - "description": "Playlist empty state subtitle" - }, - "badgeBeta": "BETA", - "@tutorialSearchHint": { - "description": "Placeholder shown in the tutorial search demo" - }, - "cleanupOrphanedDownloadsNone": "No orphaned entries found", - "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", - "@updateDontRemind": { - "description": "Update button - skip this version" - }, - "@snackbarLoadingCueSheet": { - "description": "Snackbar while loading a CUE sheet file" - }, - "@dialogUninstallExtension": { - "description": "Dialog title - uninstall extension" - }, - "lyricsProvidersTitle": "Lyrics Provider Priority", - "@dialogRemove": { - "description": "Dialog button - remove item" - }, - "snackbarError": "Error: {error}", - "@snackbarError": { - "description": "Generic error snackbar with error detail", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "@sectionApp": { - "description": "Settings section header" - }, - "@libraryPlayback": { - "description": "Section header for playback settings in library settings" - }, - "@downloadPrimaryArtistOnlyOn": { - "description": "Status label when primary-artist-only folder naming is enabled" - }, - "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", - "previewStop": "إيقاف المعاينة", - "@previewStop": { - "description": "Tooltip for the button that stops the playing track preview snippet" - }, - "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", - "discographyAlbumsOnly": "Albums Only", - "@discographyAlbumsOnly": { - "description": "Option - download only albums" - }, - "@editMetadataFieldCopyright": { - "description": "Chip label for copyright field in auto-fill selector" - }, - "extensionsFallbackSubtitle": "اختر إضافات التحميل المثبتة التي يمكن استخدامها أثناء الرجوع التلقائي للمزود الاحتياطي", - "aboutSocial": "التواصل الإجتماعي", - "@aboutSocial": { - "description": "Section for social links" - }, - "audioAnalysisNyquist": "Nyquist", - "trackCoverSelected": "Selected cover", - "@trackCoverSelected": { - "description": "Label for the newly selected cover preview" - }, - "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", - "@downloadDeduplicationEnabled": { - "description": "Subtitle when deduplication is on" - }, - "homeEmptyTitle": "لا يوجد مزودي بحث بعد", - "@homeEmptyTitle": { - "description": "Title shown on home when no providers are available yet" - }, - "@extensionHealthUnknown": { - "description": "Extension service health status - unknown" - }, - "storeInstalled": "مثبت", - "@storeInstalled": { - "description": "Already installed badge" - }, - "trackReplayGainSuccess": "تم إضافة وسم ReplyGain", - "@trackReplayGainSuccess": { - "description": "Snackbar message after ReplayGain tags written for a single track" - }, - "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", - "@collectionPlaylistRenamed": { - "description": "Snackbar after renaming playlist" - }, - "@trackConvertResamplerSoxr": { - "description": "Lossless conversion SoX resampler option" - }, - "@dialogUnsavedChanges": { - "description": "Dialog message - unsaved changes" - }, - "dialogDownload": "تنزيل", - "@dialogDownload": { - "description": "Confirm button in Download All dialog" - }, - "trackLyricsLoadFailed": "فشل تحميل كلمات الأغاني", - "@backupContentsTitle": { - "description": "Header above the list summarizing what the backup contains" - }, - "@safMigrationTitle": { - "description": "Title of SAF migration dialog" - }, - "@trackReEnrichFieldLyrics": { - "description": "Checkbox label for lyrics field in re-enrich" - }, - "setupPermissionDeniedMessage": "تم رفض الإذن. الرجاء منح كافة الصلاحيات للمتابعة.", - "@setupPermissionDeniedMessage": { - "description": "Error when permission denied" - }, - "settingsDownloadNetworkWifiOnly": "WiFi فقط", - "@settingsDownloadNetworkWifiOnly": { - "description": "Network option - only use WiFi" - }, - "@backupIncludeSecrets": { - "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" - }, - "@libraryFilterMetadataMissingAlbumArtist": { - "description": "Filter option - items missing album artist" - }, - "@extensionHealthServiceUnknown": { - "description": "Tooltip for unknown extension service health" - }, - "snackbarExtensionUpdated": "تم تحديث {extensionName}.", - "@snackbarExtensionUpdated": { - "description": "Snackbar - extension updated successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "homeEmptySubtitle": "قم بتثبيت مكون إضافي للمتابعة.", - "@settingsTitle": { - "description": "Settings screen title" - }, - "@libraryFilterMetadataIncorrectIsrcFormat": { - "description": "Filter option - items with an invalid ISRC format" - }, - "@notifLibraryScanComplete": { - "description": "Notification title when library scan finishes" - }, - "@logIssueIspBlockingLabel": { - "description": "Diagnostic badge label when ISP blocking is detected" - }, - "tutorialDownloadTitle": "Downloading Music", - "@tutorialDownloadTitle": { - "description": "Tutorial download page title" - }, - "unknownTitle": "Unknown title", - "@unknownTitle": { - "description": "Fallback track title when metadata is missing" - }, - "navLibrary": "المكتبة", - "@navLibrary": { - "description": "Bottom navigation - Library tab" - }, - "@snackbarAlreadyDownloaded": { - "description": "Snackbar - track already exists", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "editMetadataSelectAll": "All", - "@editMetadataSelectAll": { - "description": "Button to select all fields for auto-fill" - }, - "storeEmptyNoExtensions": "لا توجد إضافات متاحة", - "@storeEmptyNoExtensions": { - "description": "Message when store has no extensions" - }, - "optionsUpdateChannelWarning": "قد تحتوي الإصدارات التجريبية أخطاءً أو ميزات غير مكتملة", - "@optionsUpdateChannelWarning": { - "description": "Warning about preview channel" - }, - "@collectionPlaylistNameHint": { - "description": "Hint text for playlist name input" - }, - "notifLibraryScanComplete": "Library scan complete", - "editMetadataFieldIsrc": "ISRC", - "@editMetadataFieldIsrc": { - "description": "Chip label for ISRC field in auto-fill selector" - }, - "@libraryFolderHint": { - "description": "Placeholder when no folder selected" - }, - "homeSearchHintDefault": "Paste supported URL or search...", - "@homeSearchHintDefault": { - "description": "Default placeholder for the main search field on Home" - }, - "extensionsNoExtensionsSubtitle": "تثبيت ملفات .spotiflac-ext لإضافة موفرين جدد", - "@extensionsNoExtensionsSubtitle": { - "description": "Empty state subtitle" - }, - "@extensionEnterValue": { - "description": "Hint for editing an extension setting value" - }, - "backupRestoreConfirmTitle": "Restore this backup?", - "@backupRestoreConfirmTitle": { - "description": "Confirmation dialog title before restoring a backup" - }, - "@libraryScanSelectFolderFirst": { - "description": "Message when trying to scan without folder" - }, - "@qualityHiResFlac": { - "description": "Quality option - high resolution FLAC" - }, - "aboutSpecialThanks": "شكر خاص لِ", - "@aboutSpecialThanks": { - "description": "Section for special thanks" - }, - "storeInstall": "تثبيت", - "@storeInstall": { - "description": "Install extension button" - }, - "@collectionWishlistEmptySubtitle": { - "description": "Wishlist empty state subtitle" - }, - "historyFilterAlbums": "الألبومات", - "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", - "@extensionCustomUrlHandlingSubtitle": { - "description": "Extension detail subtitle for custom URL handling" - }, - "filenameShowAdvancedTagsDescription": "تمكين العلامات المنسقة لحشو المقطع الصوتي وأنماط التاريخ", - "@aboutReportIssue": { - "description": "Link to report bugs" - }, - "@folderOrganizationByPlaylist": { - "description": "Folder option - playlist folders" - }, - "@dateWeeksAgo": { - "description": "Relative date - weeks ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "logEntriesFiltered": "الإدخالات ({count} تم تصفيتها)", - "@logEntriesFiltered": { - "description": "Log count with filter active", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@lyricsModeDescription": { - "description": "Lyrics mode picker description" - }, - "@setupAppDocumentsFolderSubtitle": { - "description": "Subtitle for documents folder" - }, - "storeAddRepoButton": "أضف مستودعًا", - "@storeAddRepoButton": { - "description": "Button to submit a new repository URL" - }, - "@collectionLovedEmptyTitle": { - "description": "Loved empty state title" - }, - "aboutReportIssue": "الإبلاغ عن خطأ", - "snackbarFailedToWriteStorage": "Failed to write back to storage", - "@snackbarFailedToWriteStorage": { - "description": "Snackbar when writing metadata back to file fails" - }, - "errorInvalidFolderSelected": "Invalid folder selected", - "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", - "@allFilesAccessDisabledMessage": { - "description": "Snackbar message when user disables all files access" - }, - "downloadMusixmatchLanguageCode": "Language code", - "@downloadMusixmatchLanguageCode": { - "description": "Label for Musixmatch language input field" - }, - "dialogUnsavedChanges": "لديك تغييرات غير محفوظة. هل تريد المتابعة دون حفظها؟", - "setupChooseFromFiles": "اختر من الملفات", - "@setupChooseFromFiles": { - "description": "iOS file picker option" - }, - "@collectionFavoriteArtistsEmptySubtitle": { - "description": "Favorite artists empty state subtitle" - }, - "downloadLossy320FormatDesc": "اختر التنسيق النهائي للتنزيلات المضغوطة 320kbps. سيتم تحويل البث الأصلي إلى التنسيق المحدد عند الحاجة.", - "@backupRestoreConfirmButton": { - "description": "Confirm button to proceed with restore" - }, - "@queueEmptyAlbumsSubtitle": { - "description": "Empty state subtitle for album downloads" - }, - "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", - "@collectionRemovedFromWishlist": { - "description": "Snackbar after removing track from wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "extensionsInstalledSuccess": "تم تثبيت الإضافة بنجاح", - "progressReadingCsv": "جاري قراءة CSV...", - "@progressReadingCsv": { - "description": "Progress indicator - parsing CSV file" - }, - "artistReleases": "Releases", - "@artistReleases": { - "description": "Section header for all artist releases" - }, - "extensionVerificationBrowserTitle": "Verification browser", - "@optionsDefaultSearchTabSubtitle": { - "description": "Subtitle for the preferred default search tab setting" - }, - "optionsArtistTagModeJoinedSubtitle": "اكتب قيمة ARTIST واحدة مثل \"الفنان A، الفنان B\" لتحقيق التوافق الأقصى لمشغل الأغاني.", - "downloadLossy320": "320kbps مضغوط", - "@downloadLossy320": { - "description": "Quality option label for lossy 320kbps" - }, - "queueFlacAction": "Queue FLAC", - "@queueFlacAction": { - "description": "Action/button label for queueing FLAC redownloads for local tracks" - }, - "@setupDownloadLocationIosMessage": { - "description": "iOS-specific folder info" - }, - "trackConvertOriginal": "Original", - "sectionLyricsProviderOptions": "Provider Options", - "nowPlayingTitle": "Now Playing", - "@nowPlayingTitle": { - "description": "Title for the now playing screen" - }, - "@extensionHealthChecksConfigured": { - "description": "Extension service health check count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@cacheClearAll": { - "description": "Button label to clear all caches" - }, - "a11yDeselectTrack": "Deselect track", - "@a11yDeselectTrack": { - "description": "Accessibility label for deselecting a track" - }, - "@lyricsProvidersInfoText": { - "description": "Info tip on lyrics provider priority page" - }, - "queueEmptyHistory": "No download history", - "dialogClear": "محو", - "@dialogClear": { - "description": "Dialog button - clear items" - }, - "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", - "@allFilesAccessDescription": { - "description": "Description explaining when to enable all files access" - }, - "trackConvertConfirmTitle": "Confirm Conversion", - "storeCategoryLyrics": "Lyrics", - "@storeCategoryLyrics": { - "description": "Store extension category - lyrics" - }, - "@lyricsProvidersDescription": { - "description": "Description on the lyrics provider priority page" - }, - "tooltipLoveAll": "Love All", - "downloadDirectory": "مسار التنزيل", - "@downloadDirectory": { - "description": "Setting - download folder" - }, - "@tutorialExtensionsTip2": { - "description": "Tutorial extensions tip 2" - }, - "libraryFolder": "Library Folder", - "optionsMaxQualityCoverSubtitle": "تنزيل أعلى دقة لغلاف الأغنية", - "@metadataProviderPriorityTitle": { - "description": "Metadata priority page title" - }, - "@cleanupOrphanedDownloadsResult": { - "description": "Snackbar after orphan cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", - "@cacheExploreFeedDesc": { - "description": "Description of what explore feed cache contains" - }, - "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", - "@a11yOpenTrackByArtist": { - "description": "Accessibility label for opening a track item", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "announcementUnableToOpenLink": "Unable to open link. Please try again.", - "libraryFilterSortAlbumDesc": "Album (Z-A)", - "@libraryFilterSortAlbumDesc": { - "description": "Sort option - album descending" - }, - "trackConvertBitrate": "Bitrate", - "@trackConvertBitrate": { - "description": "Label for bitrate selection" - }, - "audioAnalysisFileSize": "Size", - "extensionHealthServiceOnline": "Service online", - "@extensionHealthServiceOnline": { - "description": "Tooltip for online extension service" - }, - "logEntries": "الإدخالات ({count})", - "@logEntries": { - "description": "Total log count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", - "@trackConvertConfirmMessage": { - "description": "Confirmation dialog message", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "@optionsArtistTagModeSplitVorbisSubtitle": { - "description": "Subtitle for split Vorbis artist tag mode" - }, - "folderOrganizationByAlbum": "حسب الألبوم", - "@folderOrganizationByAlbum": { - "description": "Folder option - album folders" - }, - "libraryPlayback": "Playback", - "@storeFilterAll": { - "description": "Store filter - all extensions" - }, - "aboutApp": "التطبيق", - "@aboutApp": { - "description": "Section for app info" - }, - "optionsReplayGainSubtitleOff": "معطل: لا توجد علامات تطبيع للصوت", - "@optionsReplayGainSubtitleOff": { - "description": "Subtitle when ReplayGain is disabled" - }, - "@storeRepoDialogTitle": { - "description": "Title of the change/remove repository dialog" - }, - "settingsLyricsSubtitle": "Embed, mode, providers, language options", - "@settingsLyricsSubtitle": { - "description": "Subtitle for lyrics settings" - }, - "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", - "storeFilterIntegration": "التكامل", - "@storeFilterIntegration": { - "description": "Store filter - integrations" - }, - "@lyricsProvidersAtLeastOne": { - "description": "Snackbar when user tries to disable the last enabled provider" - }, - "@appearanceHistoryViewGrid": { - "description": "Grid layout option" - }, - "trackDownloaded": "تم التنزيل", - "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.", - "setupDownloadLocationIosMessage": "على iOS، يتم حفظ التحميلات إلى مجلد مستندات التطبيق. يمكنك الوصول إليها عبر تطبيق الملفات.", - "optionsArtistTagModeDescription": "اختر كيف يتم كتابة العديد من الفنانين في العلامات المضمنة.", - "@optionsArtistTagModeDescription": { - "description": "Bottom-sheet description for artist tag mode setting" - }, - "@queueRetryAllFailed": { - "description": "Button to retry every failed download in the queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@trackConvertDitherTriangularHp": { - "description": "Lossless conversion high-pass triangular dither option" - }, - "@extensionVerificationCopyLink": { - "description": "Button to copy the extension verification URL" - }, - "searchSongs": "أغاني", - "@searchSongs": { - "description": "Search result category - songs" - }, - "@appearanceHistoryView": { - "description": "Layout style for history" - }, - "sectionFileSettings": "إعدادات الملف", - "@sectionFileSettings": { - "description": "Settings section header" - }, - "@cancelDownloadTitle": { - "description": "Dialog title when confirming cancellation of an active download" - }, - "@cacheLibraryCover": { - "description": "Cache item title for local library cover art images" - }, - "audioAnalysisSpectralCutoff": "Spectral Cutoff", - "dialogDelete": "حذف", - "@dialogDelete": { - "description": "Dialog button - delete item" - }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", - "@tutorialLibraryDesc": { - "description": "Tutorial library page description" - }, - "@queueDownloadSpeedStatus": { - "description": "Queue status while downloading with speed", - "placeholders": { - "speed": { - "type": "String" - } - } - }, - "@extensionsHomeFeedOffSubtitle": { - "description": "Extensions page - subtitle for off home feed option" - }, - "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", - "@cacheCleanupResult": { - "description": "Snackbar after unused data cleanup", - "placeholders": { - "downloadCount": { - "type": "int" - }, - "libraryCount": { - "type": "int" - } - } - }, - "trackConvertLosslessHint": "Lossless conversion — no quality loss", - "@trackConvertLosslessHint": { - "description": "Hint shown when converting between lossless formats" - }, - "collectionRenamePlaylist": "Rename playlist", - "@collectionRenamePlaylist": { - "description": "Action to rename playlist" - }, - "@libraryFilterTitle": { - "description": "Filter bottom sheet title" - }, - "@storageModeAppFolder": { - "description": "Storage mode option - app-managed folder" - }, - "logTotalErrors": "Total errors: {count}", - "@logTotalErrors": { - "description": "Total error count in log issue analysis", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@setupStorageRequired": { - "description": "Title when storage permission needed" - }, - "@snackbarMetadataProviderSaved": { - "description": "Snackbar - metadata provider order saved" - }, - "@selectionBatchConvertConfirmTitle": { - "description": "Confirmation dialog title for batch conversion" - }, - "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", - "@extensionsHomeFeedAutoSubtitle": { - "description": "Extensions page - subtitle for auto home feed option" - }, - "setupLanguageDescription": "حدد لغتك المفضلة للتطبيق. يمكنك تغيير هذا لاحقًا من الإعدادات.", - "settingsBackupSubtitle": "Move your library, history and settings to a new device", - "@settingsBackupSubtitle": { - "description": "Subtitle for backup and restore settings item" - }, - "recentTypeArtist": "Artist", - "@recentTypeArtist": { - "description": "Recent access item type - artist" - }, - "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", - "artistCompilations": "التجميع", - "@artistCompilations": { - "description": "Section header for compilations" - }, - "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", - "@snackbarFolderPickerFailed": { - "description": "Snackbar shown when folder picker fails to open", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "@optionsDetailedLoggingOn": { - "description": "Status when logging enabled" - }, - "settingsSaveDownloadHistory": "Save download history", - "@settingsSaveDownloadHistory": { - "description": "Settings switch title for storing completed downloads in history" - }, - "@storeCategoryIntegration": { - "description": "Store extension category - integration" - }, - "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", - "@a11yOpenItemCount": { - "description": "Accessibility label for opening a grouped item with count", - "placeholders": { - "title": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "trackFileInfo": "معلومات الملف", - "@trackFileInfo": { - "description": "Tab title - file information" - }, - "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", - "audioAnalysisNoClipping": "No clipping", - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", - "@tutorialSettingsDesc": { - "description": "Tutorial settings page description" - }, - "lyricsModeExternalSubtitle": "فصل ملف .lrc لمشغلي الأغاني مثل Samsung Music", - "@lyricsModeExternalSubtitle": { - "description": "Subtitle for external option" - }, - "trackLoadLyrics": "تحميل كلمات الأغاني", - "@trackLoadLyrics": { - "description": "Action - fetch lyrics" - }, - "extensionVerificationHelpTitleWaiting": "Verification still waiting", - "@extensionVerificationHelpTitleWaiting": { - "description": "Dialog title when verification is taking longer than expected" - }, - "libraryFilterReset": "Reset", - "@libraryFilterReset": { - "description": "Reset all filters button" - }, - "@downloadAlbumArtistMetadataFull": { - "description": "Status label when album-artist folder filtering uses full metadata" - }, - "storeTitle": "مستودع الإضافات", - "@storeTitle": { - "description": "Store screen title" - }, - "libraryCleared": "Library cleared", - "@libraryCleared": { - "description": "Snackbar after clearing library" - }, - "queueDownloadCompleted": "Download completed", - "@queueDownloadCompleted": { - "description": "Accessibility label for completed download state in queue" - }, - "libraryTitle": "Local Library", - "@libraryTitle": { - "description": "Library settings page title" - }, - "queueAlbumCount": "{count, plural, =1{1 album} other{{count} albums}}", - "@queueAlbumCount": { - "description": "Album count label with plural support", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryClearConfirmTitle": "Clear Library", - "@backupExportSectionTitle": { - "description": "Section title for the export/backup card" - }, - "dialogClearAll": "مسح الكل", - "@dialogClearAll": { - "description": "Dialog title - clear all items" - }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", - "@tutorialExtensionsDesc": { - "description": "Tutorial extensions page description" - }, - "libraryExternalPlayer": "External player", - "@libraryExternalPlayer": { - "description": "Setting option to use an external music player" - }, - "editMetadataFieldGenre": "Genre", - "@tutorialLibraryTitle": { - "description": "Tutorial library page title" - }, - "folderOrganizationByPlaylist": "حسب قائمة التشغيل", - "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", - "@searchSortTitle": { - "description": "Bottom sheet title for search sort options" - }, - "editMetadataSelectNone": "None", - "@historyFilterSingles": { - "description": "Filter chip - show singles only" - }, - "@setupLanguageTitle": { - "description": "Title for the language selection step in setup" - }, - "trackSaveCoverArt": "Save Cover Art", - "@trackSaveCoverArt": { - "description": "Menu action - save album cover art as file" - }, - "@downloadAlbumFolderStructure": { - "description": "Setting - album folder organization" - }, - "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", - "@notifDownloadCompleteCount": { - "description": "Notification title when download is complete, with count", - "placeholders": { - "completed": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "setupUseDefault": "استخدم الافتراضي", - "@setupUseDefault": { - "description": "Button to use default folder" - }, - "logNoLogsYetSubtitle": "ستظهر السجلات هنا عند استخدام التطبيق", - "@logNoLogsYetSubtitle": { - "description": "Empty state subtitle" - }, - "@dateToday": { - "description": "Relative date - today" - }, - "trackSaveLyricsProgress": "Saving lyrics...", - "@trackSaveLyricsProgress": { - "description": "Snackbar while saving lyrics to file" - }, - "trackCoverSaved": "Cover art saved to {fileName}", - "@trackCoverSaved": { - "description": "Snackbar after cover art saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackReEnrichFieldLyrics": "Lyrics", - "@audioAnalysisRescan": { - "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" - }, - "@downloadNeteaseIncludeRomanizationEnabled": { - "description": "Subtitle when Netease romanization is on" - }, - "dialogDisableAndClear": "Turn off and clear", - "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", - "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", - "@notifLibraryScanProgressWithTotal": { - "description": "Notification body for library scan progress when total is known", - "placeholders": { - "scanned": { - "type": "int" - }, - "total": { - "type": "int" - }, - "percentage": { - "type": "int" - } - } - }, - "@extensionDetailsTags": { - "description": "Section title for extension tags" - }, - "@albumFolderAlbumOnlySubtitle": { - "description": "Folder structure example" - }, - "@audioAnalysisAnalyzing": { - "description": "Loading text while analyzing audio" - }, - "@settingsDonate": { - "description": "Settings menu item - donate page" - }, - "@collectionPlaylistNameRequired": { - "description": "Validation error for empty playlist name" - }, - "@backupImportSectionDescription": { - "description": "Description for the restore action" - }, - "storeFilterLyrics": "كلمات الأغنية", - "libraryAutoScan": "Auto Scan", - "@libraryAutoScan": { - "description": "Setting for automatic library scanning" - }, - "safMigrationMessage1": "SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.", - "@safMigrationMessage1": { - "description": "First paragraph of SAF migration dialog" - }, - "setupStorageRequired": "الإذن مطلوب للتخزين", - "@notifLibraryScanErrors": { - "description": "Library scan complete suffix - error count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "appearanceHistoryViewGrid": "شبكة", - "trackConvertConverting": "Converting audio...", - "@trackConvertConverting": { - "description": "Snackbar while converting" - }, - "@setupUseDefaultFolder": { - "description": "Dialog title for default folder" - }, - "optionsArtistTagModeSplitVorbisSubtitle": "اكتب علامة فنان لكل فنان لـ FLAC و Opus؛ تبقى MP3 و M4A منضمة.", - "snackbarPlayingNext": "Playing next", - "@snackbarPlayingNext": { - "description": "Snackbar when a track is inserted as the next queue item" - }, - "optionsDefaultSearchTabSubtitle": "اختر علامة التبويب التي تفتح أولاً لنتائج البحث الجديدة.", - "@editMetadataAutoFillFetch": { - "description": "Button label to fetch online metadata and fill selected fields" - }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", - "@sectionService": { - "description": "Settings section header" - }, - "notifUpdateProgress": "{received} / {total} MB • {percentage}%", - "@discographyDownloadSelected": { - "description": "Button - download selected albums" - }, - "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", - "@cacheClearAllConfirmMessage": { - "description": "Dialog message before clearing all caches" - }, - "extensionsHomeFeedProvider": "Home Feed Provider", - "@extensionsHomeFeedProvider": { - "description": "Extensions page - label for home feed provider selector" - }, - "@cacheExploreFeed": { - "description": "Cache item title for explore home feed cache" - }, - "@audioAnalysisDynamicRange": { - "description": "Dynamic range metric label" - }, - "unknownAlbum": "Unknown Album", - "trackCoverCurrent": "Current cover", - "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", - "downloadPrimaryArtistOnlyOff": "Primary only: Off", - "dialogDone": "تم", - "@dialogDone": { - "description": "Dialog button - action completed" - }, - "storeRepoUrlLabel": "رابط المستودع", - "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", - "@logIssueRateLimitedSuggestion": { - "description": "Diagnostic badge suggestion for rate limiting" - }, - "libraryScanProgress": "{progress}% of {total} files", - "@libraryScanProgress": { - "description": "Scan progress display", - "placeholders": { - "progress": { - "type": "String" - }, - "total": { - "type": "int" - } - } - }, - "collectionLovedEmptyTitle": "Loved folder is empty", - "tutorialExtensionsTitle": "Extensions", - "@tutorialExtensionsTitle": { - "description": "Tutorial extensions page title" - }, - "searchSortDurationShort": "المدة (الأقصر)", - "@searchSortDurationShort": { - "description": "Sort option - shortest duration first" - }, - "trackCopyFilePath": "نسخ مسار الملف", - "@trackCopyFilePath": { - "description": "Action - copy file path" - }, - "albumFolderArtistAlbumFlatSubtitle": "الفنان / الألبوم والفنان / الأغنية.flac", - "@trackConvertResampler": { - "description": "Section label for lossless conversion resampler options" - }, - "editMetadataFieldTrackNum": "Track #", - "@editMetadataFieldTrackNum": { - "description": "Chip label for track number field in auto-fill selector" - }, - "snackbarFailedToUpdate": "فشل تحديث الإضافة", - "@snackbarFailedToUpdate": { - "description": "Snackbar - extension update error" - }, - "notifAlreadyInLibrary": "Already in Library", - "@notifAlreadyInLibrary": { - "description": "Notification title when track is already in library" - }, - "collectionPlaylistNameHint": "Playlist name", - "extensionVerificationCopyLink": "Copy link", - "@replayGainBatchAnalyzing": { - "description": "Progress dialog title while batch scanning ReplayGain" - }, - "setupLanguageTitle": "اِختر اللغة", - "extensionId": "ID", - "@extensionId": { - "description": "Extension detail - unique ID" - }, - "regionCountryBR": "Brazil", - "@updateNewVersionReady": { - "description": "Update subtitle" - }, - "@queueDownloadedFileMissing": { - "description": "Accessibility label when a downloaded file is missing from disk" - }, - "@lyricsMode": { - "description": "Setting - how to save lyrics" - }, - "@settingsAppearance": { - "description": "Settings section - visual customization" - }, - "@setupStorageAccessMessageAndroid11": { - "description": "Android 11+ specific explanation" - }, - "@tutorialLibraryTip3": { - "description": "Tutorial library tip 3" - }, - "@downloadAppleQqMultiPersonDisabled": { - "description": "Subtitle when multi-person lyrics is off" - }, - "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", - "@libraryStorageAccessMessage": { - "description": "Dialog message for storage permission" - }, - "@tutorialLibraryTip1": { - "description": "Tutorial library tip 1" - }, - "dialogRemoveExtensionMessage": "هل أنت متأكد من أنك تريد إزالة هذه الإضافة؟ لا يمكن التراجع عن ذلك.", - "@dialogRemoveExtensionMessage": { - "description": "Dialog message - uninstall confirmation" - }, - "setupDownloadLocationTitle": "موقع حفظ التنزيلات", - "@setupDownloadLocationTitle": { - "description": "Download location dialog title" - }, - "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", - "@downloadNetworkCompatibilityModeEnabled": { - "description": "Subtitle when network compatibility mode is on" - }, - "@audioAnalysisBitDepth": { - "description": "Bit depth metric label" - }, - "trackOptionAddToLoved": "Add to Loved", - "@trackOptionAddToLoved": { - "description": "Bottom sheet action label - add track to loved folder" - }, - "cacheAppDirectory": "App cache directory", - "@cacheAppDirectory": { - "description": "Cache item title for app cache directory" - }, - "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", - "@navStore": { - "description": "Bottom navigation - Extension store tab" - }, - "extensionPostProcessing": "مرحلة ما بعد المعالجة", - "@searchTracks": { - "description": "Search filter label - tracks" - }, - "logCopied": "تم نسخ السجلات إلى الحافظة", - "@logCopied": { - "description": "Snackbar - logs copied" - }, - "@extensionHealthRequired": { - "description": "Label for a required extension service health check" - }, - "@previewPlay": { - "description": "Tooltip for the button that plays a short track preview snippet" - }, - "clickableLookingUpArtist": "Looking up artist...", - "@clickableLookingUpArtist": { - "description": "Snackbar shown while clickable artist metadata is being resolved" - }, - "@extensionVerificationBrowserSubtitleInApp": { - "description": "Subtitle when in-app browser is preferred for extension verification" - }, - "setupUseDefaultFolder": "استخدام المجلد الافتراضي؟", - "tutorialSearchHint": "Paste or search...", - "@logIssueTrackNotFoundLabel": { - "description": "Diagnostic badge label when a track is unavailable" - }, - "@storageModeAppFolderSubtitle": { - "description": "Subtitle for app folder storage mode" - }, - "downloadMusixmatchLanguage": "Musixmatch Language", - "@downloadMusixmatchLanguage": { - "description": "Setting for Musixmatch lyrics translation language" - }, - "lyricsModeExternal": "ملف .lrc منفصل", - "@setupSelectFolder": { - "description": "Button to select folder" - }, - "logSearchHint": "البحث في السجلات...", - "@backupCreateFailed": { - "description": "Snackbar when backup creation fails" - }, - "@settingsSaveDownloadHistorySubtitle": { - "description": "Settings switch subtitle for storing completed downloads in history" - }, - "@albumFolderArtistAlbumFlat": { - "description": "Album folder option with singles directly in artist folder" - }, - "extensionHealthRequired": "required", - "actionCancel": "إلغاء", - "@actionCancel": { - "description": "Action button - cancel operation" - }, - "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", - "@optionsEmbedMetadataSubtitleOff": { - "description": "Subtitle when metadata embedding is disabled" - }, - "downloadAllowLocalNetworkDisabled": "Local/private addresses are blocked for security", - "@downloadAllowLocalNetworkDisabled": { - "description": "Subtitle when allow local network access is off" - }, - "@extensionsDownloadPrioritySubtitle": { - "description": "Subtitle for download priority" - }, - "downloadSingleFilenameFormat": "تنسيق اسم الملف الفردي", - "@downloadSingleFilenameFormat": { - "description": "Setting for output filename pattern for singles/EPs" - }, - "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", - "@cacheSummarySubtitle": { - "description": "Helper text for cache summary card" - }, - "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", - "libraryFilterMetadataMissingTrackNumber": "Missing track number", - "@libraryFilterMetadataMissingTrackNumber": { - "description": "Filter option - items missing track number" - }, - "backupIncludeSecretsDescription": "Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.", - "@backupIncludeSecretsDescription": { - "description": "Explanation for the include-credentials toggle" - }, - "audioAnalysisChannelStats": "Per-channel Stats", - "@audioAnalysisChannelStats": { - "description": "Per-channel audio analysis section label" - }, - "@extensionServiceStatus": { - "description": "Extension detail section header for service status" - }, - "queueEmptySingles": "No single downloads", - "@queueEmptySingles": { - "description": "Empty state title when no single track downloads exist" - }, - "@snackbarSelectedPlaylistsEmpty": { - "description": "Snackbar when selected playlists contain no tracks" - }, - "@errorRateLimited": { - "description": "Error title - too many requests" - }, - "setupDownloadInFlac": "تحميل اغاني Spotify بصيغة FLAC", - "@setupDownloadInFlac": { - "description": "App tagline in setup" - }, - "trackRemoveFromDevice": "حذف من الجهاز", - "@extensionsNoDownloadProvider": { - "description": "Empty state - no download providers" - }, - "@backupCreated": { - "description": "Snackbar after a backup file is created" - }, - "cacheSummaryTitle": "Cache overview", - "@cacheSummaryTitle": { - "description": "Heading for cache summary card" - }, - "selectionReplayGainCount": "ٌReplyGain ({count})", - "@selectionReplayGainCount": { - "description": "Batch selection action button label for ReplayGain", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@setupNotificationBackgroundDescription": { - "description": "Detailed notification explanation" - }, - "safMigrationTitle": "Storage Update Required", - "snackbarMetadataSaved": "Metadata saved successfully", - "@snackbarMetadataSaved": { - "description": "Snackbar after successfully saving track metadata" - }, - "@backupContentsSettings": { - "description": "Backup contents row label for settings" - }, - "logClearLogsTitle": "حذف السجل", - "extensionsCustomSearch": "Custom search", - "@extensionsCustomSearch": { - "description": "Label for custom search provider" - }, - "@downloadFrom": { - "description": "Label - download source" - }, - "cacheSizeWithFiles": "{size} in {count} files", - "selectionShareNoFiles": "No shareable files found", - "@selectionShareNoFiles": { - "description": "Snackbar when no selected files exist on disk" - }, - "snackbarAddedTracksToQueue": "تم إضافة {count} أغانٍ إلى قائمة الانتظار", - "downloadFilenameInsertTag": "Tap to insert tag:", - "@downloadFilenameInsertTag": { - "description": "Label above filename tag chips" - }, - "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", - "@collectionRemovedFromFavoriteArtists": { - "description": "Snackbar after removing artist from favorite artists", - "placeholders": { - "artistName": { - "type": "String" - } - } - }, - "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", - "backupRestoreConfirmButton": "Restore", - "@libraryCleanupMissingFiles": { - "description": "Button to remove entries for missing files" - }, - "backupCreateFailed": "Failed to create backup", - "notifLibraryScanFailed": "Library scan failed", - "@notifLibraryScanFailed": { - "description": "Notification title when library scan fails" - }, - "audioAnalysisRescan": "Re-analyze", - "@trackTrackName": { - "description": "Metadata label - track title" - }, - "@setupPermissionRequired": { - "description": "Generic permission required title", - "placeholders": { - "permissionType": { - "type": "String", - "description": "Type of permission (Storage/Notification)" - } - } - }, - "@nowPlayingNoLyrics": { - "description": "Empty state when the playing file has no embedded lyrics" - }, - "libraryFilesUnit": "{count, plural, =1{file} other{files}}", - "@libraryFilesUnit": { - "description": "Unit label for files count during library scanning", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@extensionMetadataProvider": { - "description": "Capability - provides metadata" - }, - "@downloadFilterContributing": { - "description": "Setting to strip contributing artists from Album Artist folder name" - }, - "libraryScanSelectFolderFirst": "Select a folder first", - "@sectionDownload": { - "description": "Settings section header" - }, - "extensionHealthNotConfigured": "Not configured", - "queueRetryAllFailed": "Retry {count} failed", - "folderOrganizationByPlaylistSubtitle": "مجلد منفصل لكل قائمة تشغيل", - "@folderOrganizationByPlaylistSubtitle": { - "description": "Subtitle for playlist folder option" - }, - "lyricsProviderExtensionDesc": "Extension provider", - "@libraryFilterQualityHiRes": { - "description": "Filter option - high resolution audio" - }, - "trackConvertTitle": "Convert Audio", - "@trackConvertTitle": { - "description": "Title of convert bottom sheet" - }, - "setupSkipForNow": "التخطي الآن", - "sectionDownload": "التحميل", - "downloadLossyOpus256Subtitle": "أفضل جودة Opus, حوالي 8 ميغابايت لكل أغنية", - "@downloadLossyOpus256Subtitle": { - "description": "Subtitle for Opus 256kbps lossy option" - }, - "@trackConvertActionLabelLossless": { - "description": "Convert button label for lossless conversion with quality cap", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "storeRequiresVersion": "Requires v{version}+", - "@storeRequiresVersion": { - "description": "Store compatibility badge for minimum app version", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "metadataProviderPriorityDescription": "اسحب لإعادة ترتيب موفري البيانات الوصفية (metadata). سيحاول التطبيق موفري البيانات الوصفية (metadata) من الأعلى إلى الأسفل عند البحث عن المسارات وجلب البيانات الوصفية (metadata).", - "@notifUpdateFailed": { - "description": "Notification title when app update download fails" - }, - "extensionsInfoTip": "يمكن للإضافات تزويدك بموفري بيانات التعريف الجديدة وتحميلها. ثبت الإضافات من مصادر موثوق بها فقط.", - "@extensionsInfoTip": { - "description": "Security warning about extensions" - }, - "@downloadAppleQqMultiPersonEnabled": { - "description": "Subtitle when multi-person lyrics is on" - }, - "libraryFilterMetadataMissingYear": "Missing year", - "extensionsDownloadPriority": "أولوية التحميل", - "@extensionsDownloadPriority": { - "description": "Setting - download provider order" - }, - "@downloadAllowLocalNetworkEnabled": { - "description": "Subtitle when allow local network access is on" - }, - "libraryScan": "Scan Library", - "@libraryScan": { - "description": "Button to start library scan" - }, - "editMetadataFieldLabel": "Label", - "@editMetadataFieldLabel": { - "description": "Chip label for label field in auto-fill selector" - }, - "updateDownloadFailed": "فشل التنزيل", - "@updateDownloadFailed": { - "description": "Update error title" - }, - "appearanceAmoledDarkSubtitle": "خلفية سوداء تامة", - "@appearanceAmoledDarkSubtitle": { - "description": "Subtitle for AMOLED dark" - }, - "setupIcloudNotSupported": "iCloud Drive غير مدعوم. الرجاء استخدام مجلد مستندات التطبيق.", - "trackLyricsEmbeddedSource": "Embedded", - "@trackLyricsEmbeddedSource": { - "description": "Lyrics source label for embedded lyrics" - }, - "@trackAlbumArtist": { - "description": "Metadata label - album artist" - }, - "extensionsInstallPartialSuccess": "تم تثبيت {installed} من أصل {attempted} إضافات", - "@extensionsInstallPartialSuccess": { - "description": "Message when installing multiple extensions partially succeeds", - "placeholders": { - "installed": { - "type": "int", - "description": "Number of successfully installed extensions" - }, - "attempted": { - "type": "int", - "description": "Number of selected extensions" - } - } - }, - "@extensionSettingsCount": { - "description": "Count of settings exposed by an extension quality option", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanCancelled": "Library scan cancelled", - "@notifLibraryScanCancelled": { - "description": "Notification title when library scan is cancelled by the user" - }, - "collectionPlaylistNameRequired": "Playlist name is required", - "libraryCleanupMissingFiles": "Cleanup Missing Files", - "storeCategoryUtility": "Utility", - "@storeCategoryUtility": { - "description": "Store extension category - utility" - }, - "searchSortTitle": "فرز النتائج", - "@extensionVerificationBrowserExternal": { - "description": "Chip label for external browser verification mode" - }, - "audioAnalysisLufs": "LUFS", - "@setupAllowAccessToManageFiles": { - "description": "Instruction for file access permission" - }, - "extensionsErrorLoading": "Error loading extension", - "@actionPaste": { - "description": "Generic action - paste from clipboard" - }, - "aboutFeatureRequestSubtitle": "اقتراح ميزات جديدة للتطبيق", - "@aboutFeatureRequestSubtitle": { - "description": "Subtitle for feature request" - }, - "@aboutTitle": { - "description": "About page title" - }, - "@downloadNeteaseIncludeTranslation": { - "description": "Setting to include translated lyrics from Netease" - }, - "@actionGo": { - "description": "Generic action button label" - }, - "regionCountryFR": "France", - "trackConvertResamplerSoxr": "SoXr", - "extensionUpdated": "تاريخ التحديث", - "@extensionUpdated": { - "description": "Extension detail - last update" - }, - "downloadLossyFormat": "تنسيق مضغوط", - "@downloadLossyFormat": { - "description": "Setting title to pick output format for lossy downloads" - }, - "snackbarAlreadyInLibrary": "{trackName} موجود بالفعل في مكتبتك", - "@snackbarAlreadyInLibrary": { - "description": "Snackbar - track already exists in local library", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "libraryExternalPlayerSubtitle": "Recommended for listening, best quality, gapless playback, EQ, and wider format support", - "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", - "libraryFilterQuality": "Quality", - "@libraryFilterQuality": { - "description": "Filter section - audio quality" - }, - "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", - "@editMetadataAutoFillDone": { - "description": "Snackbar confirming how many fields were auto-filled", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@discographyDownload": { - "description": "Button - download artist discography" - }, - "aboutFeatureRequest": "اقتراح ميزة", - "downloadSingleFilenameFormatDescription": "نمط اسم الملف للعازفين و EPs. يستخدم نفس العلامات مثل تنسيق الألبوم.", - "@downloadSingleFilenameFormatDescription": { - "description": "Subtitle description for single filename format setting" - }, - "queueClearAllMessage": "هل أنت متأكد من أنك تريد مسح جميع التنزيلات؟", - "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", - "extensionLastChecked": "Last checked {time}", - "@extensionLastChecked": { - "description": "Timestamp for the latest extension service health check", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "homeImportCsvTooltip": "Import CSV", - "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" - }, - "trackConvertResamplerSwr": "SWR", - "@trackConvertResamplerSwr": { - "description": "Lossless conversion default FFmpeg swresample resampler option" - }, - "@downloadFolderOrganization": { - "description": "Title of the folder organization picker bottom sheet" - }, - "dialogClearHistoryTitle": "مسح السجل", - "@logClearSearch": { - "description": "Tooltip for clearing the log search field" - }, - "dialogImport": "استيراد", - "@dialogImport": { - "description": "Dialog button - import data" - }, - "@setupChangeFolderTooltip": { - "description": "Tooltip for editing the selected download folder" - }, - "notifLibraryScanErrors": "{count} errors", - "@downloadNetworkCompatibilityMode": { - "description": "Setting for legacy TLS/network handling" - }, - "@metadataSaveFailedFfmpeg": { - "description": "Snackbar error when FFmpeg fails to write metadata" - }, - "dialogUninstallExtension": "إلغاء تثبيت الإضافة؟", - "recentTypePlaylist": "Playlist", - "@recentTypePlaylist": { - "description": "Recent access item type - playlist" - }, - "trackDeleteConfirmMessage": "سيؤدي هذا إلى حذف الملف الذي تم تنزيله وإزالته من السجل الخاص بك بشكل دائم.", - "@logIssueNetworkErrorDescription": { - "description": "Diagnostic badge description for generic network errors" - }, - "appearanceThemeSystem": "النظام", - "@appearanceThemeSystem": { - "description": "Follow system theme" - }, - "albumFolderArtistAlbumSingles": "الفنان / الألبوم + المفردات", - "@aboutTranslators": { - "description": "Section for translators" - }, - "shareSheetNotFound": "Not found", - "@shareSheetNotFound": { - "description": "Cross-service share sheet row subtitle when a service has no match" - }, - "@tutorialDownloadInProgressSemantics": { - "description": "Accessibility label for active download state in tutorial demo" - }, - "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", - "@editMetadataAutoFillNoneSelected": { - "description": "Snackbar when user taps Fetch without selecting any fields" - }, - "@snackbarViewQueue": { - "description": "Snackbar action - view download queue" - }, - "@optionsUpdateChannelPreview": { - "description": "Include beta/preview updates" - }, - "editMetadataFieldComposer": "Composer", - "@editMetadataFieldComposer": { - "description": "Label for composer field in the edit metadata sheet" - }, - "aboutSachinsenalDesc": "منشئ مشروع HiFi الأصلي. مؤسسة للتكامل بدون مصدر.", - "@aboutSachinsenalDesc": { - "description": "Credit description for sachinsenal0x64" - }, - "backupTitle": "Backup & Restore", - "@libraryFilterMetadata": { - "description": "Filter section - metadata completeness" - }, - "setupStorageAccessRequired": "إذن دخول وحدة التخزين مطلوب", - "@setupStorageAccessRequired": { - "description": "Title when storage access needed" - }, - "trackMetadataDelete": "حذف", - "@trackMetadataDelete": { - "description": "Action button - delete track" - }, - "libraryFilterMetadataMissingDiscNumber": "Missing disc number", - "@libraryFilterMetadataMissingDiscNumber": { - "description": "Filter option - items missing disc number" - }, - "snackbarMetadataProviderSaved": "تم حفظ أولوية مزود البيانات الوصفية (metadata)", - "setupPermissionRequired": "{permissionType} مطلوب الإذن", - "@selectionConvertNoConvertible": { - "description": "Snackbar when no selected tracks support conversion" - }, - "extensionHealthDegraded": "Degraded", - "regionCountryKR": "South Korea", - "@regionCountryKR": { - "description": "Country name for SongLink region picker" - }, - "trackLyricsNotInFile": "لم يتم العثور على كلمات الأغاني في هذا الملف", - "@trackLyricsNotInFile": { - "description": "Message when no embedded lyrics in audio file" - }, - "@downloadedAlbumTapToSelect": { - "description": "Selection hint" - }, - "downloadArtistNameFilters": "Artist Name Filters", - "@downloadArtistNameFilters": { - "description": "Setting title for artist folder filter options" - }, - "@libraryFilterMetadataMissingArtist": { - "description": "Filter option - items missing artist" - }, - "recentShowAllDownloads": "Show All Downloads", - "@appearanceThemeLight": { - "description": "Light theme" - }, - "trackReEnrichFieldTrackInfo": "Track & Disc Number", - "@appearanceThemeDark": { - "description": "Dark theme" - }, - "extensionVerificationLinkCopied": "Verification link copied", - "@extensionVerificationLinkCopied": { - "description": "Snackbar after copying the extension verification URL" - }, - "@extensionsHomeFeedDescription": { - "description": "Extensions page - description for home feed provider picker" - }, - "downloadAlbumArtistMetadataPrimaryOnly": "Album Artist metadata: Primary only", - "@downloadAlbumArtistMetadataPrimaryOnly": { - "description": "Status label when album-artist folder filtering uses primary artist only" - }, - "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", - "setupNext": "التالي", - "extensionVerificationBrowserSubtitleInApp": "Open challenges in the in-app browser first", - "libraryAutoScanDaily": "Daily", - "@libraryAutoScanDaily": { - "description": "Auto scan once per day" - }, - "@audioAnalysisDescription": { - "description": "Description for audio analysis tap-to-analyze prompt" - }, - "nowPlayingUpNext": "Up next", - "@nowPlayingUpNext": { - "description": "Title for the playback queue sheet" - }, - "logAutoScrollOff": "Auto-scroll OFF", - "trackConvertFailed": "Conversion failed", - "@trackConvertFailed": { - "description": "Snackbar when conversion fails" - }, - "extensionsUninstall": "إلغاء التثبيت", - "safMigrationSuccess": "Download folder updated to SAF mode", - "optionsClearHistorySubtitle": "إزالة جميع الأغاني التي تم تنزيلها من السجل", - "@optionsClearHistorySubtitle": { - "description": "Subtitle for clear history" - }, - "trackPlayNext": "Play next", - "extensionsNoHomeFeedExtensions": "No extensions with home feed", - "optionsUpdateChannelStable": "الإصدارات المستقرة فقط", - "@optionsUpdateChannelStable": { - "description": "Only stable updates" - }, - "@discographyDownloadAllSubtitle": { - "description": "Subtitle showing total tracks and albums", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "searchPlaylists": "قوائم التشغيل", - "@searchPlaylists": { - "description": "Search result category - playlists" - }, - "downloadNetworkCompatibilityMode": "Network Compatibility Mode", - "settingsAppearance": "المظهر", - "logIssueRateLimitedLabel": "RATE LIMITED", - "@logIssueRateLimitedLabel": { - "description": "Diagnostic badge label when the service rate limits requests" - }, - "logIssueSummary": "Issue Summary", - "@logIssueSummary": { - "description": "Header for log issue analysis summary" - }, - "appName": "SpotiFLAC Mobile", - "storeRepoDialogCurrent": "المستودع الحالي:", - "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" - }, - "@trackLyrics": { - "description": "Tab title - lyrics" - }, - "@backupImportButton": { - "description": "Button to pick a backup file to restore" - }, - "@setupFolderChoose": { - "description": "Button to choose folder" - }, - "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", - "@extensionsDisabled": { - "description": "Extension status - inactive" - }, - "@regionCountryAU": { - "description": "Country name for SongLink region picker" - }, - "@storeCategoryMetadata": { - "description": "Store extension category - metadata" - }, - "libraryFilterApply": "Apply", - "@libraryFilterApply": { - "description": "Apply filters button" - }, - "@libraryFilterSortGenreAsc": { - "description": "Sort option - genre ascending" - }, - "setupAllowAccessToManageFiles": "الرجاء تمكين \"السماح بالوصول لإدارة جميع الملفات\" في الشاشة التالية.", - "@dialogSave": { - "description": "Dialog button - save changes" - }, - "trackLyrics": "كلمات الاغنية", - "extensionSettingNotSet": "Not set", - "@extensionSettingNotSet": { - "description": "Value shown when an extension setting has no value" - }, - "@audioAnalysisClipping": { - "description": "Clipping metric label" - }, - "downloadNeteaseIncludeTranslation": "Netease: Include Translation", - "@albumFolderArtistAlbumSubtitle": { - "description": "Folder structure example" - }, - "@settingsDonateSubtitle": { - "description": "Subtitle for donate menu item" - }, - "cueSplitSuccess": "Split into {count} tracks successfully", - "@cueSplitSuccess": { - "description": "Snackbar after successful CUE split", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cueSplitArtist": "Artist: {artist}", - "@cueSplitArtist": { - "description": "Artist name in CUE split sheet", - "placeholders": { - "artist": { - "type": "String" - } - } - }, - "updateSeeReleaseNotes": "See release notes for details.", - "@updateSeeReleaseNotes": { - "description": "Fallback changelog text when release notes cannot be parsed" - }, - "@trackReEnrichFfmpegFailed": { - "description": "Snackbar when FFmpeg embed fails for MP3/Opus" - }, - "collectionWishlist": "Wishlist", - "@collectionWishlist": { - "description": "Custom folder for saved tracks to download later" - }, - "editMetadataAutoFillFetch": "Fetch & Fill", - "@extensionsHomeFeedAuto": { - "description": "Label for auto-selected search provider" - }, - "providerPriorityDescription": "اسحب لإعادة ترتيب مزودي التحميل. سيجرب التطبيق مزودي الخدمات من الأعلى إلى الأسفل عند تحميل المسار.", - "@providerPriorityDescription": { - "description": "Provider priority page description" - }, - "queueEmptySinglesSubtitle": "Single track downloads will appear here", - "downloadLossyOpus128": "Opus 128kbps", - "downloadUseAlbumArtistForFolders": "استخدام فنان الألبوم للمجلدات", - "@downloadUseAlbumArtistForFolders": { - "description": "Setting - choose whether artist folders use Album Artist or Track Artist" - }, - "@aboutLinks": { - "description": "Section for external links" - }, - "downloadedAlbumDeleteCount": "Delete {count} {count, plural, =1{track} other{tracks}}", - "updateLater": "ذكرني لاحقا", - "@logIssueIspBlockingSuggestion": { - "description": "Diagnostic badge suggestion for ISP blocking" - }, - "actionResume": "استئناف", - "optionsDetailedLoggingOff": "تمكين لتقارير الأخطاء", - "@searchSortDefault": { - "description": "Sort option - default API order" - }, - "@regionCountryCA": { - "description": "Country name for SongLink region picker" - }, - "@sectionStorageAccess": { - "description": "Section header for storage access settings" - }, - "downloadFilterContributing": "Filter Contributing Artists", - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", - "storeSearch": "البحث في الإضافات...", - "@storeSearch": { - "description": "Store search placeholder" - }, - "aboutTelegramChat": "مجتمع تليجرام", - "lyricsModeBoth": "كلاهما", - "@lyricsModeBoth": { - "description": "Lyrics mode option - embed and external" - }, - "@permissionNotification": { - "description": "Notification permission type label" - }, - "libraryAutoScanSubtitle": "Automatically scan your library for new files", - "@libraryAutoScanSubtitle": { - "description": "Subtitle for auto scan setting" - }, - "libraryEnableLocalLibrary": "Enable Local Library", - "trackConvertTargetFormat": "Target Format", - "@trackConvertTargetFormat": { - "description": "Label for format selection" - }, - "extensionSettings": "الإعدادات", - "@editMetadataAutoFillSearching": { - "description": "Snackbar shown while searching for online metadata" - }, - "trackLyricsTimeout": "انتهت مهلة الطلب. حاول مرة أخرى لاحقاً.", - "settingsExtensions": "الإضافات", - "@settingsBackup": { - "description": "Settings menu item - backup and restore page" - }, - "librarySourceDownloaded": "Downloaded", - "@librarySourceDownloaded": { - "description": "Badge for tracks downloaded via SpotiFLAC" - }, - "appearanceDynamicColor": "لون ديناميكي", - "@appearanceDynamicColor": { - "description": "Material You dynamic colors" - }, - "backupImportButton": "Choose backup file", - "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", - "@optionsEmbedMetadata": { - "description": "Settings toggle title for writing metadata into downloaded files" - }, - "appearanceTitle": "المظهر", - "downloadNeteaseIncludeRomanizationDisabled": "No romanization", - "@downloadNeteaseIncludeRomanizationDisabled": { - "description": "Subtitle when Netease romanization is off" - }, - "@libraryScanCancelled": { - "description": "Library scan status when a scan was cancelled" - }, - "tracksCount": "{count, plural, zero {لا توجد أغاني محددة} =1{أغنية واحدة} other{{count} أغانٍ}}", - "@snackbarFailedToUpdateNamed": { - "description": "Snackbar when extension update fails in the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "@extensionQualityOptions": { - "description": "Capability - quality selection" - }, - "logClearSearch": "Clear search", - "trackSaveLyrics": "Save Lyrics (.lrc)", - "@trackReEnrichSearching": { - "description": "Snackbar while searching metadata from internet for local items" - }, - "@editMetadataAutoFillNoResults": { - "description": "Snackbar when online metadata search returns no results" - }, - "notifDownloadComplete": "Download Complete", - "snackbarAlreadyDownloaded": "تم تنزيل {trackName} بالفعل", - "folderOrganizationByAlbumSubtitle": "مجلد منفصل لكل قائمة تشغيل", - "storeRepoUrlHint": "https://github.com/user/repo", - "trackConvertDitherTriangularHp": "Triangular HP", - "lyricsModeBothSubtitle": "تضمين وحفظ ملف .lrc", - "trackReEnrichFieldExtra": "Genre, Label, Copyright", - "@trackReEnrichFieldExtra": { - "description": "Checkbox label for extra metadata in re-enrich" - }, - "sectionLyrics": "كلمات الاغنية", - "@sectionLyrics": { - "description": "Settings section header" - }, - "extensionStrategy": "الاستراتيجية: {strategy}", - "@extensionStrategy": { - "description": "Track matching strategy name", - "placeholders": { - "strategy": { - "type": "String" - } - } - }, - "@downloadNativeWorker": { - "description": "Setting title for Android native download worker" - }, - "optionsArtistTagModeSplitVorbis": "تقسيم العلامات على FLAC/Opus", - "extensionsHomeFeedUse": "Use {extensionName} home feed", - "@cacheAppDirectoryDesc": { - "description": "Description of what app cache directory contains" - }, - "cancelDownloadTitle": "Cancel download?", - "updateWhatsNew": "ما الجديد", - "updateNewVersionReady": "إصدار جديد جاهز", - "@extensionVerificationClose": { - "description": "Button to dismiss the extension verification help dialog" - }, - "a11ySelectTrack": "Select track", - "libraryClearSubtitle": "Remove all scanned tracks", - "@libraryClearSubtitle": { - "description": "Subtitle for clear button" - }, - "@settingsDownloadNetworkSubtitle": { - "description": "Subtitle explaining network preference" - }, - "storeAnyVersion": "Any", - "@storeAnyVersion": { - "description": "Store detail value when any app version is accepted" - }, - "navStore": "المستودع", - "backupExportSectionDescription": "Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.", - "libraryScanSettings": "Scan Settings", - "@libraryScanSettings": { - "description": "Section header for scan settings" - }, - "trackDuration": "المدة", - "@trackDuration": { - "description": "Metadata label - track length" - }, - "extensionHealthOffline": "Offline", - "@extensionHealthOffline": { - "description": "Extension service health status - offline" - }, - "editMetadataFieldArtist": "Artist", - "@editMetadataFieldArtist": { - "description": "Chip label for artist field in auto-fill selector" - }, - "libraryInLibrary": "In Library", - "pressBackAgainToExit": "اضغط رجوع مجددًا للخروج", - "@pressBackAgainToExit": { - "description": "Exit confirmation message" - }, - "setupNotificationGranted": "تم منح إذن الإشعارات!", - "@setupNotificationGranted": { - "description": "Success message for notification permission" - }, - "settingsDonate": "Support Development", - "snackbarFailedToUpdateNamed": "Failed to update {extensionName}", - "backupContentsTitle": "Backup contents", - "updateDontRemind": "لا تذكّرني", - "@dialogDiscard": { - "description": "Dialog button - discard changes" - }, - "editMetadataAutoFillSearching": "Searching online...", - "discographyDownloadSelected": "Download Selected", - "trackConvertResampler": "Resampler", - "queueFilteringIndicator": "Filtering...", - "@queueFilteringIndicator": { - "description": "Shown while filter results are being computed" - }, - "@dialogDownloadAllTitle": { - "description": "Dialog title for bulk download confirmation" - }, - "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", - "@downloadCreatePlaylistSourceFolderRedundant": { - "description": "Subtitle when folder organization is already set to playlist" - }, - "regionCountryCA": "Canada", - "cacheTempDirectory": "Temporary directory", - "@cacheTempDirectory": { - "description": "Cache item title for temporary files directory" - }, - "libraryShowDuplicateIndicator": "Show Duplicate Indicator", - "@logFilterBySeverity": { - "description": "Filter dialog title" - }, - "homeSearchHintProvider": "Search with {providerName}...", - "@downloadNeteaseIncludeTranslationDisabled": { - "description": "Subtitle when Netease translation is off" - }, - "optionsCheckUpdates": "التحقق من وجود تحديثات", - "replayGainBatchAnalyzing": "تحليل ReplyGain...", - "recentTypeAlbum": "Album", - "providerExtension": "الإضافة", - "@providerExtension": { - "description": "Label for extension-provided providers" - }, - "trackCoverNoSource": "No cover art source available", - "libraryFilterMetadata": "Metadata", - "albumFolderArtistYearAlbum": "الفنان / [Year] ألبوم", - "@albumFolderArtistYearAlbum": { - "description": "Album folder option with year" - }, - "audioAnalysisClipping": "Clipping", - "@a11yOpenAlbumByArtistTrackCount": { - "description": "Accessibility label for opening an album item with track count", - "placeholders": { - "albumName": { - "type": "String" - }, - "artistName": { - "type": "String" - }, - "trackCount": { - "type": "int" - } - } - }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", - "@backupExtensionsRestoreFailed": { - "description": "Snackbar/hint when some extensions failed to reinstall during restore", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "channelStable": "مستقر", - "@channelStable": { - "description": "Update channel - stable releases" - }, - "tutorialSettingsTip3": "Customize app theme and appearance", - "setupAppDocumentsFolderSubtitle": "موصى به - يمكن الوصول إليه عبر تطبيق الملفات", - "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", - "@a11yPlayTrackByArtist": { - "description": "Accessibility label for playing a local library track", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "dialogRemove": "إزالة", - "extensionVerificationClose": "Close", - "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", - "@bulkDownloadPlaylistsButton": { - "description": "Button label for bulk downloading selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "optionsAutoFallbackSubtitle": "تجربة خدمات أخرى إذا فشل التنزيل", - "@optionsAutoFallbackSubtitle": { - "description": "Subtitle for auto fallback" - }, - "extensionPatternsCount": "{count} أنماط", - "@libraryFilterLocal": { - "description": "Filter chip - show only local library items" - }, - "errorUrlNotRecognizedMessage": "هذا الرابط غير مدعوم. تأكد من أن الرابط صحيح وتثبيت إضافة متوافق.", - "@errorUrlNotRecognizedMessage": { - "description": "Error message - URL not recognized explanation" - }, - "@extensionVerificationBrowserSubtitleExternal": { - "description": "Subtitle when external browser is preferred for extension verification" - }, - "optionsArtistTagMode": "وضع وسم الفنان", - "libraryFilterMetadataComplete": "Complete metadata", - "@libraryFilterMetadataComplete": { - "description": "Filter option - items with complete metadata" - }, - "@extensionsVersion": { - "description": "Extension version display", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "@downloadNetworkAnySubtitle": { - "description": "Subtitle for any-network option in picker" - }, - "optionsReplayGainSubtitleOn": "مسح الصوت و تضمين علامات ReplayGain (EBU R128)", - "libraryScanning": "Scanning...", - "@libraryScanning": { - "description": "Status during scan" - }, - "cacheRefresh": "Refresh", - "@actionShuffle": { - "description": "Tooltip for shuffle playback action" - }, - "optionsEmbedLyricsSubtitle": "حفظ كلمات الأغاني المتزامنة جنبا إلى جنب مع المسارات التي تم تنزيلها", - "@optionsEmbedLyricsSubtitle": { - "description": "Subtitle for embed lyrics" - }, - "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", - "extensionEnterValue": "Enter value", - "@settingsDownloadNetworkAny": { - "description": "Network option - use any connection" - }, - "collectionLoved": "Loved", - "@collectionLoved": { - "description": "Custom folder for favorite tracks" - }, - "storeAddRepoTitle": "إضافة مستودع إضافات", - "@storeAddRepoTitle": { - "description": "Store setup screen - heading when no repo is configured" - }, - "collectionNoPlaylistsYet": "No playlists yet", - "@collectionNoPlaylistsYet": { - "description": "Empty state title when user has no playlists" - }, - "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", - "@libraryCleanupMissingFilesSubtitle": { - "description": "Subtitle for cleanup button" - }, - "folderOrganizationByArtist": "حسب الفنان", - "@folderOrganizationByArtist": { - "description": "Folder option - artist folders" - }, - "aboutTranslators": "المترجمون", - "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", - "editMetadataFieldTitle": "Title", - "@editMetadataFieldTitle": { - "description": "Chip label for title field in auto-fill selector" - }, - "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", - "@downloadFilenameDescription": { - "description": "Description shown in filename format editor" - }, - "@notifDownloadsFinishedBody": { - "description": "Notification body when queue finishes with failures", - "placeholders": { - "completed": { - "type": "int" - }, - "failed": { - "type": "int" - } - } - }, - "@libraryFolderNotExist": { - "description": "Error when folder doesn't exist" - }, - "@playlistsCount": { - "description": "Playlist count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@loadingSharedLink": { - "description": "Status when opening shared URL" - }, - "extensionServiceHealth": "Service health", - "@extensionServiceHealth": { - "description": "Extension capability label for service health checks" - }, - "@collectionDeletePlaylistsMessage": { - "description": "Confirmation message for deleting selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "setupStorageDescription": "SpotiFLAC يحتاج إلى إذن تخزين لحفظ ملفات الموسيقى الخاصة بك التي تم تنزيلها.", - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", - "selectionDeletePlaylistsCount": "Delete {count} {count, plural, =1{playlist} other{playlists}}", - "appearanceThemeLight": "فاتح", - "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", - "@queueEmptyHistorySubtitle": { - "description": "Empty state subtitle for download history" - }, - "backupRestoreFailed": "Failed to restore backup", - "@backupRestoreFailed": { - "description": "Snackbar when restore fails" - }, - "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", - "@queueFlacQueuedWithSkipped": { - "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", - "placeholders": { - "addedCount": { - "type": "int" - }, - "skippedCount": { - "type": "int" - } - } - }, - "@trackReplayGain": { - "description": "Three-dot menu option to scan loudness and write ReplayGain tags" - }, - "@downloadedAlbumDownloadedCount": { - "description": "Downloaded tracks count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "setupFolderChoose": "اختر مجلد التحميل", - "dialogDownloadAllTitle": "Download All", - "providerPriorityInfo": "إذا كانت الأغنية غير متوفرة عند أول مزود، فإن التطبيق سيجرب تلقائياً المزود التالي.", - "@providerPriorityInfo": { - "description": "Info tip about fallback behavior" - }, - "@dialogDiscardChanges": { - "description": "Dialog title - unsaved changes warning" - }, - "discographyNoAlbums": "No albums available", - "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", - "cacheNoData": "No cached data", - "@cacheNoData": { - "description": "Label when cache category has no data" - }, - "tutorialStartDownloadSemantics": "Start download", - "@tutorialStartDownloadSemantics": { - "description": "Accessibility label for idle download button in tutorial demo" - }, - "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", - "aboutTitle": "حول", - "@cueSplitButton": { - "description": "Button text to start CUE splitting" - }, - "appearanceHistoryView": "عرض السجل", - "audioAnalysisSampleRate": "Sample Rate", - "@settingsCache": { - "description": "Settings menu item - cache management" - }, - "lyricsProvidersInfoText": "Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.", - "cacheTrackLookup": "Track lookup cache", - "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", - "@downloadUsePrimaryArtistOnly": { - "description": "Setting - strip featured artists from folder name" - }, - "@regionCountryIN": { - "description": "Country name for SongLink region picker" - }, - "@libraryFilterQualityLossy": { - "description": "Filter option - lossy compressed audio" - }, - "extensionRefreshStatus": "Refresh status", - "notifAllDownloadsComplete": "All Downloads Complete", - "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", - "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", - "@editMetadataFieldDateHint": { - "description": "Hint text for the edit metadata date field" - }, - "trackMetadataShare": "مشاركة", - "@trackMetadataShare": { - "description": "Action button - share track" - }, - "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", - "settingsDonateSubtitle": "Buy the developer a coffee", - "libraryFilterDownloaded": "Downloaded", - "downloadNetworkAnySubtitle": "Use WiFi or mobile data", - "@cueSplitNoAudioFile": { - "description": "Error when CUE audio file is missing" - }, - "notifLibraryScanStopped": "Scan stopped before completion.", - "@settingsMetadata": { - "description": "Settings menu item - metadata settings" - }, - "snackbarFailedToInstallNamed": "Failed to install {extensionName}", - "trackCopyLyrics": "نسخ كلمات الأغنية", - "@trackCopyLyrics": { - "description": "Action - copy lyrics to clipboard" - }, - "regionCountryAU": "Australia", - "downloadAlbumFolderStructure": "هيكل مجلد الألبوم", - "downloadMusixmatchAuto": "Auto", - "actionDismiss": "Dismiss", - "storeFilterAll": "الكل", - "extensionsDisabled": "معطَّل", - "@logClearLogs": { - "description": "Clear button tooltip" - }, - "dialogDownloadAllMessage": "Download {count} tracks?", - "@optionsEmbedLyrics": { - "description": "Embed lyrics in audio files" - }, - "tutorialLibraryTitle": "Your Library", - "optionsCheckUpdatesSubtitle": "إعلام عند توفر إصدار جديد", - "@optionsCheckUpdatesSubtitle": { - "description": "Subtitle for update check" - }, - "collectionPlaylist": "Playlist", - "@collectionPlaylist": { - "description": "Single playlist label" - }, - "dateMonthsAgo": "منذ {count} أشهر", - "@dateMonthsAgo": { - "description": "Relative date - months ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@extensionRemoveButton": { - "description": "Button to uninstall extension" - }, - "collectionPlaylistRenamed": "Playlist renamed", - "collectionCreatePlaylist": "Create playlist", - "homeGoToAlbum": "Go to Album", - "@homeGoToAlbum": { - "description": "Context menu item to navigate to the album page" - }, - "folderOrganizationByArtistSubtitle": "مجلد منفصل لكل فنان", - "@optionsClearHistory": { - "description": "Delete all download history" - }, - "@searchAlbums": { - "description": "Search result category - albums" - }, - "@sectionDebug": { - "description": "Settings section header" - }, - "extensionsVersion": "الإصدار {version}", - "@navHome": { - "description": "Bottom navigation - Home tab" - }, - "@editMetadataFieldDate": { - "description": "Chip label for date field in auto-fill selector" - }, - "downloadUsePrimaryArtistOnly": "الفنان الأساسي فقط للمجلدات", - "tutorialExtensionsTip2": "Add new download providers or search sources", - "@setupStorageGranted": { - "description": "Success message for storage permission" - }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC!", - "a11ySelectAlbum": "Select album {albumName}", - "@a11ySelectAlbum": { - "description": "Accessibility label for selecting an album", - "placeholders": { - "albumName": { - "type": "String" - } - } - }, - "aboutMobileSource": "كود مصدر برنامج الهاتف", - "@aboutMobileSource": { - "description": "Link to mobile GitHub repo" - }, - "@extensionCustomUrlHandling": { - "description": "Extension detail section title for custom URL handling" - }, - "@downloadMusixmatchLanguageAuto": { - "description": "Subtitle when no language is set" - }, - "@cancelDownloadKeep": { - "description": "Dialog button - keep the active download (do not cancel)" - }, - "libraryFilterSource": "Source", - "@libraryFilterSource": { - "description": "Filter section - source type" - }, - "sectionStorageAccess": "Storage Access", - "logFilterBySeverity": "تصفية السجلات حسب الخطورة", - "libraryFolderNotExist": "Selected folder does not exist", - "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", - "albumFolderArtistAlbum": "ألبوم / الفنان", - "@albumFolderArtistAlbum": { - "description": "Album folder option" - }, - "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", - "@allFilesAccessDeniedMessage": { - "description": "Message when permission is permanently denied" - }, - "editMetadataSelectEmpty": "Empty only", - "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", - "@settingsAutoExportFailed": { - "description": "Setting toggle for auto-export" - }, - "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", - "@tutorialSettingsTitle": { - "description": "Tutorial settings page title" - }, - "libraryFilterMetadataMissingGenre": "Missing genre", - "@appearanceSelectAccentColor": { - "description": "Accessibility label for picking an accent color", - "placeholders": { - "hex": { - "type": "String" - } - } - }, - "setupFolderDescription": "حدد مجلد حيث سيتم حفظ الموسيقى التي تم تنزيلها.", - "extensionDetailsTags": "Tags", - "unknownArtist": "Unknown Artist", - "trackFetchOnlineLyrics": "جلب من الإنترنت", - "snackbarNoActionDefined": "No action defined for this button", - "@snackbarNoActionDefined": { - "description": "Snackbar when an extension button has no action configured" - }, - "downloadAllCount": "تنزيل الكل ({count})", - "@downloadAllCount": { - "description": "Download all button with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumDiscHeader": "Disc {discNumber}", - "@backupInvalidFile": { - "description": "Snackbar when the chosen file is not a valid backup" - }, - "@extensionHooksAvailable": { - "description": "Post-processing hooks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@logIssueTrackNotFoundSuggestion": { - "description": "Diagnostic badge suggestion when a track is unavailable" - }, - "@snackbarFileNotFound": { - "description": "Snackbar - file doesn't exist" - }, - "extensionHealthOnline": "Online", - "@extensionHealthOnline": { - "description": "Extension service health status - online" - }, - "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", - "trackOptionRemoveFromWishlist": "Remove from Wishlist", - "extensionsFallbackTitle": "الإضافات الاحتياطية", - "@extensionsFallbackTitle": { - "description": "Setting and page title for choosing which download extensions can be used during fallback" - }, - "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", - "@albumFolderAlbumOnly": { - "description": "Album folder option" - }, - "@albumFolderYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "downloadedAlbumDeleteSelected": "Delete Selected", - "selectionSelectPlaylistsToDelete": "Select playlists to delete", - "@selectionSelectPlaylistsToDelete": { - "description": "Hint shown when no playlists are selected for deletion" - }, - "storeAddRepoDescription": "أدخل عنوان مستودع GitHub الذي يحتوي على ملف registry.json لتصفح وتثبيت الإضافات.", - "appearanceThemeDark": "مظلم", - "downloadedAlbumTapToSelect": "Tap tracks to select", - "@collectionAddedToFavoriteArtists": { - "description": "Snackbar after adding artist to favorite artists", - "placeholders": { - "artistName": { - "type": "String" - } - } - }, - "@backupRestored": { - "description": "Snackbar after a successful restore" - }, - "nowPlayingLibraryEmpty": "Your library is empty", - "@nowPlayingLibraryEmpty": { - "description": "Snackbar when shuffle library is requested but library has no tracks" - }, - "editMetadataAutoFillNoResults": "No matching metadata found online", - "updateDownloading": "جاري التنزيل...", - "trackLyricsSource": "المصدر: {source}", - "logFilterLevel": "المستوى", - "logNoLogsYet": "لا توجد سجلات بعد", - "cacheSizeOnly": "{size}", - "@cacheSizeOnly": { - "description": "Cache size only", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "trackOpenInService": "Open in {serviceName}", - "@trackOpenInService": { - "description": "Button label to open a track in a named music service", - "placeholders": { - "serviceName": { - "type": "String" - } - } - }, - "@cacheLibraryCoverDesc": { - "description": "Description of what library cover cache contains" - }, - "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", - "@dialogImportPlaylistMessage": { - "description": "Dialog message - import playlist confirmation", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionsHomeFeedAuto": "Auto", - "searchEmptyResultSubtitle": "جرّب كلمة مفتاحية أخرى", - "@searchEmptyResultSubtitle": { - "description": "Subtitle shown under the empty search result state on the home screen" - }, - "dateToday": "اليوم", - "a11yOpenItem": "Open {itemType} {name}", - "@a11yOpenItem": { - "description": "Accessibility label for opening a generic item", - "placeholders": { - "itemType": { - "type": "String" - }, - "name": { - "type": "String" - } - } - }, - "audioAnalysisBitDepth": "Bit Depth", - "editMetadataFieldTrackTotal": "Track Total", - "@editMetadataFieldTrackTotal": { - "description": "Label for total tracks field in the edit metadata sheet" - }, - "@editMetadataFieldDiscTotal": { - "description": "Label for total discs field in the edit metadata sheet" - }, - "replayGainBatchConfirmMessage": "تحليل الصوت وكتابة وسوم ReplayGain إلى مسار(مسارات) {count}؟", - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", - "@notifDownloadingUpdate": { - "description": "Notification title while downloading an app update", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "@csvImportTracks": { - "description": "Label shown in quality picker for CSV import", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackEditMetadata": "Edit Metadata", - "discographyDownloadAll": "Download All", - "@discographyDownloadAll": { - "description": "Option - download entire discography" - }, - "@editMetadataFieldAlbum": { - "description": "Chip label for album field in auto-fill selector" - }, - "albumFolderArtistAlbumSubtitle": "الألبومات / اسم الفنان / اسم الألبوم", - "extensionHealthServiceUnknown": "Service status unknown", - "navHome": "الرئيسية", - "queueDownloadStarting": "Starting...", - "@dialogRemoveExtension": { - "description": "Dialog title - uninstall extension" - }, - "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", - "@appearanceAmoledDark": { - "description": "Theme option - pure black" - }, - "qualityHiResFlac": "Hi-Res FLAC", - "selectionSelected": "تم تحديد {count}", - "extensionDetailsInformation": "Information", - "@extensionDetailsInformation": { - "description": "Section title for extension metadata information" - }, - "discographyDownload": "Download Discography", - "editMetadataFieldCopyright": "Copyright", - "@setupOpenSettings": { - "description": "Button to open system settings" - }, - "libraryFilterSort": "Sort", - "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", - "dialogRemoveExtension": "إزالة إضافة", - "backupExportSectionTitle": "Create backup", - "downloadEmbedLyricsDisabled": "Enable metadata embedding first", - "openInOtherServices": "Open in Other Services", - "actionSelectAll": "تحديد الكل", - "settingsDownloadNetworkSubtitle": "اختر الشبكة التي تريد استخدامها للتنزيلات. عند تعيين WiFi فقط، التنزيلات لن تعمل على بيانات الجوال.", - "downloadFolderOrganization": "تنظيم المجلدات", - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", - "@tutorialWelcomeTip2": { - "description": "Tutorial welcome tip 2" - }, - "selectionAllSelected": "تم اختيار جميع الأغاني", - "@selectionAllSelected": { - "description": "Status - all items selected" - }, - "settingsLogsSubtitle": "عرض سجلات التطبيقات لتصحيح الأخطاء", - "albumFolderYearAlbumSubtitle": "الألبومات/[2005] اسم الألبوم/", - "cancelDownloadKeep": "Keep", - "optionsDetailedLoggingOn": "يتم تسجيل السجلات التفصيلية", - "safMigrationMessage2": "Please select your download folder again to switch to the new storage system.", - "@storeChangeRepoTooltip": { - "description": "Tooltip for the change-repository icon button in the app bar" - }, - "regionCountryJP": "Japan", - "notifUpdateFailed": "Update Failed", - "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", - "@trackLyricsSaved": { - "description": "Snackbar after lyrics saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "downloadLocationSubtitle": "Choose where to save your downloaded tracks", - "trackConvertActionLabelLossless": "{sourceFormat} → {targetFormat} ({quality})", - "lyricsProvidersDisabledSection": "Disabled ({count})", - "@dateDaysAgo": { - "description": "Relative date - days ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "librarySourceLocal": "Local", - "backupContentsExtensions": "{count, plural, =1{1 extension} other{{count} extensions}}", - "sectionService": "الخدمة", - "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", - "@lyricsProviderQqMusicDesc": { - "description": "Description for QQ Music provider" - }, - "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", - "selectionTapPlaylistsToSelect": "Tap playlists to select", - "notifUpdateFailedBody": "Could not download update. Try again later.", - "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", - "artistPopular": "الأكثر شعبية", - "extensionRemoveButton": "حذف الإضافة", - "allFilesAccessEnabledSubtitle": "Can write to any folder", - "@allFilesAccessEnabledSubtitle": { - "description": "Subtitle when all files access is enabled" - }, - "extensionsSearchProvider": "Search Provider", - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", - "selectionBatchConvertConfirmTitle": "Batch Convert", - "extensionMetadataProvider": "مزود بيانات التعريف", - "queueDownloadedFileMissing": "Downloaded file missing", - "logClearLogs": "حذف السجل", - "@downloadAppleQqMultiPerson": { - "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" - }, - "tutorialWelcomeTip1": "Download music from Spotify, Deezer, or paste any supported URL", - "@tutorialWelcomeTip1": { - "description": "Tutorial welcome tip 1" - }, - "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", - "downloadAllowLocalNetworkEnabled": "Requests to local/private addresses are allowed (for local proxy or custom DNS)", - "@regionCountryUS": { - "description": "Country name for SongLink region picker" - }, - "trackArtist": "الفنان", - "extensionCustomUrlHandling": "Custom URL Handling", - "appearanceDynamicColorSubtitle": "استخدام الألوان من الخلفية", - "@appearanceDynamicColorSubtitle": { - "description": "Subtitle for dynamic color" - }, - "searchSortDefault": "افتراضي", - "@downloadFallbackExtensions": { - "description": "Settings item for configuring fallback extension providers" - }, - "albumFolderStructureDescription": "Choose how album folders are structured", - "@albumFolderStructureDescription": { - "description": "Album folder structure picker description" - }, - "libraryBuiltInPreviewPlayerSubtitle": "Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening", - "@libraryBuiltInPreviewPlayerSubtitle": { - "description": "Subtitle for built-in preview player option" - }, - "storageModeAppFolder": "App Folder (Recommended)", - "@actionPause": { - "description": "Action button - pause download" - }, - "actionPaste": "Paste", - "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", - "downloadNativeWorker": "Native download worker", - "releaseTypeEp": "EP", - "@releaseTypeEp": { - "description": "Badge label for EP releases" - }, - "snackbarExtensionInstalledEnable": "{extensionName} installed. Enable it in Settings > Extensions", - "cacheRefreshStats": "Refresh stats", - "collectionPlaylistChangeCover": "Change cover image", - "@collectionPlaylistChangeCover": { - "description": "Bottom sheet action to pick a custom cover image for a playlist" - }, - "optionsClearHistory": "مسح سجل التحميلات", - "trackGenre": "النوع", - "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", - "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", - "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", - "libraryFilterMetadataMissingArtist": "Missing artist", - "extensionsNoCustomSearch": "No extensions with custom search", - "@extensionsTitle": { - "description": "Extensions page title" - }, - "extensionDownloadProvider": "مزود التحميل", - "@extensionDownloadProvider": { - "description": "Capability - provides downloads" - }, - "lyricsMode": "وضع كلمات الأغنية", - "aboutReportIssueSubtitle": "الإبلاغ عن أي مشكلة تواجهك", - "@downloadSeparateSinglesFolder": { - "description": "Setting - separate folder for singles" - }, - "appearanceAmoledDark": "الوضع الداكن AMOLED", - "logIssueNetworkErrorDescription": "Connection issues detected", - "folderOrganizationByArtistAlbumSubtitle": "مجلدات متداخلة للفنان و الألبوم", - "@libraryForceFullScanSubtitle": { - "description": "Subtitle for force full scan button" - }, - "setupGrantPermission": "منح الصلاحيات", - "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", - "dateDaysAgo": "قبل {count} أيام", - "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", - "downloadLossyMp3Subtitle": "أفضل توافق، ~10 ميغابايت لكل أغنية", - "@downloadLossyMp3Subtitle": { - "description": "Subtitle for MP3 320kbps lossy option" - }, - "nowPlayingDetails": "Details", - "collectionWishlistEmptyTitle": "Wishlist is empty", - "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "@snackbarExtensionUpdatedVersion": { - "description": "Snackbar after updating an extension from the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - }, - "version": { - "type": "String" - } - } - }, - "extensionHealthServiceDegraded": "Service degraded", - "selectionConvertNoConvertible": "No convertible tracks selected", - "setupStorageGranted": "تم منح إذن التخزين!", - "downloadAllowLocalNetwork": "Allow Local Network Access", - "nowPlayingNoLyrics": "No lyrics in this file", - "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", - "@selectionDeleteTracksCount": { - "description": "Button label for deleting selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@libraryForceFullScan": { - "description": "Button to force a complete rescan of library" - }, - "notifLibraryScanExcluded": "{count} excluded", - "@aboutPaxsenixSubtitle": { - "description": "Subtitle for Paxsenix special thanks entry on the about page" - }, - "setupChangeFolderTooltip": "Change folder", - "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", - "@logIssueIspBlockingDescription": { - "description": "Diagnostic badge description for ISP blocking" - }, - "libraryClear": "Clear Library", - "collectionRemoveFromPlaylist": "Remove from playlist", - "@collectionRemoveFromPlaylist": { - "description": "Tooltip for removing track from playlist" - }, - "backupIncludeSecrets": "Include extension credentials", - "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", - "storeCategoryMetadata": "Metadata", - "@trackLyricsEmbedded": { - "description": "Snackbar - lyrics saved to file" - }, - "editMetadataFieldDiscTotal": "Disc Total", - "tutorialLibraryTip1": "View download progress and queue in the Library tab", - "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", - "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", - "@downloadFallbackExtensionsSubtitle": { - "description": "Subtitle for fallback extensions item" - }, - "libraryFilterLocal": "Local", - "tutorialDownloadInProgressSemantics": "Download in progress", - "searchSortDurationLong": "المدة (الأطول)", - "@appearanceLanguage": { - "description": "Language setting title" - }, - "libraryAbout": "About Local Library", - "@libraryAbout": { - "description": "Section header for about info" - }, - "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", - "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", - "appearanceSelectAccentColor": "Select accent color {hex}", - "@homeAlbumInfoUnavailable": { - "description": "Snackbar when album info cannot be loaded" - }, - "trackReplayGain": "إعادة مسح ReplyGain", - "downloadSeparateSinglesFolder": "فصل مجلد الفرديات", - "trackAlbumArtist": "فنان الألبوم", - "qualityFlacLossless": "FLAC Lossless", - "@extensionVerificationHelpMessageWaiting": { - "description": "Dialog message when verification may need manual browser help" - }, - "tutorialSettingsTitle": "Customize Your Experience", - "extensionActionFailed": "Action failed", - "@storeEmptyNoResults": { - "description": "Message when search/filter returns no results" - }, - "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", - "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", - "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", - "trackCoverNoEmbeddedArt": "No embedded album art found", - "@trackCoverNoEmbeddedArt": { - "description": "Message shown when a track file has no embedded cover art" - }, - "snackbarExtensionUpdatedVersion": "{extensionName} updated to v{version}", - "setupStorageAccessMessageAndroid11": "يتطلب أندرويد 11+ إذن \"الوصول إلى جميع الملفات\" لحفظ الملفات في مجلد التحميل الذي اخترته.", - "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", - "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", - "optionsPrimaryProvider": "المزود الرئيسي", - "@optionsPrimaryProvider": { - "description": "Main search provider setting" - }, - "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", - "collectionAddedToLoved": "\"{trackName}\" added to Loved", - "albumFolderArtistAlbumFlat": "فنان / ألبوم (منفردات سطحية)", - "homeAlbumInfoUnavailable": "Album info not available", - "settingsLyrics": "Lyrics", - "extensionVerificationBrowserExternal": "External", - "regionCountryIN": "India", - "extensionHealthUnknown": "Unknown", - "backupContentsWishlist": "{count} wishlist {count, plural, =1{track} other{tracks}}", - "settingsAutoExportFailed": "فشل التصدير التلقائي للتنزيلات", - "logFilterSection": "فرز", - "dialogDiscardChanges": "تجاهل التغييرات؟", - "@qualityHiResFlacSubtitle": { - "description": "Technical spec for hi-res" - }, - "searchTracks": "Tracks", - "searchAlbums": "ألبومات", - "trackConvertFormat": "Convert Format", - "metadataProviderPriorityTitle": "أولوية البيانات الوصفية (metadata)", - "libraryFolderHint": "Tap to select folder", - "downloadedAlbumDeleteMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from this album?\n\nThis will also delete the files from storage.", - "@downloadedAlbumDeleteMessage": { - "description": "Delete confirmation with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackAlbum": "الألبوم", - "updateAvailable": "هناك تحديث متاح", - "optionsEmbedLyrics": "تضمين كلمات الأغنية", - "trackReEnrichProgress": "Re-enriching metadata...", - "@trackReEnrichProgress": { - "description": "Snackbar while re-enriching metadata" - }, - "audioAnalysisPeak": "Peak", - "@audioAnalysisPeak": { - "description": "Peak amplitude metric label" - }, - "optionsExtensionStoreSubtitle": "إظهار صفحة المستودع في شريط التنقل", - "settingsTitle": "الإعدادات", - "@settingsAbout": { - "description": "Settings section - app info" - }, - "cacheExploreFeed": "Explore feed cache", - "@dialogDownloadPlaylistsMessage": { - "description": "Dialog message for bulk playlist download confirmation", - "placeholders": { - "trackCount": { - "type": "int" - }, - "playlistCount": { - "type": "int" - } - } - }, - "downloadedAlbumSelectedCount": "{count} selected", - "downloadAskQualitySubtitle": "إظهار منتقي الجودة لكل تنزيل", - "filenameShowAdvancedTags": "إظهار العلامات المتقدمة", - "@filenameShowAdvancedTags": { - "description": "Toggle label for showing advanced filename tags" - }, - "@editMetadataFieldComment": { - "description": "Label for comment field in the edit metadata sheet" - }, - "downloadFallbackExtensions": "Fallback Extensions", - "downloadAlbumArtistMetadataFull": "Album Artist metadata: Full", - "cacheLibraryCover": "Library cover cache", - "actionShuffle": "Shuffle", - "backupCreated": "Backup created", - "downloadLossyAacSubtitle": "أفضل توافق للجوال، صيغة M4A", - "actionCreate": "Create", - "snackbarAddedToQueueGeneric": "Added to queue", - "downloadedAlbumDownloadedCount": "{count} downloaded", - "snackbarLoadingCueSheet": "Loading CUE sheet...", - "@trackCoverClearSelected": { - "description": "Tooltip for clearing the newly selected cover art" - }, - "aboutOriginalCreator": "منشئ SpotiFLAC", - "a11yTrackByArtist": "{trackName} by {artistName}", - "audioAnalysisDynamicRange": "Dynamic Range", - "homeChangeSearchProviderTooltip": "Change search provider", - "loadingSharedLink": "تحميل الرابط المشترك...", - "lyricsModeEmbedSubtitle": "كلمات الأغاني مخزنة داخل بيانات تعريف FLAC", - "setupNotificationBackgroundDescription": "الحصول على إشعار حول تقدم التحميل وإكماله. هذا يساعدك على تتبع التنزيلات عندما يكون التطبيق في الخلفية.", - "snackbarViewQueue": "عرض قائمة الانتظار", - "@audioAnalysisDuration": { - "description": "Duration metric label" - }, - "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", - "backupRestored": "Backup restored successfully", - "trackConvertConfirmMessageLosslessCapped": "Convert from {sourceFormat} to {targetFormat} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.", - "@trackConvertConfirmMessageLosslessCapped": { - "description": "Confirmation dialog message for capped lossless conversion of a single file", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "discographySelectAlbumsSubtitle": "Choose specific albums or singles", - "@discographySelectAlbumsSubtitle": { - "description": "Subtitle for select albums option" - }, - "backupImportSectionDescription": "Pick a backup file to restore your data. This replaces the current settings, history and library on this device.", - "errorUrlFetchFailed": "فشل تحميل المحتوى من هذا الرابط. الرجاء المحاولة مرة أخرى.", - "lyricsProviderLyricsPlusDesc": "Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)", - "dialogSave": "حفظ", - "trackReEnrichSearching": "Searching metadata online...", - "regionCountryUS": "United States", - "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", - "downloadFilenameFormat": "تنسيق اسم الملف", - "cueSplitTitle": "Split CUE Sheet", - "settingsAppSubtitle": "Updates, data, extension repo, debug", - "@settingsAppSubtitle": { - "description": "Subtitle for app settings" - }, - "@setupPermissionRequiredMessage": { - "description": "Generic permission required message", - "placeholders": { - "permissionType": { - "type": "String" - } - } - }, - "errorMissingExtensionSource": "لا يمكن تحميل {item}: مصدر الإضافة مفقود", - "albumFolderAlbumOnlySubtitle": "الألبومات/اسم الألبوم/", - "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", - "extensionVerificationHelpTitleManual": "Open verification manually", - "dialogDiscard": "تجاهل", - "storageModeSaf": "Custom Folder (SAF)", - "errorRateLimited": "تم الوصول للحد الأقصى", - "downloadSelectQuality": "تحديد الجودة", - "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", - "collectionFoldersTitle": "My folders", - "progressFetchingMetadata": "جلب البيانات الوصفية (metadata)... {current}/{total}", - "settingsDownloadNetworkAny": "WiFi + بيانات الجوال", - "audioAnalysisDuration": "Duration", - "audioAnalysisAnalyzing": "Analyzing audio...", - "extensionVerificationHelpMessageWaiting": "If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.", - "editMetadataFieldDiscNum": "Disc #", - "@editMetadataFieldDiscNum": { - "description": "Chip label for disc number field in auto-fill selector" - }, - "@noTracksFoundForAlbum": { - "description": "Empty state message when an album has no tracks" - }, - "previewPlay": "تشغيل المعاينة", - "setupPermissionRequiredMessage": "الإذن {permissionType} مطلوب لأفضل التجربة. يمكنك تغيير هذا لاحقاً في الإعدادات.", - "aboutVersion": "الإصدار", - "qualityHiResFlacSubtitle": "24 بت / ما يصل إلى 96 كيلو هرتز", - "audioAnalysisSamples": "Samples", - "libraryFilterQualityHiRes": "Hi-Res (24bit)", - "sectionMetadataProviders": "Providers", - "@sectionMetadataProviders": { - "description": "Settings section header for metadata providers" - }, - "trackCopyright": "حقوق الطبع و النشر", - "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", - "trackCopiedToClipboard": "تم النسخ إلى الحافظة", - "optionsEmbedMetadata": "Embed Metadata", - "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", - "@collectionAddedTracksToPlaylistWithExisting": { - "description": "Snackbar after adding multiple tracks to a playlist when some were already present", - "placeholders": { - "count": { - "type": "int" - }, - "playlistName": { - "type": "String" - }, - "alreadyCount": { - "type": "int" - } - } - }, - "storeCategoryIntegration": "Integration", - "storeClearFilters": "حذف الفلاتر", - "navSettings": "الإعدادات", - "@homeRecent": { - "description": "Section header for recent searches" - }, - "sectionApp": "التطبيق", - "@sectionLanguage": { - "description": "Settings section header for language" - }, - "downloadFilterContributingDisabled": "Full Album Artist string used", - "albumFolderArtistAlbumSinglesSubtitle": "الفنان/الألبوم و الفنان / المفردات", - "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", - "lyricsProvidersSaved": "Lyrics provider priority saved", - "@trackReplayGainFailed": { - "description": "Snackbar message when ReplayGain scan/write fails" - }, - "trackTrackName": "اسم الأغنية", - "homeRecent": "الأخيرة", - "recentEmpty": "No recent items yet", - "cacheClearAll": "Clear all cache", - "trackReEnrichFieldReleaseInfo": "Date & ISRC", - "regionCountryMX": "Mexico", - "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", - "editMetadataFieldAlbum": "Album", - "settingsAbout": "حول البرنامج", - "libraryFilterTitle": "Filters", - "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", - "extensionHooksAvailable": "متاح {count} روابط", - "backupContentsSettings": "App settings", - "trackLyricsEmbedded": "تمت إضافة كلمات الأغنية بنجاح", - "optionsUpdateChannelPreview": "الحصول على إصدارات تجريبية", - "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", - "libraryForceFullScan": "Force Full Scan", - "snackbarProviderPrioritySaved": "تم حفظ أولوية المزود", - "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", - "libraryBuiltInPlayerInfo": "The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.", - "extensionServiceStatus": "Service Status", - "dateWeeksAgo": "قبل {count} أسابيع", - "historyFilterSingles": "الأغاني", - "tutorialSettingsTip2": "Set default audio quality and format preferences", - "trackLyricsSaved": "Lyrics saved to {fileName}", - "cacheClearAllConfirmTitle": "Clear all cache?", - "noTracksFoundForAlbum": "No tracks found for this album", - "sectionLanguage": "اللّغة", - "@logIssueTrackNotFoundDescription": { - "description": "Diagnostic badge description when a track is unavailable" - }, - "setupSelectFolder": "حدد الملف", - "dateYesterday": "الأمس", - "collectionAddToPlaylist": "Add to playlist", - "snackbarUnsupportedAudioFormat": "Unsupported audio format", - "libraryScanCancelled": "Scan cancelled", - "appearanceLanguage": "لغة التطبيق", - "extensionsTitle": "الإضافات", - "dialogImportPlaylistMessage": "تم العثور على {count} مسارات في CSV. إضافتها إلى قائمة انتظار التنزيل؟", - "permissionNotification": "Notification", - "notifUpdateReady": "Update Ready", - "lyricsModeDescription": "اختر كيفية حفظ كلمات الأغاني مع التنزيلات الخاصة بك", - "downloadFrom": "تحميل من", - "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", - "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", - "optionsMaxQualityCover": "اختيار أعلى جودة للغلاف", - "trackOptionAddToWishlist": "Add to Wishlist", - "settingsBackup": "Backup & Restore", - "aboutPaxsenixSubtitle": "Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius", - "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", - "extensionsNoDownloadProvider": "لا توجد إضافات مع إمكانية مزود التحميل", - "libraryFilterSortGenreAsc": "Genre (A-Z)", - "trackReplayGainFailed": "فشل في إضافة علامات ReplayGain", - "collectionPlaylistRemoveCover": "Remove cover image", - "storeEmptyNoResults": "لم يتم العثور على إضافات", - "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", - "editMetadataFieldComment": "Comment", - "settingsMetadata": "Metadata", - "settingsCache": "Storage & Cache", - "providerPriorityFallbackExtensionsHint": "الإضافات المفعلة فقط مع قدرة توفير التنزيل مدرجة هنا.", - "libraryFilterAll": "All", - "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", - "extensionsProviderPrioritySection": "أولوية مزود الخدمة", - "storeChangeRepoTooltip": "تغيير المستودع", - "snackbarFailedToInstall": "فشل تثبيت الإضافة", - "libraryScanSubtitle": "Scan for audio files", - "snackbarExtensionInstalled": "تم تثبيت {extensionName}.", - "setupOpenSettings": "فتح الإعدادات", - "extensionsInstalledSection": "الإضافات المُثبّتة", - "aboutLinks": "روابط", - "trackCoverClearSelected": "Clear selected cover", - "libraryAutoScanWeekly": "Weekly", - "downloadMusixmatchLanguageAuto": "Auto (original language)", - "optionsDefaultSearchTab": "تبويب البحث الافتراضي", - "downloadPrimaryArtistOnlyOn": "Primary only: On", - "folderOrganizationDescription": "تنظيم الملفات التي تم تنزيلها في المجلدات", - "@folderOrganizationDescription": { - "description": "Folder organization sheet description" - }, - "lyricsModeEmbed": "تضمين في الملف", - "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", - "@extensionsSearchProviderDescription": { - "description": "Search provider setting description" - }, - "libraryFilterQualityLossy": "Lossy", - "actionPause": "إيقاف مؤقت", - "csvImportTracks": "{count} مسارات من CSV", - "actionGo": "Go", - "sectionDebug": "تصحيح الأخطاء", - "editMetadataFieldDate": "Date", - "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", - "sectionPerformance": "الأداء", - "extensionsDownloadPrioritySubtitle": "تعيين ترتيب خدمة التحميل", - "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", - "sectionData": "البيانات", - "notifFinalizingTrack": "Finalizing {trackName}", - "snackbarFileNotFound": "لم يتم العثور على الملف", - "extensionQualityOptions": "خيارات الجودة", - "extensionVerificationBrowserSubtitleExternal": "Open challenges in the default browser first", - "backupInvalidFile": "This file is not a valid SpotiFLAC backup", - "storeRepoDialogTitle": "مستودع الإضافات", - "extensionsSearchProviderDescription": "Choose which service to use for searching tracks", - "albumFolderAlbumOnly": "الألبوم فقط", - "nowPlayingOpenInExternalPlayer": "Open in external player", - "cueSplitButton": "Split into Tracks" -} diff --git a/lib/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index a843e79b..997184bb 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Found {count} tracks in CSV. Add them to download queue?", + "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", "csvImportTracks": "{count} tracks from CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,6 +802,30 @@ } } }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, "@dialogImportPlaylistMessage": { "description": "Dialog message - import playlist confirmation", "placeholders": { @@ -4769,9 +4793,9 @@ } } }, - "homeImportCsvTooltip": "Import CSV", + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, "homeChangeSearchProviderTooltip": "Change search provider", "@homeChangeSearchProviderTooltip": { diff --git a/lib/l10n/arb/app_hi.arb b/lib/l10n/arb/app_hi.arb deleted file mode 100644 index 9b367f5e..00000000 --- a/lib/l10n/arb/app_hi.arb +++ /dev/null @@ -1,5887 +0,0 @@ -{ - "@@locale": "hi", - "@@last_modified": "2026-04-28", - "appName": "SpotiFLAC Mobile", - "@appName": { - "description": "App name - DO NOT TRANSLATE" - }, - "navHome": "होम", - "@navHome": { - "description": "Bottom navigation - Home tab" - }, - "navLibrary": "Library", - "@navLibrary": { - "description": "Bottom navigation - Library tab" - }, - "navSettings": "विकल्प", - "@navSettings": { - "description": "Bottom navigation - Settings tab" - }, - "navStore": "Repo", - "@navStore": { - "description": "Bottom navigation - Extension store tab" - }, - "homeTitle": "Home", - "@homeTitle": { - "description": "Home screen title" - }, - "homeSubtitle": "Paste a supported URL or search by name", - "@homeSubtitle": { - "description": "Subtitle shown below search box" - }, - "homeEmptyTitle": "No search providers yet", - "@homeEmptyTitle": { - "description": "Title shown on home when no providers are available yet" - }, - "homeEmptySubtitle": "Install an extension to continue.", - "@homeEmptySubtitle": { - "description": "Subtitle shown on home when no providers are available yet" - }, - "homeSupports": "Supports: Track, Album, Playlist, Artist URLs", - "@homeSupports": { - "description": "Info text about supported URL types" - }, - "homeRecent": "Recent", - "@homeRecent": { - "description": "Section header for recent searches" - }, - "historyFilterAll": "All", - "@historyFilterAll": { - "description": "Filter chip - show all items" - }, - "historyFilterAlbums": "Albums", - "@historyFilterAlbums": { - "description": "Filter chip - show albums only" - }, - "historyFilterSingles": "Singles", - "@historyFilterSingles": { - "description": "Filter chip - show singles only" - }, - "historySearchHint": "Search history...", - "@historySearchHint": { - "description": "Search bar placeholder in history" - }, - "settingsTitle": "Settings", - "@settingsTitle": { - "description": "Settings screen title" - }, - "settingsDownload": "Download", - "@settingsDownload": { - "description": "Settings section - download options" - }, - "settingsAppearance": "Appearance", - "@settingsAppearance": { - "description": "Settings section - visual customization" - }, - "settingsExtensions": "Extensions", - "@settingsExtensions": { - "description": "Settings section - extension management" - }, - "settingsAbout": "About", - "@settingsAbout": { - "description": "Settings section - app info" - }, - "downloadTitle": "Download", - "@downloadTitle": { - "description": "Download settings page title" - }, - "downloadAskQualitySubtitle": "Show quality picker for each download", - "@downloadAskQualitySubtitle": { - "description": "Subtitle for ask quality toggle" - }, - "downloadFilenameFormat": "Filename Format", - "@downloadFilenameFormat": { - "description": "Setting for output filename pattern" - }, - "downloadSingleFilenameFormat": "Single Filename Format", - "@downloadSingleFilenameFormat": { - "description": "Setting for output filename pattern for singles/EPs" - }, - "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", - "@downloadSingleFilenameFormatDescription": { - "description": "Subtitle description for single filename format setting" - }, - "downloadFolderOrganization": "Folder Organization", - "@downloadFolderOrganization": { - "description": "Title of the folder organization picker bottom sheet" - }, - "appearanceTitle": "दिखावट", - "@appearanceTitle": { - "description": "Appearance settings page title" - }, - "appearanceThemeSystem": "System", - "@appearanceThemeSystem": { - "description": "Follow system theme" - }, - "appearanceThemeLight": "Light", - "@appearanceThemeLight": { - "description": "Light theme" - }, - "appearanceThemeDark": "Dark", - "@appearanceThemeDark": { - "description": "Dark theme" - }, - "appearanceDynamicColor": "डायनेमिक रंग", - "@appearanceDynamicColor": { - "description": "Material You dynamic colors" - }, - "appearanceDynamicColorSubtitle": "वॉलपेपर से रंग इस्तेमाल करें", - "@appearanceDynamicColorSubtitle": { - "description": "Subtitle for dynamic color" - }, - "appearanceHistoryView": "History View", - "@appearanceHistoryView": { - "description": "Layout style for history" - }, - "appearanceHistoryViewList": "List", - "@appearanceHistoryViewList": { - "description": "List layout option" - }, - "appearanceHistoryViewGrid": "Grid", - "@appearanceHistoryViewGrid": { - "description": "Grid layout option" - }, - "optionsPrimaryProvider": "Primary Provider", - "@optionsPrimaryProvider": { - "description": "Main search provider setting" - }, - "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", - "@optionsPrimaryProviderSubtitle": { - "description": "Subtitle for primary provider" - }, - "optionsUsingExtension": "Using extension: {extensionName}", - "@optionsUsingExtension": { - "description": "Shows active extension name", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "optionsDefaultSearchTab": "Default Search Tab", - "@optionsDefaultSearchTab": { - "description": "Title for the preferred default search tab setting" - }, - "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", - "@optionsDefaultSearchTabSubtitle": { - "description": "Subtitle for the preferred default search tab setting" - }, - "optionsAutoFallback": "Auto Fallback", - "@optionsAutoFallback": { - "description": "Auto-retry with other services" - }, - "optionsAutoFallbackSubtitle": "Try other services if download fails", - "@optionsAutoFallbackSubtitle": { - "description": "Subtitle for auto fallback" - }, - "optionsEmbedLyrics": "Embed Lyrics", - "@optionsEmbedLyrics": { - "description": "Embed lyrics in audio files" - }, - "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", - "@optionsEmbedLyricsSubtitle": { - "description": "Subtitle for embed lyrics" - }, - "optionsMaxQualityCover": "Max Quality Cover", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "Download highest resolution cover art", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, - "optionsReplayGain": "ReplayGain", - "@optionsReplayGain": { - "description": "Title for ReplayGain setting toggle" - }, - "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", - "@optionsReplayGainSubtitleOn": { - "description": "Subtitle when ReplayGain is enabled" - }, - "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", - "@optionsReplayGainSubtitleOff": { - "description": "Subtitle when ReplayGain is disabled" - }, - "trackReplayGain": "Rescan ReplayGain", - "@trackReplayGain": { - "description": "Three-dot menu option to scan loudness and write ReplayGain tags" - }, - "trackReplayGainScanning": "Analyzing loudness...", - "@trackReplayGainScanning": { - "description": "Snackbar/progress message while scanning ReplayGain for a single track" - }, - "trackReplayGainSuccess": "ReplayGain tags added", - "@trackReplayGainSuccess": { - "description": "Snackbar message after ReplayGain tags written for a single track" - }, - "trackReplayGainFailed": "Failed to add ReplayGain tags", - "@trackReplayGainFailed": { - "description": "Snackbar message when ReplayGain scan/write fails" - }, - "selectionReplayGainCount": "ReplayGain ({count})", - "@selectionReplayGainCount": { - "description": "Batch selection action button label for ReplayGain", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "replayGainBatchConfirmTitle": "Add ReplayGain", - "@replayGainBatchConfirmTitle": { - "description": "Title of the batch ReplayGain confirmation dialog" - }, - "replayGainBatchConfirmMessage": "Analyze loudness and write ReplayGain tags to {count} track(s)?", - "@replayGainBatchConfirmMessage": { - "description": "Message of the batch ReplayGain confirmation dialog", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "replayGainBatchAnalyzing": "Analyzing ReplayGain...", - "@replayGainBatchAnalyzing": { - "description": "Progress dialog title while batch scanning ReplayGain" - }, - "replayGainBatchSuccess": "ReplayGain added to {success} of {total} tracks", - "@replayGainBatchSuccess": { - "description": "Snackbar after batch ReplayGain completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "optionsArtistTagMode": "Artist Tag Mode", - "@optionsArtistTagMode": { - "description": "Setting title for how artist metadata is written into files" - }, - "optionsArtistTagModeDescription": "Choose how multiple artists are written into embedded tags.", - "@optionsArtistTagModeDescription": { - "description": "Bottom-sheet description for artist tag mode setting" - }, - "optionsArtistTagModeJoined": "Single joined value", - "@optionsArtistTagModeJoined": { - "description": "Artist tag mode option that joins multiple artists into one value" - }, - "optionsArtistTagModeJoinedSubtitle": "Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.", - "@optionsArtistTagModeJoinedSubtitle": { - "description": "Subtitle for joined artist tag mode" - }, - "optionsArtistTagModeSplitVorbis": "Split tags for FLAC/Opus", - "@optionsArtistTagModeSplitVorbis": { - "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" - }, - "optionsArtistTagModeSplitVorbisSubtitle": "Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.", - "@optionsArtistTagModeSplitVorbisSubtitle": { - "description": "Subtitle for split Vorbis artist tag mode" - }, - "optionsExtensionStore": "Extension Repo", - "@optionsExtensionStore": { - "description": "Show/hide store tab" - }, - "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", - "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" - }, - "optionsCheckUpdates": "Check for Updates", - "@optionsCheckUpdates": { - "description": "Auto update check toggle" - }, - "optionsCheckUpdatesSubtitle": "Notify when new version is available", - "@optionsCheckUpdatesSubtitle": { - "description": "Subtitle for update check" - }, - "optionsUpdateChannel": "Update Channel", - "@optionsUpdateChannel": { - "description": "Stable vs preview releases" - }, - "optionsUpdateChannelStable": "Stable releases only", - "@optionsUpdateChannelStable": { - "description": "Only stable updates" - }, - "optionsUpdateChannelPreview": "Get preview releases", - "@optionsUpdateChannelPreview": { - "description": "Include beta/preview updates" - }, - "optionsUpdateChannelWarning": "Preview may contain bugs or incomplete features", - "@optionsUpdateChannelWarning": { - "description": "Warning about preview channel" - }, - "optionsClearHistory": "Clear Download History", - "@optionsClearHistory": { - "description": "Delete all download history" - }, - "optionsClearHistorySubtitle": "Remove all downloaded tracks from history", - "@optionsClearHistorySubtitle": { - "description": "Subtitle for clear history" - }, - "optionsDetailedLogging": "Detailed Logging", - "@optionsDetailedLogging": { - "description": "Enable verbose logs for debugging" - }, - "optionsDetailedLoggingOn": "Detailed logs are being recorded", - "@optionsDetailedLoggingOn": { - "description": "Status when logging enabled" - }, - "optionsDetailedLoggingOff": "Enable for bug reports", - "@optionsDetailedLoggingOff": { - "description": "Status when logging disabled" - }, - "extensionsTitle": "Extensions", - "@extensionsTitle": { - "description": "Extensions page title" - }, - "extensionsDisabled": "Disabled", - "@extensionsDisabled": { - "description": "Extension status - inactive" - }, - "extensionsVersion": "Version {version}", - "@extensionsVersion": { - "description": "Extension version display", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "extensionsUninstall": "Uninstall", - "@extensionsUninstall": { - "description": "Uninstall extension button" - }, - "storeTitle": "Extension Repo", - "@storeTitle": { - "description": "Store screen title" - }, - "storeSearch": "Search extensions...", - "@storeSearch": { - "description": "Store search placeholder" - }, - "storeInstall": "Install", - "@storeInstall": { - "description": "Install extension button" - }, - "storeInstalled": "Installed", - "@storeInstalled": { - "description": "Already installed badge" - }, - "storeUpdate": "Update", - "@storeUpdate": { - "description": "Update available button" - }, - "aboutTitle": "About", - "@aboutTitle": { - "description": "About page title" - }, - "aboutContributors": "Contributors", - "@aboutContributors": { - "description": "Section for contributors" - }, - "aboutMobileDeveloper": "Mobile version developer", - "@aboutMobileDeveloper": { - "description": "Role description for mobile dev" - }, - "aboutOriginalCreator": "Creator of the original SpotiFLAC", - "@aboutOriginalCreator": { - "description": "Role description for original creator" - }, - "aboutLogoArtist": "The talented artist who created our beautiful app logo!", - "@aboutLogoArtist": { - "description": "Role description for logo artist" - }, - "aboutTranslators": "Translators", - "@aboutTranslators": { - "description": "Section for translators" - }, - "aboutSpecialThanks": "Special Thanks", - "@aboutSpecialThanks": { - "description": "Section for special thanks" - }, - "aboutLinks": "Links", - "@aboutLinks": { - "description": "Section for external links" - }, - "aboutMobileSource": "Mobile source code", - "@aboutMobileSource": { - "description": "Link to mobile GitHub repo" - }, - "aboutPCSource": "PC source code", - "@aboutPCSource": { - "description": "Link to PC GitHub repo" - }, - "aboutKeepAndroidOpen": "Keep Android Open", - "@aboutKeepAndroidOpen": { - "description": "Link to Keep Android Open campaign website" - }, - "aboutReportIssue": "Report an issue", - "@aboutReportIssue": { - "description": "Link to report bugs" - }, - "aboutReportIssueSubtitle": "Report any problems you encounter", - "@aboutReportIssueSubtitle": { - "description": "Subtitle for report issue" - }, - "aboutFeatureRequest": "Feature request", - "@aboutFeatureRequest": { - "description": "Link to suggest features" - }, - "aboutFeatureRequestSubtitle": "Suggest new features for the app", - "@aboutFeatureRequestSubtitle": { - "description": "Subtitle for feature request" - }, - "aboutTelegramChannel": "Telegram Channel", - "@aboutTelegramChannel": { - "description": "Link to Telegram channel" - }, - "aboutTelegramChannelSubtitle": "Announcements and updates", - "@aboutTelegramChannelSubtitle": { - "description": "Subtitle for Telegram channel" - }, - "aboutTelegramChat": "Telegram Community", - "@aboutTelegramChat": { - "description": "Link to Telegram chat group" - }, - "aboutTelegramChatSubtitle": "Chat with other users", - "@aboutTelegramChatSubtitle": { - "description": "Subtitle for Telegram chat" - }, - "aboutSocial": "Social", - "@aboutSocial": { - "description": "Section for social links" - }, - "aboutApp": "App", - "@aboutApp": { - "description": "Section for app info" - }, - "aboutVersion": "Version", - "@aboutVersion": { - "description": "Version info label" - }, - "aboutBinimumDesc": "The creator of QQDL & HiFi API. This project helped shape lossless download support.", - "@aboutBinimumDesc": { - "description": "Credit description for binimum" - }, - "aboutSachinsenalDesc": "The original HiFi project creator. A foundation for lossless-source integration.", - "@aboutSachinsenalDesc": { - "description": "Credit description for sachinsenal0x64" - }, - "aboutSjdonadoDesc": "Creator of I Don't Have Spotify (IDHS). The fallback link resolver that saves the day!", - "@aboutSjdonadoDesc": { - "description": "Credit description for sjdonado" - }, - "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", - "@aboutAppDescription": { - "description": "App description in header card" - }, - "artistAlbums": "Albums", - "@artistAlbums": { - "description": "Section header for artist albums" - }, - "artistSingles": "Singles & EPs", - "@artistSingles": { - "description": "Section header for singles/EPs" - }, - "artistCompilations": "Compilations", - "@artistCompilations": { - "description": "Section header for compilations" - }, - "artistPopular": "Popular", - "@artistPopular": { - "description": "Section header for popular/top tracks" - }, - "artistMonthlyListeners": "{count} monthly listeners", - "@artistMonthlyListeners": { - "description": "Monthly listener count display", - "placeholders": { - "count": { - "type": "String", - "description": "Formatted listener count" - } - } - }, - "trackMetadataService": "Service", - "@trackMetadataService": { - "description": "Metadata field - download service used" - }, - "trackMetadataPlay": "Play", - "@trackMetadataPlay": { - "description": "Action button - play track" - }, - "trackMetadataShare": "Share", - "@trackMetadataShare": { - "description": "Action button - share track" - }, - "trackMetadataDelete": "Delete", - "@trackMetadataDelete": { - "description": "Action button - delete track" - }, - "setupGrantPermission": "Grant Permission", - "@setupGrantPermission": { - "description": "Button to request permission" - }, - "setupSkip": "Skip for now", - "@setupSkip": { - "description": "Skip current step button" - }, - "setupStorageAccessRequired": "Storage Access Required", - "@setupStorageAccessRequired": { - "description": "Title when storage access needed" - }, - "setupStorageAccessMessageAndroid11": "Android 11+ requires \"All files access\" permission to save files to your chosen download folder.", - "@setupStorageAccessMessageAndroid11": { - "description": "Android 11+ specific explanation" - }, - "setupOpenSettings": "Open Settings", - "@setupOpenSettings": { - "description": "Button to open system settings" - }, - "setupPermissionDeniedMessage": "Permission denied. Please grant all permissions to continue.", - "@setupPermissionDeniedMessage": { - "description": "Error when permission denied" - }, - "setupPermissionRequired": "{permissionType} Permission Required", - "@setupPermissionRequired": { - "description": "Generic permission required title", - "placeholders": { - "permissionType": { - "type": "String", - "description": "Type of permission (Storage/Notification)" - } - } - }, - "setupPermissionRequiredMessage": "{permissionType} permission is required for the best experience. You can change this later in Settings.", - "@setupPermissionRequiredMessage": { - "description": "Generic permission required message", - "placeholders": { - "permissionType": { - "type": "String" - } - } - }, - "setupUseDefaultFolder": "Use Default Folder?", - "@setupUseDefaultFolder": { - "description": "Dialog title for default folder" - }, - "setupNoFolderSelected": "No folder selected. Would you like to use the default Music folder?", - "@setupNoFolderSelected": { - "description": "Prompt when no folder selected" - }, - "setupUseDefault": "Use Default", - "@setupUseDefault": { - "description": "Button to use default folder" - }, - "setupDownloadLocationTitle": "Download Location", - "@setupDownloadLocationTitle": { - "description": "Download location dialog title" - }, - "setupDownloadLocationIosMessage": "On iOS, downloads are saved to the app's Documents folder. You can access them via the Files app.", - "@setupDownloadLocationIosMessage": { - "description": "iOS-specific folder info" - }, - "setupAppDocumentsFolder": "App Documents Folder", - "@setupAppDocumentsFolder": { - "description": "iOS documents folder option" - }, - "setupAppDocumentsFolderSubtitle": "Recommended - accessible via Files app", - "@setupAppDocumentsFolderSubtitle": { - "description": "Subtitle for documents folder" - }, - "setupChooseFromFiles": "Choose from Files", - "@setupChooseFromFiles": { - "description": "iOS file picker option" - }, - "setupChooseFromFilesSubtitle": "Select iCloud or other location", - "@setupChooseFromFilesSubtitle": { - "description": "Subtitle for file picker" - }, - "setupIosEmptyFolderWarning": "iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.", - "@setupIosEmptyFolderWarning": { - "description": "iOS folder selection warning" - }, - "setupIcloudNotSupported": "iCloud Drive is not supported. Please use the app Documents folder.", - "@setupIcloudNotSupported": { - "description": "Error when user selects iCloud Drive on iOS" - }, - "setupDownloadInFlac": "Download Spotify tracks in FLAC", - "@setupDownloadInFlac": { - "description": "App tagline in setup" - }, - "setupStorageGranted": "Storage Permission Granted!", - "@setupStorageGranted": { - "description": "Success message for storage permission" - }, - "setupStorageRequired": "Storage Permission Required", - "@setupStorageRequired": { - "description": "Title when storage permission needed" - }, - "setupStorageDescription": "SpotiFLAC needs storage permission to save your downloaded music files.", - "@setupStorageDescription": { - "description": "Explanation for storage permission" - }, - "setupNotificationGranted": "Notification Permission Granted!", - "@setupNotificationGranted": { - "description": "Success message for notification permission" - }, - "setupNotificationEnable": "Enable Notifications", - "@setupNotificationEnable": { - "description": "Button to enable notifications" - }, - "setupFolderChoose": "Choose Download Folder", - "@setupFolderChoose": { - "description": "Button to choose folder" - }, - "setupFolderDescription": "Select a folder where your downloaded music will be saved.", - "@setupFolderDescription": { - "description": "Explanation for folder selection" - }, - "setupSelectFolder": "Select Folder", - "@setupSelectFolder": { - "description": "Button to select folder" - }, - "setupEnableNotifications": "Enable Notifications", - "@setupEnableNotifications": { - "description": "Button to enable notifications" - }, - "setupNotificationBackgroundDescription": "Get notified about download progress and completion. This helps you track downloads when the app is in background.", - "@setupNotificationBackgroundDescription": { - "description": "Detailed notification explanation" - }, - "setupSkipForNow": "Skip for now", - "@setupSkipForNow": { - "description": "Skip button text" - }, - "setupNext": "Next", - "@setupNext": { - "description": "Next button text" - }, - "setupGetStarted": "Get Started", - "@setupGetStarted": { - "description": "Final setup button" - }, - "setupAllowAccessToManageFiles": "Please enable \"Allow access to manage all files\" in the next screen.", - "@setupAllowAccessToManageFiles": { - "description": "Instruction for file access permission" - }, - "setupLanguageTitle": "Choose Language", - "@setupLanguageTitle": { - "description": "Title for the language selection step in setup" - }, - "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", - "@setupLanguageDescription": { - "description": "Description for the language selection step in setup" - }, - "setupLanguageSystemDefault": "System Default", - "@setupLanguageSystemDefault": { - "description": "Option to use the system language" - }, - "dialogCancel": "Cancel", - "@dialogCancel": { - "description": "Dialog button - cancel action" - }, - "dialogSave": "Save", - "@dialogSave": { - "description": "Dialog button - save changes" - }, - "dialogDelete": "Delete", - "@dialogDelete": { - "description": "Dialog button - delete item" - }, - "dialogRetry": "Retry", - "@dialogRetry": { - "description": "Dialog button - retry action" - }, - "dialogClear": "Clear", - "@dialogClear": { - "description": "Dialog button - clear items" - }, - "dialogDone": "Done", - "@dialogDone": { - "description": "Dialog button - action completed" - }, - "dialogImport": "Import", - "@dialogImport": { - "description": "Dialog button - import data" - }, - "dialogDownload": "Download", - "@dialogDownload": { - "description": "Confirm button in Download All dialog" - }, - "previewPlay": "Play preview", - "@previewPlay": { - "description": "Tooltip for the button that plays a short track preview snippet" - }, - "previewStop": "Stop preview", - "@previewStop": { - "description": "Tooltip for the button that stops the playing track preview snippet" - }, - "previewUnavailable": "Preview unavailable", - "@previewUnavailable": { - "description": "Snackbar shown when a track preview snippet cannot be played" - }, - "dialogDiscard": "Discard", - "@dialogDiscard": { - "description": "Dialog button - discard changes" - }, - "dialogRemove": "Remove", - "@dialogRemove": { - "description": "Dialog button - remove item" - }, - "dialogUninstall": "Uninstall", - "@dialogUninstall": { - "description": "Dialog button - uninstall extension" - }, - "dialogDiscardChanges": "Discard Changes?", - "@dialogDiscardChanges": { - "description": "Dialog title - unsaved changes warning" - }, - "dialogUnsavedChanges": "You have unsaved changes. Do you want to discard them?", - "@dialogUnsavedChanges": { - "description": "Dialog message - unsaved changes" - }, - "dialogClearAll": "Clear All", - "@dialogClearAll": { - "description": "Dialog title - clear all items" - }, - "dialogRemoveExtension": "Remove Extension", - "@dialogRemoveExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogRemoveExtensionMessage": "Are you sure you want to remove this extension? This cannot be undone.", - "@dialogRemoveExtensionMessage": { - "description": "Dialog message - uninstall confirmation" - }, - "dialogUninstallExtension": "Uninstall Extension?", - "@dialogUninstallExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogUninstallExtensionMessage": "Are you sure you want to remove {extensionName}?", - "@dialogUninstallExtensionMessage": { - "description": "Dialog message - uninstall specific extension", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "dialogClearHistoryTitle": "Clear History", - "@dialogClearHistoryTitle": { - "description": "Dialog title - clear download history" - }, - "dialogClearHistoryMessage": "Are you sure you want to clear all download history? This cannot be undone.", - "@dialogClearHistoryMessage": { - "description": "Dialog message - clear history confirmation" - }, - "dialogDeleteSelectedTitle": "Delete Selected", - "@dialogDeleteSelectedTitle": { - "description": "Dialog title - delete selected items" - }, - "dialogDeleteSelectedMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from history?\n\nThis will also delete the files from storage.", - "@dialogDeleteSelectedMessage": { - "description": "Dialog message - delete selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogImportPlaylistTitle": "Import Playlist", - "@dialogImportPlaylistTitle": { - "description": "Dialog title - import CSV playlist" - }, - "dialogImportPlaylistMessage": "Found {count} tracks in CSV. Add them to download queue?", - "csvImportTracks": "{count} tracks from CSV", - "@csvImportTracks": { - "description": "Label shown in quality picker for CSV import", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@dialogImportPlaylistMessage": { - "description": "Dialog message - import playlist confirmation", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedToQueue": "Added \"{trackName}\" to queue", - "@snackbarAddedToQueue": { - "description": "Snackbar - track added to download queue", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAddedTracksToQueue": "Added {count} tracks to queue", - "@snackbarAddedTracksToQueue": { - "description": "Snackbar - multiple tracks added to queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAlreadyDownloaded": "\"{trackName}\" already downloaded", - "@snackbarAlreadyDownloaded": { - "description": "Snackbar - track already exists", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAlreadyInLibrary": "\"{trackName}\" already exists in your library", - "@snackbarAlreadyInLibrary": { - "description": "Snackbar - track already exists in local library", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarHistoryCleared": "History cleared", - "@snackbarHistoryCleared": { - "description": "Snackbar - history deleted" - }, - "snackbarDeletedTracks": "Deleted {count} {count, plural, =1{track} other{tracks}}", - "@snackbarDeletedTracks": { - "description": "Snackbar - tracks deleted", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarCannotOpenFile": "Cannot open file: {error}", - "@snackbarCannotOpenFile": { - "description": "Snackbar - file open error", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "snackbarViewQueue": "View Queue", - "@snackbarViewQueue": { - "description": "Snackbar action - view download queue" - }, - "snackbarUrlCopied": "{platform} URL copied to clipboard", - "@snackbarUrlCopied": { - "description": "Snackbar - URL copied", - "placeholders": { - "platform": { - "type": "String", - "description": "Platform name (Spotify/Deezer)" - } - } - }, - "snackbarFileNotFound": "File not found", - "@snackbarFileNotFound": { - "description": "Snackbar - file doesn't exist" - }, - "snackbarSelectExtFile": "Please select a .spotiflac-ext file", - "@snackbarSelectExtFile": { - "description": "Snackbar - wrong file type selected" - }, - "snackbarProviderPrioritySaved": "Provider priority saved", - "@snackbarProviderPrioritySaved": { - "description": "Snackbar - provider order saved" - }, - "snackbarMetadataProviderSaved": "Metadata provider priority saved", - "@snackbarMetadataProviderSaved": { - "description": "Snackbar - metadata provider order saved" - }, - "snackbarExtensionInstalled": "{extensionName} installed.", - "@snackbarExtensionInstalled": { - "description": "Snackbar - extension installed successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarExtensionUpdated": "{extensionName} updated.", - "@snackbarExtensionUpdated": { - "description": "Snackbar - extension updated successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarFailedToInstall": "Failed to install extension", - "@snackbarFailedToInstall": { - "description": "Snackbar - extension install error" - }, - "snackbarFailedToUpdate": "Failed to update extension", - "@snackbarFailedToUpdate": { - "description": "Snackbar - extension update error" - }, - "errorRateLimited": "Rate Limited", - "@errorRateLimited": { - "description": "Error title - too many requests" - }, - "errorRateLimitedMessage": "Too many requests. Please wait a moment before searching again.", - "@errorRateLimitedMessage": { - "description": "Error message - rate limit explanation" - }, - "errorNoTracksFound": "No tracks found", - "@errorNoTracksFound": { - "description": "Error - search returned no results" - }, - "searchEmptyResultSubtitle": "Try another keyword", - "@searchEmptyResultSubtitle": { - "description": "Subtitle shown under the empty search result state on the home screen" - }, - "errorUrlNotRecognized": "Link not recognized", - "@errorUrlNotRecognized": { - "description": "Error title - URL not handled by any extension or service" - }, - "errorUrlNotRecognizedMessage": "This link is not supported. Make sure the URL is correct and a compatible extension is installed.", - "@errorUrlNotRecognizedMessage": { - "description": "Error message - URL not recognized explanation" - }, - "errorUrlFetchFailed": "Failed to load content from this link. Please try again.", - "@errorUrlFetchFailed": { - "description": "Error message - generic URL fetch failure" - }, - "errorMissingExtensionSource": "Cannot load {item}: missing extension source", - "@errorMissingExtensionSource": { - "description": "Error - extension source not available", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "actionPause": "Pause", - "@actionPause": { - "description": "Action button - pause download" - }, - "actionResume": "Resume", - "@actionResume": { - "description": "Action button - resume download" - }, - "actionCancel": "Cancel", - "@actionCancel": { - "description": "Action button - cancel operation" - }, - "actionSelectAll": "Select All", - "@actionSelectAll": { - "description": "Action button - select all items" - }, - "actionDeselect": "Deselect", - "@actionDeselect": { - "description": "Action button - deselect all" - }, - "selectionSelected": "{count} selected", - "@selectionSelected": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionAllSelected": "All tracks selected", - "@selectionAllSelected": { - "description": "Status - all items selected" - }, - "selectionSelectToDelete": "Select tracks to delete", - "@selectionSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "progressFetchingMetadata": "Fetching metadata... {current}/{total}", - "@progressFetchingMetadata": { - "description": "Progress indicator - loading track info", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "progressReadingCsv": "Reading CSV...", - "@progressReadingCsv": { - "description": "Progress indicator - parsing CSV file" - }, - "searchSongs": "Songs", - "@searchSongs": { - "description": "Search result category - songs" - }, - "searchArtists": "Artists", - "@searchArtists": { - "description": "Search result category - artists" - }, - "searchAlbums": "Albums", - "@searchAlbums": { - "description": "Search result category - albums" - }, - "searchPlaylists": "Playlists", - "@searchPlaylists": { - "description": "Search result category - playlists" - }, - "searchSortTitle": "Sort Results", - "@searchSortTitle": { - "description": "Bottom sheet title for search sort options" - }, - "searchSortDefault": "Default", - "@searchSortDefault": { - "description": "Sort option - default API order" - }, - "searchSortTitleAZ": "Title (A-Z)", - "@searchSortTitleAZ": { - "description": "Sort option - title ascending" - }, - "searchSortTitleZA": "Title (Z-A)", - "@searchSortTitleZA": { - "description": "Sort option - title descending" - }, - "searchSortArtistAZ": "Artist (A-Z)", - "@searchSortArtistAZ": { - "description": "Sort option - artist ascending" - }, - "searchSortArtistZA": "Artist (Z-A)", - "@searchSortArtistZA": { - "description": "Sort option - artist descending" - }, - "searchSortDurationShort": "Duration (Shortest)", - "@searchSortDurationShort": { - "description": "Sort option - shortest duration first" - }, - "searchSortDurationLong": "Duration (Longest)", - "@searchSortDurationLong": { - "description": "Sort option - longest duration first" - }, - "searchSortDateOldest": "Release Date (Oldest)", - "@searchSortDateOldest": { - "description": "Sort option - oldest release first" - }, - "searchSortDateNewest": "Release Date (Newest)", - "@searchSortDateNewest": { - "description": "Sort option - newest release first" - }, - "tooltipPlay": "Play", - "@tooltipPlay": { - "description": "Tooltip - play button" - }, - "filenameFormat": "Filename Format", - "@filenameFormat": { - "description": "Setting title - filename pattern" - }, - "filenameShowAdvancedTags": "Show advanced tags", - "@filenameShowAdvancedTags": { - "description": "Toggle label for showing advanced filename tags" - }, - "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", - "@filenameShowAdvancedTagsDescription": { - "description": "Description for advanced filename tag toggle" - }, - "folderOrganizationNone": "No organization", - "@folderOrganizationNone": { - "description": "Folder option - flat structure" - }, - "folderOrganizationByPlaylist": "By Playlist", - "@folderOrganizationByPlaylist": { - "description": "Folder option - playlist folders" - }, - "folderOrganizationByPlaylistSubtitle": "Separate folder for each playlist", - "@folderOrganizationByPlaylistSubtitle": { - "description": "Subtitle for playlist folder option" - }, - "folderOrganizationByArtist": "By Artist", - "@folderOrganizationByArtist": { - "description": "Folder option - artist folders" - }, - "folderOrganizationByAlbum": "By Album", - "@folderOrganizationByAlbum": { - "description": "Folder option - album folders" - }, - "folderOrganizationByArtistAlbum": "Artist/Album", - "@folderOrganizationByArtistAlbum": { - "description": "Folder option - nested folders" - }, - "folderOrganizationDescription": "Organize downloaded files into folders", - "@folderOrganizationDescription": { - "description": "Folder organization sheet description" - }, - "folderOrganizationNoneSubtitle": "All files in download folder", - "@folderOrganizationNoneSubtitle": { - "description": "Subtitle for no organization option" - }, - "folderOrganizationByArtistSubtitle": "Separate folder for each artist", - "@folderOrganizationByArtistSubtitle": { - "description": "Subtitle for artist folder option" - }, - "folderOrganizationByAlbumSubtitle": "Separate folder for each album", - "@folderOrganizationByAlbumSubtitle": { - "description": "Subtitle for album folder option" - }, - "folderOrganizationByArtistAlbumSubtitle": "Nested folders for artist and album", - "@folderOrganizationByArtistAlbumSubtitle": { - "description": "Subtitle for nested folder option" - }, - "updateAvailable": "Update Available", - "@updateAvailable": { - "description": "Update dialog title" - }, - "updateLater": "Later", - "@updateLater": { - "description": "Update button - dismiss" - }, - "updateStartingDownload": "Starting download...", - "@updateStartingDownload": { - "description": "Update status - initializing" - }, - "updateDownloadFailed": "Download failed", - "@updateDownloadFailed": { - "description": "Update error title" - }, - "updateFailedMessage": "Failed to download update", - "@updateFailedMessage": { - "description": "Update error message" - }, - "updateNewVersionReady": "A new version is ready", - "@updateNewVersionReady": { - "description": "Update subtitle" - }, - "updateCurrent": "Current", - "@updateCurrent": { - "description": "Label for current version" - }, - "updateNew": "New", - "@updateNew": { - "description": "Label for new version" - }, - "updateDownloading": "Downloading...", - "@updateDownloading": { - "description": "Update status - downloading" - }, - "updateWhatsNew": "What's New", - "@updateWhatsNew": { - "description": "Changelog section title" - }, - "updateDownloadInstall": "Download & Install", - "@updateDownloadInstall": { - "description": "Update button - download and install" - }, - "updateDontRemind": "Don't remind", - "@updateDontRemind": { - "description": "Update button - skip this version" - }, - "providerPriorityTitle": "Provider Priority", - "@providerPriorityTitle": { - "description": "Provider priority page title" - }, - "providerPriorityDescription": "Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.", - "@providerPriorityDescription": { - "description": "Provider priority page description" - }, - "providerPriorityInfo": "If a track is not available on the first provider, the app will automatically try the next one.", - "@providerPriorityInfo": { - "description": "Info tip about fallback behavior" - }, - "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", - "@providerPriorityFallbackExtensionsDescription": { - "description": "Section description for extension fallback selection" - }, - "providerPriorityFallbackExtensionsHint": "Only enabled extensions with download-provider capability are listed here.", - "@providerPriorityFallbackExtensionsHint": { - "description": "Hint below the extension fallback selection list" - }, - "providerExtension": "Extension", - "@providerExtension": { - "description": "Label for extension-provided providers" - }, - "metadataProviderPriorityTitle": "Metadata Priority", - "@metadataProviderPriorityTitle": { - "description": "Metadata priority page title" - }, - "metadataProviderPriorityDescription": "Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.", - "@metadataProviderPriorityDescription": { - "description": "Metadata priority page description" - }, - "metadataProviderPriorityInfo": "Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.", - "@metadataProviderPriorityInfo": { - "description": "Info tip about rate limits" - }, - "logTitle": "Logs", - "@logTitle": { - "description": "Logs screen title" - }, - "logCopied": "Logs copied to clipboard", - "@logCopied": { - "description": "Snackbar - logs copied" - }, - "logSearchHint": "Search logs...", - "@logSearchHint": { - "description": "Log search placeholder" - }, - "logFilterLevel": "Level", - "@logFilterLevel": { - "description": "Filter by log level" - }, - "logFilterSection": "Filter", - "@logFilterSection": { - "description": "Filter section title" - }, - "logShareLogs": "Share logs", - "@logShareLogs": { - "description": "Share button tooltip" - }, - "logClearLogs": "Clear logs", - "@logClearLogs": { - "description": "Clear button tooltip" - }, - "logClearLogsTitle": "Clear Logs", - "@logClearLogsTitle": { - "description": "Clear logs dialog title" - }, - "logClearLogsMessage": "Are you sure you want to clear all logs?", - "@logClearLogsMessage": { - "description": "Clear logs confirmation message" - }, - "logFilterBySeverity": "Filter logs by severity", - "@logFilterBySeverity": { - "description": "Filter dialog title" - }, - "logNoLogsYet": "No logs yet", - "@logNoLogsYet": { - "description": "Empty state title" - }, - "logNoLogsYetSubtitle": "Logs will appear here as you use the app", - "@logNoLogsYetSubtitle": { - "description": "Empty state subtitle" - }, - "logEntriesFiltered": "Entries ({count} filtered)", - "@logEntriesFiltered": { - "description": "Log count with filter active", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "logEntries": "Entries ({count})", - "@logEntries": { - "description": "Total log count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "channelStable": "Stable", - "@channelStable": { - "description": "Update channel - stable releases" - }, - "channelPreview": "Preview", - "@channelPreview": { - "description": "Update channel - beta/preview releases" - }, - "sectionSearchSource": "Search Source", - "@sectionSearchSource": { - "description": "Settings section header" - }, - "sectionDownload": "Download", - "@sectionDownload": { - "description": "Settings section header" - }, - "sectionPerformance": "Performance", - "@sectionPerformance": { - "description": "Settings section header" - }, - "sectionApp": "App", - "@sectionApp": { - "description": "Settings section header" - }, - "sectionData": "Data", - "@sectionData": { - "description": "Settings section header" - }, - "sectionDebug": "Debug", - "@sectionDebug": { - "description": "Settings section header" - }, - "sectionService": "Service", - "@sectionService": { - "description": "Settings section header" - }, - "sectionAudioQuality": "Audio Quality", - "@sectionAudioQuality": { - "description": "Settings section header" - }, - "sectionFileSettings": "File Settings", - "@sectionFileSettings": { - "description": "Settings section header" - }, - "sectionLyrics": "Lyrics", - "@sectionLyrics": { - "description": "Settings section header" - }, - "lyricsMode": "Lyrics Mode", - "@lyricsMode": { - "description": "Setting - how to save lyrics" - }, - "lyricsModeDescription": "Choose how lyrics are saved with your downloads", - "@lyricsModeDescription": { - "description": "Lyrics mode picker description" - }, - "lyricsModeEmbed": "Embed in file", - "@lyricsModeEmbed": { - "description": "Lyrics mode option - embed in audio file" - }, - "lyricsModeEmbedSubtitle": "Lyrics stored inside FLAC metadata", - "@lyricsModeEmbedSubtitle": { - "description": "Subtitle for embed option" - }, - "lyricsModeExternal": "External .lrc file", - "@lyricsModeExternal": { - "description": "Lyrics mode option - separate LRC file" - }, - "lyricsModeExternalSubtitle": "Separate .lrc file for players like Samsung Music", - "@lyricsModeExternalSubtitle": { - "description": "Subtitle for external option" - }, - "lyricsModeBoth": "Both", - "@lyricsModeBoth": { - "description": "Lyrics mode option - embed and external" - }, - "lyricsModeBothSubtitle": "Embed and save .lrc file", - "@lyricsModeBothSubtitle": { - "description": "Subtitle for both option" - }, - "sectionColor": "Color", - "@sectionColor": { - "description": "Settings section header" - }, - "sectionTheme": "Theme", - "@sectionTheme": { - "description": "Settings section header" - }, - "sectionLayout": "Layout", - "@sectionLayout": { - "description": "Settings section header" - }, - "sectionLanguage": "Language", - "@sectionLanguage": { - "description": "Settings section header for language" - }, - "appearanceLanguage": "App Language", - "@appearanceLanguage": { - "description": "Language setting title" - }, - "settingsAppearanceSubtitle": "Theme, colors, display", - "@settingsAppearanceSubtitle": { - "description": "Appearance settings description" - }, - "settingsDownloadSubtitle": "Service, quality, fallback", - "@settingsDownloadSubtitle": { - "description": "Download settings description" - }, - "settingsExtensionsSubtitle": "Manage download providers", - "@settingsExtensionsSubtitle": { - "description": "Extensions settings description" - }, - "settingsLogsSubtitle": "View app logs for debugging", - "@settingsLogsSubtitle": { - "description": "Logs settings description" - }, - "loadingSharedLink": "Loading shared link...", - "@loadingSharedLink": { - "description": "Status when opening shared URL" - }, - "pressBackAgainToExit": "Press back again to exit", - "@pressBackAgainToExit": { - "description": "Exit confirmation message" - }, - "downloadAllCount": "Download All ({count})", - "@downloadAllCount": { - "description": "Download all button with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tracksCount": "{count, plural, =1{1 track} other{{count} tracks}}", - "@tracksCount": { - "description": "Track count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackCopyFilePath": "Copy file path", - "@trackCopyFilePath": { - "description": "Action - copy file path" - }, - "trackRemoveFromDevice": "Remove from device", - "@trackRemoveFromDevice": { - "description": "Action - delete downloaded file" - }, - "trackLoadLyrics": "Load Lyrics", - "@trackLoadLyrics": { - "description": "Action - fetch lyrics" - }, - "trackMetadata": "Metadata", - "@trackMetadata": { - "description": "Tab title - track metadata" - }, - "trackFileInfo": "File Info", - "@trackFileInfo": { - "description": "Tab title - file information" - }, - "trackLyrics": "Lyrics", - "@trackLyrics": { - "description": "Tab title - lyrics" - }, - "trackFileNotFound": "File not found", - "@trackFileNotFound": { - "description": "Error - file doesn't exist" - }, - "trackOpenInDeezer": "Open in Deezer", - "@trackOpenInDeezer": { - "description": "Action - open track in Deezer app" - }, - "trackOpenInSpotify": "Open in Spotify", - "@trackOpenInSpotify": { - "description": "Action - open track in Spotify app" - }, - "trackTrackName": "Track name", - "@trackTrackName": { - "description": "Metadata label - track title" - }, - "trackArtist": "Artist", - "@trackArtist": { - "description": "Metadata label - artist name" - }, - "trackAlbumArtist": "Album artist", - "@trackAlbumArtist": { - "description": "Metadata label - album artist" - }, - "trackAlbum": "Album", - "@trackAlbum": { - "description": "Metadata label - album name" - }, - "trackTrackNumber": "Track number", - "@trackTrackNumber": { - "description": "Metadata label - track number" - }, - "trackDiscNumber": "Disc number", - "@trackDiscNumber": { - "description": "Metadata label - disc number" - }, - "trackDuration": "Duration", - "@trackDuration": { - "description": "Metadata label - track length" - }, - "trackAudioQuality": "Audio quality", - "@trackAudioQuality": { - "description": "Metadata label - audio quality" - }, - "trackReleaseDate": "Release date", - "@trackReleaseDate": { - "description": "Metadata label - release date" - }, - "trackGenre": "Genre", - "@trackGenre": { - "description": "Metadata label - music genre" - }, - "trackLabel": "Label", - "@trackLabel": { - "description": "Metadata label - record label" - }, - "trackCopyright": "Copyright", - "@trackCopyright": { - "description": "Metadata label - copyright information" - }, - "trackDownloaded": "Downloaded", - "@trackDownloaded": { - "description": "Metadata label - download date" - }, - "trackCopyLyrics": "Copy lyrics", - "@trackCopyLyrics": { - "description": "Action - copy lyrics to clipboard" - }, - "trackLyricsSource": "Source: {source}", - "@trackLyricsSource": { - "description": "Label showing the lyrics source/provider", - "placeholders": { - "source": { - "type": "String" - } - } - }, - "trackLyricsNotAvailable": "Lyrics not available for this track", - "@trackLyricsNotAvailable": { - "description": "Message when lyrics not found" - }, - "trackLyricsNotInFile": "No lyrics found in this file", - "@trackLyricsNotInFile": { - "description": "Message when no embedded lyrics in audio file" - }, - "trackFetchOnlineLyrics": "Fetch from Online", - "@trackFetchOnlineLyrics": { - "description": "Action - fetch lyrics from online providers" - }, - "trackLyricsTimeout": "Request timed out. Try again later.", - "@trackLyricsTimeout": { - "description": "Message when lyrics request times out" - }, - "trackLyricsLoadFailed": "Failed to load lyrics", - "@trackLyricsLoadFailed": { - "description": "Message when lyrics loading fails" - }, - "trackEmbedLyrics": "Embed Lyrics", - "@trackEmbedLyrics": { - "description": "Action - embed lyrics into audio file" - }, - "trackLyricsEmbedded": "Lyrics embedded successfully", - "@trackLyricsEmbedded": { - "description": "Snackbar - lyrics saved to file" - }, - "trackInstrumental": "Instrumental track", - "@trackInstrumental": { - "description": "Message when track is instrumental (no lyrics)" - }, - "trackCopiedToClipboard": "Copied to clipboard", - "@trackCopiedToClipboard": { - "description": "Snackbar - content copied" - }, - "trackDeleteConfirmTitle": "Remove from device?", - "@trackDeleteConfirmTitle": { - "description": "Delete confirmation title" - }, - "trackDeleteConfirmMessage": "This will permanently delete the downloaded file and remove it from your history.", - "@trackDeleteConfirmMessage": { - "description": "Delete confirmation message" - }, - "dateToday": "Today", - "@dateToday": { - "description": "Relative date - today" - }, - "dateYesterday": "Yesterday", - "@dateYesterday": { - "description": "Relative date - yesterday" - }, - "dateDaysAgo": "{count} days ago", - "@dateDaysAgo": { - "description": "Relative date - days ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateWeeksAgo": "{count} weeks ago", - "@dateWeeksAgo": { - "description": "Relative date - weeks ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateMonthsAgo": "{count} months ago", - "@dateMonthsAgo": { - "description": "Relative date - months ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "storeFilterAll": "All", - "@storeFilterAll": { - "description": "Store filter - all extensions" - }, - "storeFilterMetadata": "Metadata", - "@storeFilterMetadata": { - "description": "Store filter - metadata providers" - }, - "storeFilterDownload": "Download", - "@storeFilterDownload": { - "description": "Store filter - download providers" - }, - "storeFilterUtility": "Utility", - "@storeFilterUtility": { - "description": "Store filter - utility extensions" - }, - "storeFilterLyrics": "Lyrics", - "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" - }, - "storeFilterIntegration": "Integration", - "@storeFilterIntegration": { - "description": "Store filter - integrations" - }, - "storeClearFilters": "Clear filters", - "@storeClearFilters": { - "description": "Button to clear all filters" - }, - "storeAddRepoTitle": "Add Extension Repository", - "@storeAddRepoTitle": { - "description": "Store setup screen - heading when no repo is configured" - }, - "storeAddRepoDescription": "Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.", - "@storeAddRepoDescription": { - "description": "Store setup screen - explanatory text" - }, - "storeRepoUrlLabel": "Repository URL", - "@storeRepoUrlLabel": { - "description": "Label for the repository URL input field" - }, - "storeRepoUrlHint": "https://github.com/user/repo", - "@storeRepoUrlHint": { - "description": "Hint/placeholder for the repository URL input field" - }, - "storeAddRepoButton": "Add Repository", - "@storeAddRepoButton": { - "description": "Button to submit a new repository URL" - }, - "storeChangeRepoTooltip": "Change repository", - "@storeChangeRepoTooltip": { - "description": "Tooltip for the change-repository icon button in the app bar" - }, - "storeRepoDialogTitle": "Extension Repository", - "@storeRepoDialogTitle": { - "description": "Title of the change/remove repository dialog" - }, - "storeRepoDialogCurrent": "Current repository:", - "@storeRepoDialogCurrent": { - "description": "Label shown above the current repository URL in the dialog" - }, - "storeNewRepoUrlLabel": "New Repository URL", - "@storeNewRepoUrlLabel": { - "description": "Label for the new repository URL field inside the dialog" - }, - "storeLoadError": "Failed to load repository", - "@storeLoadError": { - "description": "Error heading when the store cannot be loaded" - }, - "storeEmptyNoExtensions": "No extensions available", - "@storeEmptyNoExtensions": { - "description": "Message when store has no extensions" - }, - "storeEmptyNoResults": "No extensions found", - "@storeEmptyNoResults": { - "description": "Message when search/filter returns no results" - }, - "extensionId": "ID", - "@extensionId": { - "description": "Extension detail - unique ID" - }, - "extensionError": "Error", - "@extensionError": { - "description": "Extension detail - error message" - }, - "extensionCapabilities": "Capabilities", - "@extensionCapabilities": { - "description": "Section header - extension features" - }, - "extensionMetadataProvider": "Metadata Provider", - "@extensionMetadataProvider": { - "description": "Capability - provides metadata" - }, - "extensionDownloadProvider": "Download Provider", - "@extensionDownloadProvider": { - "description": "Capability - provides downloads" - }, - "extensionLyricsProvider": "Lyrics Provider", - "@extensionLyricsProvider": { - "description": "Capability - provides lyrics" - }, - "extensionUrlHandler": "URL Handler", - "@extensionUrlHandler": { - "description": "Capability - handles URLs" - }, - "extensionQualityOptions": "Quality Options", - "@extensionQualityOptions": { - "description": "Capability - quality selection" - }, - "extensionPostProcessingHooks": "Post-Processing Hooks", - "@extensionPostProcessingHooks": { - "description": "Capability - post-processing" - }, - "extensionPermissions": "Permissions", - "@extensionPermissions": { - "description": "Section header - required permissions" - }, - "extensionSettings": "Settings", - "@extensionSettings": { - "description": "Section header - extension settings" - }, - "extensionRemoveButton": "Remove Extension", - "@extensionRemoveButton": { - "description": "Button to uninstall extension" - }, - "extensionUpdated": "Updated", - "@extensionUpdated": { - "description": "Extension detail - last update" - }, - "extensionMinAppVersion": "Min App Version", - "@extensionMinAppVersion": { - "description": "Extension detail - minimum app version" - }, - "extensionCustomTrackMatching": "Custom Track Matching", - "@extensionCustomTrackMatching": { - "description": "Capability - custom track matching algorithm" - }, - "extensionPostProcessing": "Post-Processing", - "@extensionPostProcessing": { - "description": "Capability - post-download processing" - }, - "extensionHooksAvailable": "{count} hook(s) available", - "@extensionHooksAvailable": { - "description": "Post-processing hooks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionPatternsCount": "{count} pattern(s)", - "@extensionPatternsCount": { - "description": "URL patterns count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionStrategy": "Strategy: {strategy}", - "@extensionStrategy": { - "description": "Track matching strategy name", - "placeholders": { - "strategy": { - "type": "String" - } - } - }, - "extensionsProviderPrioritySection": "Provider Priority", - "@extensionsProviderPrioritySection": { - "description": "Section header - provider priority" - }, - "extensionsInstalledSection": "Installed Extensions", - "@extensionsInstalledSection": { - "description": "Section header - installed extensions" - }, - "extensionsNoExtensions": "No extensions installed", - "@extensionsNoExtensions": { - "description": "Empty state - no extensions" - }, - "extensionsNoExtensionsSubtitle": "Install .spotiflac-ext files to add new providers", - "@extensionsNoExtensionsSubtitle": { - "description": "Empty state subtitle" - }, - "extensionsInstallButton": "Install Extension", - "@extensionsInstallButton": { - "description": "Button to install extension from file" - }, - "extensionsInfoTip": "Extensions can add new metadata and download providers. Only install extensions from trusted sources.", - "@extensionsInfoTip": { - "description": "Security warning about extensions" - }, - "extensionsInstalledSuccess": "Extension installed successfully", - "@extensionsInstalledSuccess": { - "description": "Success message after install" - }, - "extensionsInstalledCount": "{count} extensions installed successfully", - "@extensionsInstalledCount": { - "description": "Success message after installing multiple extensions", - "placeholders": { - "count": { - "type": "int", - "description": "Number of installed extensions" - } - } - }, - "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", - "@extensionsInstallPartialSuccess": { - "description": "Message when installing multiple extensions partially succeeds", - "placeholders": { - "installed": { - "type": "int", - "description": "Number of successfully installed extensions" - }, - "attempted": { - "type": "int", - "description": "Number of selected extensions" - } - } - }, - "extensionsDownloadPriority": "Download Priority", - "@extensionsDownloadPriority": { - "description": "Setting - download provider order" - }, - "extensionsDownloadPrioritySubtitle": "Set download service order", - "@extensionsDownloadPrioritySubtitle": { - "description": "Subtitle for download priority" - }, - "extensionsFallbackTitle": "Fallback Extensions", - "@extensionsFallbackTitle": { - "description": "Setting and page title for choosing which download extensions can be used during fallback" - }, - "extensionsFallbackSubtitle": "Choose which installed download extensions can be used as fallback", - "@extensionsFallbackSubtitle": { - "description": "Subtitle for download fallback extensions menu" - }, - "extensionsNoDownloadProvider": "No extensions with download provider", - "@extensionsNoDownloadProvider": { - "description": "Empty state - no download providers" - }, - "extensionsMetadataPriority": "Metadata Priority", - "@extensionsMetadataPriority": { - "description": "Setting - metadata provider order" - }, - "extensionsMetadataPrioritySubtitle": "Set search & metadata source order", - "@extensionsMetadataPrioritySubtitle": { - "description": "Subtitle for metadata priority" - }, - "extensionsNoMetadataProvider": "No extensions with metadata provider", - "@extensionsNoMetadataProvider": { - "description": "Empty state - no metadata providers" - }, - "extensionsSearchProvider": "Search Provider", - "@extensionsSearchProvider": { - "description": "Setting - search provider selection" - }, - "extensionsNoCustomSearch": "No extensions with custom search", - "@extensionsNoCustomSearch": { - "description": "Empty state - no search providers" - }, - "extensionsSearchProviderDescription": "Choose which service to use for searching tracks", - "@extensionsSearchProviderDescription": { - "description": "Search provider setting description" - }, - "extensionsCustomSearch": "Custom search", - "@extensionsCustomSearch": { - "description": "Label for custom search provider" - }, - "extensionsErrorLoading": "Error loading extension", - "@extensionsErrorLoading": { - "description": "Error message when extension fails to load" - }, - "qualityFlacLossless": "FLAC Lossless", - "@qualityFlacLossless": { - "description": "Quality option - CD quality FLAC" - }, - "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", - "@qualityFlacLosslessSubtitle": { - "description": "Technical spec for lossless" - }, - "qualityHiResFlac": "Hi-Res FLAC", - "@qualityHiResFlac": { - "description": "Quality option - high resolution FLAC" - }, - "qualityHiResFlacSubtitle": "24-bit / up to 96kHz", - "@qualityHiResFlacSubtitle": { - "description": "Technical spec for hi-res" - }, - "qualityHiResFlacMax": "Hi-Res FLAC Max", - "@qualityHiResFlacMax": { - "description": "Quality option - maximum resolution FLAC" - }, - "qualityHiResFlacMaxSubtitle": "24-bit / up to 192kHz", - "@qualityHiResFlacMaxSubtitle": { - "description": "Technical spec for hi-res max" - }, - "downloadLossy320": "Lossy 320kbps", - "@downloadLossy320": { - "description": "Quality option label for lossy 320kbps" - }, - "downloadLossyFormat": "Lossy Format", - "@downloadLossyFormat": { - "description": "Setting title to pick output format for lossy downloads" - }, - "downloadLossy320Format": "Lossy 320kbps Format", - "@downloadLossy320Format": { - "description": "Title of the lossy format picker bottom sheet" - }, - "downloadLossy320FormatDesc": "Choose the output format for 320kbps lossy downloads. The original stream will be converted to your selected format when needed.", - "@downloadLossy320FormatDesc": { - "description": "Description in the lossy format picker" - }, - "downloadLossyMp3": "MP3 320kbps", - "@downloadLossyMp3": { - "description": "Lossy format option - MP3 320kbps" - }, - "downloadLossyMp3Subtitle": "Best compatibility, ~10MB per track", - "@downloadLossyMp3Subtitle": { - "description": "Subtitle for MP3 320kbps lossy option" - }, - "downloadLossyAac": "AAC/M4A 320kbps", - "@downloadLossyAac": { - "description": "Lossy format option - AAC in M4A container at 320kbps" - }, - "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", - "@downloadLossyAacSubtitle": { - "description": "Subtitle for AAC/M4A 320kbps lossy option" - }, - "downloadLossyOpus256": "Opus 256kbps", - "@downloadLossyOpus256": { - "description": "Lossy format option - Opus 256kbps" - }, - "downloadLossyOpus256Subtitle": "Best quality Opus, ~8MB per track", - "@downloadLossyOpus256Subtitle": { - "description": "Subtitle for Opus 256kbps lossy option" - }, - "downloadLossyOpus128": "Opus 128kbps", - "@downloadLossyOpus128": { - "description": "Lossy format option - Opus 128kbps" - }, - "downloadLossyOpus128Subtitle": "Smallest size, ~4MB per track", - "@downloadLossyOpus128Subtitle": { - "description": "Subtitle for Opus 128kbps lossy option" - }, - "downloadAskBeforeDownload": "Ask Before Download", - "@downloadAskBeforeDownload": { - "description": "Setting - show quality picker" - }, - "downloadDirectory": "Download Directory", - "@downloadDirectory": { - "description": "Setting - download folder" - }, - "downloadSeparateSinglesFolder": "Separate Singles Folder", - "@downloadSeparateSinglesFolder": { - "description": "Setting - separate folder for singles" - }, - "downloadAlbumFolderStructure": "Album Folder Structure", - "@downloadAlbumFolderStructure": { - "description": "Setting - album folder organization" - }, - "albumFolderStructureDescription": "Choose how album folders are structured", - "@albumFolderStructureDescription": { - "description": "Album folder structure picker description" - }, - "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", - "@downloadUseAlbumArtistForFolders": { - "description": "Setting - choose whether artist folders use Album Artist or Track Artist" - }, - "downloadUsePrimaryArtistOnly": "Primary artist only for folders", - "@downloadUsePrimaryArtistOnly": { - "description": "Setting - strip featured artists from folder name" - }, - "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", - "@downloadUsePrimaryArtistOnlyEnabled": { - "description": "Subtitle when primary artist only is enabled" - }, - "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", - "@downloadUsePrimaryArtistOnlyDisabled": { - "description": "Subtitle when primary artist only is disabled" - }, - "downloadSelectQuality": "Select Quality", - "@downloadSelectQuality": { - "description": "Dialog title - choose audio quality" - }, - "downloadFrom": "Download From", - "@downloadFrom": { - "description": "Label - download source" - }, - "appearanceAmoledDark": "AMOLED Dark", - "@appearanceAmoledDark": { - "description": "Theme option - pure black" - }, - "appearanceAmoledDarkSubtitle": "Pure black background", - "@appearanceAmoledDarkSubtitle": { - "description": "Subtitle for AMOLED dark" - }, - "queueClearAll": "Clear All", - "@queueClearAll": { - "description": "Button - clear all queue items" - }, - "queueClearAllMessage": "Are you sure you want to clear all downloads?", - "@queueClearAllMessage": { - "description": "Clear queue confirmation" - }, - "settingsAutoExportFailed": "Auto-export failed downloads", - "@settingsAutoExportFailed": { - "description": "Setting toggle for auto-export" - }, - "settingsAutoExportFailedSubtitle": "Save failed downloads to TXT file automatically", - "@settingsAutoExportFailedSubtitle": { - "description": "Subtitle for auto-export setting" - }, - "settingsDownloadNetwork": "Download Network", - "@settingsDownloadNetwork": { - "description": "Setting for network type preference" - }, - "settingsDownloadNetworkAny": "WiFi + Mobile Data", - "@settingsDownloadNetworkAny": { - "description": "Network option - use any connection" - }, - "settingsDownloadNetworkWifiOnly": "WiFi Only", - "@settingsDownloadNetworkWifiOnly": { - "description": "Network option - only use WiFi" - }, - "settingsDownloadNetworkSubtitle": "Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.", - "@settingsDownloadNetworkSubtitle": { - "description": "Subtitle explaining network preference" - }, - "albumFolderArtistAlbum": "Artist / Album", - "@albumFolderArtistAlbum": { - "description": "Album folder option" - }, - "albumFolderArtistAlbumSubtitle": "Albums/Artist Name/Album Name/", - "@albumFolderArtistAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistYearAlbum": "Artist / [Year] Album", - "@albumFolderArtistYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderArtistYearAlbumSubtitle": "Albums/Artist Name/[2005] Album Name/", - "@albumFolderArtistYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderAlbumOnly": "Album Only", - "@albumFolderAlbumOnly": { - "description": "Album folder option" - }, - "albumFolderAlbumOnlySubtitle": "Albums/Album Name/", - "@albumFolderAlbumOnlySubtitle": { - "description": "Folder structure example" - }, - "albumFolderYearAlbum": "[Year] Album", - "@albumFolderYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderYearAlbumSubtitle": "Albums/[2005] Album Name/", - "@albumFolderYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistAlbumSingles": "Artist / Album + Singles", - "@albumFolderArtistAlbumSingles": { - "description": "Album folder option with singles inside artist" - }, - "albumFolderArtistAlbumSinglesSubtitle": "Artist/Album/ and Artist/Singles/", - "@albumFolderArtistAlbumSinglesSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", - "@albumFolderArtistAlbumFlat": { - "description": "Album folder option with singles directly in artist folder" - }, - "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", - "@albumFolderArtistAlbumFlatSubtitle": { - "description": "Folder structure example for flat singles" - }, - "downloadedAlbumDeleteSelected": "Delete Selected", - "@downloadedAlbumDeleteSelected": { - "description": "Button - delete selected tracks" - }, - "downloadedAlbumDeleteMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from this album?\n\nThis will also delete the files from storage.", - "@downloadedAlbumDeleteMessage": { - "description": "Delete confirmation with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectedCount": "{count} selected", - "@downloadedAlbumSelectedCount": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumTapToSelect": "Tap tracks to select", - "@downloadedAlbumTapToSelect": { - "description": "Selection hint" - }, - "downloadedAlbumDeleteCount": "Delete {count} {count, plural, =1{track} other{tracks}}", - "@downloadedAlbumDeleteCount": { - "description": "Delete button text with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectToDelete": "Select tracks to delete", - "@downloadedAlbumSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "downloadedAlbumDiscHeader": "Disc {discNumber}", - "@downloadedAlbumDiscHeader": { - "description": "Header for disc separator in multi-disc albums", - "placeholders": { - "discNumber": { - "type": "int", - "example": "1" - } - } - }, - "recentTypeArtist": "Artist", - "@recentTypeArtist": { - "description": "Recent access item type - artist" - }, - "recentTypeAlbum": "Album", - "@recentTypeAlbum": { - "description": "Recent access item type - album" - }, - "recentTypeSong": "Song", - "@recentTypeSong": { - "description": "Recent access item type - song/track" - }, - "recentTypePlaylist": "Playlist", - "@recentTypePlaylist": { - "description": "Recent access item type - playlist" - }, - "recentEmpty": "No recent items yet", - "@recentEmpty": { - "description": "Empty state text for recent access list" - }, - "recentShowAllDownloads": "Show All Downloads", - "@recentShowAllDownloads": { - "description": "Button label to unhide hidden downloads in recent access" - }, - "recentPlaylistInfo": "Playlist: {name}", - "@recentPlaylistInfo": { - "description": "Snackbar message when tapping playlist in recent access", - "placeholders": { - "name": { - "type": "String", - "description": "Playlist name" - } - } - }, - "discographyDownload": "Download Discography", - "@discographyDownload": { - "description": "Button - download artist discography" - }, - "discographyDownloadAll": "Download All", - "@discographyDownloadAll": { - "description": "Option - download entire discography" - }, - "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", - "@discographyDownloadAllSubtitle": { - "description": "Subtitle showing total tracks and albums", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographyAlbumsOnly": "Albums Only", - "@discographyAlbumsOnly": { - "description": "Option - download only albums" - }, - "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", - "@discographyAlbumsOnlySubtitle": { - "description": "Subtitle showing album tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySinglesOnly": "Singles & EPs Only", - "@discographySinglesOnly": { - "description": "Option - download only singles" - }, - "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", - "@discographySinglesOnlySubtitle": { - "description": "Subtitle showing singles tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySelectAlbums": "Select Albums...", - "@discographySelectAlbums": { - "description": "Option - manually select albums to download" - }, - "discographySelectAlbumsSubtitle": "Choose specific albums or singles", - "@discographySelectAlbumsSubtitle": { - "description": "Subtitle for select albums option" - }, - "discographyFetchingTracks": "Fetching tracks...", - "@discographyFetchingTracks": { - "description": "Progress - fetching album tracks" - }, - "discographyFetchingAlbum": "Fetching {current} of {total}...", - "@discographyFetchingAlbum": { - "description": "Progress - fetching specific album", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "discographySelectedCount": "{count} selected", - "@discographySelectedCount": { - "description": "Selection count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographyDownloadSelected": "Download Selected", - "@discographyDownloadSelected": { - "description": "Button - download selected albums" - }, - "discographyAddedToQueue": "Added {count} tracks to queue", - "@discographyAddedToQueue": { - "description": "Snackbar - tracks added from discography", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", - "@discographySkippedDownloaded": { - "description": "Snackbar - with skipped tracks count", - "placeholders": { - "added": { - "type": "int" - }, - "skipped": { - "type": "int" - } - } - }, - "discographyNoAlbums": "No albums available", - "@discographyNoAlbums": { - "description": "Error - no albums found for artist" - }, - "discographyFailedToFetch": "Failed to fetch some albums", - "@discographyFailedToFetch": { - "description": "Error - some albums failed to load" - }, - "sectionStorageAccess": "Storage Access", - "@sectionStorageAccess": { - "description": "Section header for storage access settings" - }, - "allFilesAccess": "All Files Access", - "@allFilesAccess": { - "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" - }, - "allFilesAccessEnabledSubtitle": "Can write to any folder", - "@allFilesAccessEnabledSubtitle": { - "description": "Subtitle when all files access is enabled" - }, - "allFilesAccessDisabledSubtitle": "Limited to media folders only", - "@allFilesAccessDisabledSubtitle": { - "description": "Subtitle when all files access is disabled" - }, - "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", - "@allFilesAccessDescription": { - "description": "Description explaining when to enable all files access" - }, - "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", - "@allFilesAccessDeniedMessage": { - "description": "Message when permission is permanently denied" - }, - "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", - "@allFilesAccessDisabledMessage": { - "description": "Snackbar message when user disables all files access" - }, - "settingsLocalLibrary": "Local Library", - "@settingsLocalLibrary": { - "description": "Settings menu item - local library" - }, - "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", - "@settingsLocalLibrarySubtitle": { - "description": "Subtitle for local library settings" - }, - "settingsCache": "Storage & Cache", - "@settingsCache": { - "description": "Settings menu item - cache management" - }, - "settingsCacheSubtitle": "View size and clear cached data", - "@settingsCacheSubtitle": { - "description": "Subtitle for cache management menu" - }, - "libraryTitle": "Local Library", - "@libraryTitle": { - "description": "Library settings page title" - }, - "libraryScanSettings": "Scan Settings", - "@libraryScanSettings": { - "description": "Section header for scan settings" - }, - "libraryEnableLocalLibrary": "Enable Local Library", - "@libraryEnableLocalLibrary": { - "description": "Toggle to enable library scanning" - }, - "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", - "@libraryEnableLocalLibrarySubtitle": { - "description": "Subtitle for enable toggle" - }, - "libraryFolder": "Library Folder", - "@libraryFolder": { - "description": "Folder selection setting" - }, - "libraryFolderHint": "Tap to select folder", - "@libraryFolderHint": { - "description": "Placeholder when no folder selected" - }, - "libraryShowDuplicateIndicator": "Show Duplicate Indicator", - "@libraryShowDuplicateIndicator": { - "description": "Toggle for duplicate indicator in search" - }, - "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", - "@libraryShowDuplicateIndicatorSubtitle": { - "description": "Subtitle for duplicate indicator toggle" - }, - "libraryAutoScan": "Auto Scan", - "@libraryAutoScan": { - "description": "Setting for automatic library scanning" - }, - "libraryAutoScanSubtitle": "Automatically scan your library for new files", - "@libraryAutoScanSubtitle": { - "description": "Subtitle for auto scan setting" - }, - "libraryAutoScanOff": "Off", - "@libraryAutoScanOff": { - "description": "Auto scan disabled" - }, - "libraryAutoScanOnOpen": "Every app open", - "@libraryAutoScanOnOpen": { - "description": "Auto scan when app opens" - }, - "libraryAutoScanDaily": "Daily", - "@libraryAutoScanDaily": { - "description": "Auto scan once per day" - }, - "libraryAutoScanWeekly": "Weekly", - "@libraryAutoScanWeekly": { - "description": "Auto scan once per week" - }, - "libraryActions": "Actions", - "@libraryActions": { - "description": "Section header for library actions" - }, - "libraryScan": "Scan Library", - "@libraryScan": { - "description": "Button to start library scan" - }, - "libraryScanSubtitle": "Scan for audio files", - "@libraryScanSubtitle": { - "description": "Subtitle for scan button" - }, - "libraryScanSelectFolderFirst": "Select a folder first", - "@libraryScanSelectFolderFirst": { - "description": "Message when trying to scan without folder" - }, - "libraryCleanupMissingFiles": "Cleanup Missing Files", - "@libraryCleanupMissingFiles": { - "description": "Button to remove entries for missing files" - }, - "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", - "@libraryCleanupMissingFilesSubtitle": { - "description": "Subtitle for cleanup button" - }, - "libraryClear": "Clear Library", - "@libraryClear": { - "description": "Button to clear all library entries" - }, - "libraryClearSubtitle": "Remove all scanned tracks", - "@libraryClearSubtitle": { - "description": "Subtitle for clear button" - }, - "libraryClearConfirmTitle": "Clear Library", - "@libraryClearConfirmTitle": { - "description": "Dialog title for clear confirmation" - }, - "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", - "@libraryClearConfirmMessage": { - "description": "Dialog message for clear confirmation" - }, - "libraryAbout": "About Local Library", - "@libraryAbout": { - "description": "Section header for about info" - }, - "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", - "@libraryAboutDescription": { - "description": "Description of local library feature" - }, - "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", - "@libraryTracksUnit": { - "description": "Unit label for tracks count (without the number itself)", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryFilesUnit": "{count, plural, =1{file} other{files}}", - "@libraryFilesUnit": { - "description": "Unit label for files count during library scanning", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryLastScanned": "Last scanned: {time}", - "@libraryLastScanned": { - "description": "Last scan time display", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "libraryLastScannedNever": "Never", - "@libraryLastScannedNever": { - "description": "Shown when library has never been scanned" - }, - "libraryScanning": "Scanning...", - "@libraryScanning": { - "description": "Status during scan" - }, - "libraryScanFinalizing": "Finalizing library...", - "@libraryScanFinalizing": { - "description": "Status shown after file scanning finishes but library persistence is still running" - }, - "libraryScanProgress": "{progress}% of {total} files", - "@libraryScanProgress": { - "description": "Scan progress display", - "placeholders": { - "progress": { - "type": "String" - }, - "total": { - "type": "int" - } - } - }, - "libraryInLibrary": "In Library", - "@libraryInLibrary": { - "description": "Badge shown on tracks that exist in local library" - }, - "libraryRemovedMissingFiles": "Removed {count} missing files from library", - "@libraryRemovedMissingFiles": { - "description": "Snackbar after cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryCleared": "Library cleared", - "@libraryCleared": { - "description": "Snackbar after clearing library" - }, - "libraryStorageAccessRequired": "Storage Access Required", - "@libraryStorageAccessRequired": { - "description": "Dialog title for storage permission" - }, - "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", - "@libraryStorageAccessMessage": { - "description": "Dialog message for storage permission" - }, - "libraryFolderNotExist": "Selected folder does not exist", - "@libraryFolderNotExist": { - "description": "Error when folder doesn't exist" - }, - "librarySourceDownloaded": "Downloaded", - "@librarySourceDownloaded": { - "description": "Badge for tracks downloaded via SpotiFLAC" - }, - "librarySourceLocal": "Local", - "@librarySourceLocal": { - "description": "Badge for tracks from local library scan" - }, - "libraryFilterAll": "All", - "@libraryFilterAll": { - "description": "Filter chip - show all library items" - }, - "libraryFilterDownloaded": "Downloaded", - "@libraryFilterDownloaded": { - "description": "Filter chip - show only downloaded items" - }, - "libraryFilterLocal": "Local", - "@libraryFilterLocal": { - "description": "Filter chip - show only local library items" - }, - "libraryFilterTitle": "Filters", - "@libraryFilterTitle": { - "description": "Filter bottom sheet title" - }, - "libraryFilterReset": "Reset", - "@libraryFilterReset": { - "description": "Reset all filters button" - }, - "libraryFilterApply": "Apply", - "@libraryFilterApply": { - "description": "Apply filters button" - }, - "libraryFilterSource": "Source", - "@libraryFilterSource": { - "description": "Filter section - source type" - }, - "libraryFilterQuality": "Quality", - "@libraryFilterQuality": { - "description": "Filter section - audio quality" - }, - "libraryFilterQualityHiRes": "Hi-Res (24bit)", - "@libraryFilterQualityHiRes": { - "description": "Filter option - high resolution audio" - }, - "libraryFilterQualityCD": "CD (16bit)", - "@libraryFilterQualityCD": { - "description": "Filter option - CD quality audio" - }, - "libraryFilterQualityLossy": "Lossy", - "@libraryFilterQualityLossy": { - "description": "Filter option - lossy compressed audio" - }, - "libraryFilterFormat": "Format", - "@libraryFilterFormat": { - "description": "Filter section - file format" - }, - "libraryFilterMetadata": "Metadata", - "@libraryFilterMetadata": { - "description": "Filter section - metadata completeness" - }, - "libraryFilterMetadataComplete": "Complete metadata", - "@libraryFilterMetadataComplete": { - "description": "Filter option - items with complete metadata" - }, - "libraryFilterMetadataMissingAny": "Missing any metadata", - "@libraryFilterMetadataMissingAny": { - "description": "Filter option - items missing any tracked metadata field" - }, - "libraryFilterMetadataMissingYear": "Missing year", - "@libraryFilterMetadataMissingYear": { - "description": "Filter option - items missing release year/date" - }, - "libraryFilterMetadataMissingGenre": "Missing genre", - "@libraryFilterMetadataMissingGenre": { - "description": "Filter option - items missing genre" - }, - "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", - "@libraryFilterMetadataMissingAlbumArtist": { - "description": "Filter option - items missing album artist" - }, - "libraryFilterSort": "Sort", - "@libraryFilterSort": { - "description": "Filter section - sort order" - }, - "libraryFilterSortLatest": "Latest", - "@libraryFilterSortLatest": { - "description": "Sort option - newest first" - }, - "libraryFilterSortOldest": "Oldest", - "@libraryFilterSortOldest": { - "description": "Sort option - oldest first" - }, - "libraryFilterSortAlbumAsc": "Album (A-Z)", - "@libraryFilterSortAlbumAsc": { - "description": "Sort option - album ascending" - }, - "libraryFilterSortAlbumDesc": "Album (Z-A)", - "@libraryFilterSortAlbumDesc": { - "description": "Sort option - album descending" - }, - "libraryFilterSortGenreAsc": "Genre (A-Z)", - "@libraryFilterSortGenreAsc": { - "description": "Sort option - genre ascending" - }, - "libraryFilterSortGenreDesc": "Genre (Z-A)", - "@libraryFilterSortGenreDesc": { - "description": "Sort option - genre descending" - }, - "timeJustNow": "Just now", - "@timeJustNow": { - "description": "Relative time - less than a minute ago" - }, - "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", - "@timeMinutesAgo": { - "description": "Relative time - minutes ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", - "@timeHoursAgo": { - "description": "Relative time - hours ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC!", - "@tutorialWelcomeTitle": { - "description": "Tutorial welcome page title" - }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", - "@tutorialWelcomeDesc": { - "description": "Tutorial welcome page description" - }, - "tutorialWelcomeTip1": "Download music from Spotify, Deezer, or paste any supported URL", - "@tutorialWelcomeTip1": { - "description": "Tutorial welcome tip 1" - }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", - "@tutorialWelcomeTip2": { - "description": "Tutorial welcome tip 2" - }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", - "@tutorialWelcomeTip3": { - "description": "Tutorial welcome tip 3" - }, - "tutorialSearchTitle": "Finding Music", - "@tutorialSearchTitle": { - "description": "Tutorial search page title" - }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", - "@tutorialSearchDesc": { - "description": "Tutorial search page description" - }, - "tutorialDownloadTitle": "Downloading Music", - "@tutorialDownloadTitle": { - "description": "Tutorial download page title" - }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", - "@tutorialDownloadDesc": { - "description": "Tutorial download page description" - }, - "tutorialLibraryTitle": "Your Library", - "@tutorialLibraryTitle": { - "description": "Tutorial library page title" - }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", - "@tutorialLibraryDesc": { - "description": "Tutorial library page description" - }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", - "@tutorialLibraryTip1": { - "description": "Tutorial library tip 1" - }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", - "@tutorialLibraryTip2": { - "description": "Tutorial library tip 2" - }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", - "@tutorialLibraryTip3": { - "description": "Tutorial library tip 3" - }, - "tutorialExtensionsTitle": "Extensions", - "@tutorialExtensionsTitle": { - "description": "Tutorial extensions page title" - }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", - "@tutorialExtensionsDesc": { - "description": "Tutorial extensions page description" - }, - "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", - "@tutorialExtensionsTip1": { - "description": "Tutorial extensions tip 1" - }, - "tutorialExtensionsTip2": "Add new download providers or search sources", - "@tutorialExtensionsTip2": { - "description": "Tutorial extensions tip 2" - }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", - "@tutorialExtensionsTip3": { - "description": "Tutorial extensions tip 3" - }, - "tutorialSettingsTitle": "Customize Your Experience", - "@tutorialSettingsTitle": { - "description": "Tutorial settings page title" - }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", - "@tutorialSettingsDesc": { - "description": "Tutorial settings page description" - }, - "tutorialSettingsTip1": "Change download location and folder organization", - "@tutorialSettingsTip1": { - "description": "Tutorial settings tip 1" - }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", - "@tutorialSettingsTip2": { - "description": "Tutorial settings tip 2" - }, - "tutorialSettingsTip3": "Customize app theme and appearance", - "@tutorialSettingsTip3": { - "description": "Tutorial settings tip 3" - }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", - "@tutorialReadyMessage": { - "description": "Tutorial completion message" - }, - "libraryForceFullScan": "Force Full Scan", - "@libraryForceFullScan": { - "description": "Button to force a complete rescan of library" - }, - "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", - "@libraryForceFullScanSubtitle": { - "description": "Subtitle for force full scan button" - }, - "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", - "@cleanupOrphanedDownloads": { - "description": "Button to remove history entries for deleted files" - }, - "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", - "@cleanupOrphanedDownloadsSubtitle": { - "description": "Subtitle for orphaned cleanup button" - }, - "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", - "@cleanupOrphanedDownloadsResult": { - "description": "Snackbar after orphan cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cleanupOrphanedDownloadsNone": "No orphaned entries found", - "@cleanupOrphanedDownloadsNone": { - "description": "Snackbar when no orphans found" - }, - "cacheTitle": "Storage & Cache", - "@cacheTitle": { - "description": "Cache management page title" - }, - "cacheSummaryTitle": "Cache overview", - "@cacheSummaryTitle": { - "description": "Heading for cache summary card" - }, - "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", - "@cacheSummarySubtitle": { - "description": "Helper text for cache summary card" - }, - "cacheEstimatedTotal": "Estimated cache usage: {size}", - "@cacheEstimatedTotal": { - "description": "Total cache size shown in summary", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheSectionStorage": "Cached Data", - "@cacheSectionStorage": { - "description": "Section header for cache entries" - }, - "cacheSectionMaintenance": "Maintenance", - "@cacheSectionMaintenance": { - "description": "Section header for cleanup actions" - }, - "cacheAppDirectory": "App cache directory", - "@cacheAppDirectory": { - "description": "Cache item title for app cache directory" - }, - "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", - "@cacheAppDirectoryDesc": { - "description": "Description of what app cache directory contains" - }, - "cacheTempDirectory": "Temporary directory", - "@cacheTempDirectory": { - "description": "Cache item title for temporary files directory" - }, - "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", - "@cacheTempDirectoryDesc": { - "description": "Description of what temporary directory contains" - }, - "cacheCoverImage": "Cover image cache", - "@cacheCoverImage": { - "description": "Cache item title for persistent cover images" - }, - "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", - "@cacheCoverImageDesc": { - "description": "Description of what cover image cache contains" - }, - "cacheLibraryCover": "Library cover cache", - "@cacheLibraryCover": { - "description": "Cache item title for local library cover art images" - }, - "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", - "@cacheLibraryCoverDesc": { - "description": "Description of what library cover cache contains" - }, - "cacheExploreFeed": "Explore feed cache", - "@cacheExploreFeed": { - "description": "Cache item title for explore home feed cache" - }, - "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", - "@cacheExploreFeedDesc": { - "description": "Description of what explore feed cache contains" - }, - "cacheTrackLookup": "Track lookup cache", - "@cacheTrackLookup": { - "description": "Cache item title for track ID lookup cache" - }, - "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", - "@cacheTrackLookupDesc": { - "description": "Description of what track lookup cache contains" - }, - "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", - "@cacheCleanupUnusedDesc": { - "description": "Description of what cleanup unused data does" - }, - "cacheNoData": "No cached data", - "@cacheNoData": { - "description": "Label when cache category has no data" - }, - "cacheSizeWithFiles": "{size} in {count} files", - "@cacheSizeWithFiles": { - "description": "Cache size and file count", - "placeholders": { - "size": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "cacheSizeOnly": "{size}", - "@cacheSizeOnly": { - "description": "Cache size only", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheEntries": "{count} entries", - "@cacheEntries": { - "description": "Track cache entry count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cacheClearSuccess": "Cleared: {target}", - "@cacheClearSuccess": { - "description": "Snackbar after clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearConfirmTitle": "Clear cache?", - "@cacheClearConfirmTitle": { - "description": "Dialog title before clearing one cache category" - }, - "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", - "@cacheClearConfirmMessage": { - "description": "Dialog message before clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearAllConfirmTitle": "Clear all cache?", - "@cacheClearAllConfirmTitle": { - "description": "Dialog title before clearing all caches" - }, - "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", - "@cacheClearAllConfirmMessage": { - "description": "Dialog message before clearing all caches" - }, - "cacheClearAll": "Clear all cache", - "@cacheClearAll": { - "description": "Button label to clear all caches" - }, - "cacheCleanupUnused": "Cleanup unused data", - "@cacheCleanupUnused": { - "description": "Action title for cleaning unused entries" - }, - "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", - "@cacheCleanupUnusedSubtitle": { - "description": "Subtitle for cleanup unused data action" - }, - "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", - "@cacheCleanupResult": { - "description": "Snackbar after unused data cleanup", - "placeholders": { - "downloadCount": { - "type": "int" - }, - "libraryCount": { - "type": "int" - } - } - }, - "cacheRefreshStats": "Refresh stats", - "@cacheRefreshStats": { - "description": "Button label to refresh cache statistics" - }, - "trackSaveCoverArt": "Save Cover Art", - "@trackSaveCoverArt": { - "description": "Menu action - save album cover art as file" - }, - "trackSaveLyrics": "Save Lyrics (.lrc)", - "@trackSaveLyrics": { - "description": "Menu action - save lyrics as .lrc file" - }, - "trackSaveLyricsProgress": "Saving lyrics...", - "@trackSaveLyricsProgress": { - "description": "Snackbar while saving lyrics to file" - }, - "trackReEnrich": "Re-enrich", - "@trackReEnrich": { - "description": "Menu action - re-embed metadata into audio file" - }, - "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", - "@trackReEnrichOnlineSubtitle": { - "description": "Subtitle for re-enrich metadata action for local items" - }, - "trackReEnrichFieldCover": "Cover Art", - "@trackReEnrichFieldCover": { - "description": "Checkbox label for cover art field in re-enrich" - }, - "trackReEnrichFieldLyrics": "Lyrics", - "@trackReEnrichFieldLyrics": { - "description": "Checkbox label for lyrics field in re-enrich" - }, - "trackReEnrichFieldBasicTags": "Album, Album Artist", - "@trackReEnrichFieldBasicTags": { - "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" - }, - "trackReEnrichFieldTrackInfo": "Track & Disc Number", - "@trackReEnrichFieldTrackInfo": { - "description": "Checkbox label for track info in re-enrich" - }, - "trackReEnrichFieldReleaseInfo": "Date & ISRC", - "@trackReEnrichFieldReleaseInfo": { - "description": "Checkbox label for release info in re-enrich" - }, - "trackReEnrichFieldExtra": "Genre, Label, Copyright", - "@trackReEnrichFieldExtra": { - "description": "Checkbox label for extra metadata in re-enrich" - }, - "trackReEnrichSelectAll": "Select All", - "@trackReEnrichSelectAll": { - "description": "Select all fields checkbox in re-enrich" - }, - "trackEditMetadata": "Edit Metadata", - "@trackEditMetadata": { - "description": "Menu action - edit embedded metadata" - }, - "trackCoverSaved": "Cover art saved to {fileName}", - "@trackCoverSaved": { - "description": "Snackbar after cover art saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackCoverNoSource": "No cover art source available", - "@trackCoverNoSource": { - "description": "Snackbar when no cover art URL or embedded cover" - }, - "trackLyricsSaved": "Lyrics saved to {fileName}", - "@trackLyricsSaved": { - "description": "Snackbar after lyrics saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackReEnrichProgress": "Re-enriching metadata...", - "@trackReEnrichProgress": { - "description": "Snackbar while re-enriching metadata" - }, - "trackReEnrichSearching": "Searching metadata online...", - "@trackReEnrichSearching": { - "description": "Snackbar while searching metadata from internet for local items" - }, - "trackReEnrichSuccess": "Metadata re-enriched successfully", - "@trackReEnrichSuccess": { - "description": "Snackbar after successful re-enrichment" - }, - "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", - "@trackReEnrichFfmpegFailed": { - "description": "Snackbar when FFmpeg embed fails for MP3/Opus" - }, - "queueFlacAction": "Queue FLAC", - "@queueFlacAction": { - "description": "Action/button label for queueing FLAC redownloads for local tracks" - }, - "queueFlacConfirmMessage": "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", - "@queueFlacConfirmMessage": { - "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueFlacNoReliableMatches": "No reliable online matches found for the selection", - "@queueFlacNoReliableMatches": { - "description": "Snackbar when no safe FLAC redownload matches were found" - }, - "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", - "@queueFlacQueuedWithSkipped": { - "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", - "placeholders": { - "addedCount": { - "type": "int" - }, - "skippedCount": { - "type": "int" - } - } - }, - "trackSaveFailed": "Failed: {error}", - "@trackSaveFailed": { - "description": "Snackbar when save operation fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "trackConvertFormat": "Convert Format", - "@trackConvertFormat": { - "description": "Menu item - convert audio format" - }, - "trackConvertTitle": "Convert Audio", - "@trackConvertTitle": { - "description": "Title of convert bottom sheet" - }, - "trackConvertTargetFormat": "Target Format", - "@trackConvertTargetFormat": { - "description": "Label for format selection" - }, - "trackConvertBitrate": "Bitrate", - "@trackConvertBitrate": { - "description": "Label for bitrate selection" - }, - "trackConvertConfirmTitle": "Confirm Conversion", - "@trackConvertConfirmTitle": { - "description": "Confirmation dialog title" - }, - "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", - "@trackConvertConfirmMessage": { - "description": "Confirmation dialog message", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", - "@trackConvertConfirmMessageLossless": { - "description": "Confirmation dialog message for lossless-to-lossless conversion", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - } - } - }, - "trackConvertLosslessHint": "Lossless conversion — no quality loss", - "@trackConvertLosslessHint": { - "description": "Hint shown when converting between lossless formats" - }, - "trackConvertConverting": "Converting audio...", - "@trackConvertConverting": { - "description": "Snackbar while converting" - }, - "trackConvertSuccess": "Converted to {format} successfully", - "@trackConvertSuccess": { - "description": "Snackbar after successful conversion", - "placeholders": { - "format": { - "type": "String" - } - } - }, - "trackConvertFailed": "Conversion failed", - "@trackConvertFailed": { - "description": "Snackbar when conversion fails" - }, - "cueSplitTitle": "Split CUE Sheet", - "@cueSplitTitle": { - "description": "Title for CUE split bottom sheet" - }, - "cueSplitAlbum": "Album: {album}", - "@cueSplitAlbum": { - "description": "Album name in CUE split sheet", - "placeholders": { - "album": { - "type": "String" - } - } - }, - "cueSplitArtist": "Artist: {artist}", - "@cueSplitArtist": { - "description": "Artist name in CUE split sheet", - "placeholders": { - "artist": { - "type": "String" - } - } - }, - "cueSplitTrackCount": "{count} tracks", - "@cueSplitTrackCount": { - "description": "Number of tracks in CUE sheet", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cueSplitConfirmTitle": "Split CUE Album", - "@cueSplitConfirmTitle": { - "description": "CUE split confirmation dialog title" - }, - "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", - "@cueSplitConfirmMessage": { - "description": "CUE split confirmation dialog message", - "placeholders": { - "album": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", - "@cueSplitSplitting": { - "description": "Snackbar while splitting CUE", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "cueSplitSuccess": "Split into {count} tracks successfully", - "@cueSplitSuccess": { - "description": "Snackbar after successful CUE split", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cueSplitFailed": "CUE split failed", - "@cueSplitFailed": { - "description": "Snackbar when CUE split fails" - }, - "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", - "@cueSplitNoAudioFile": { - "description": "Error when CUE audio file is missing" - }, - "cueSplitButton": "Split into Tracks", - "@cueSplitButton": { - "description": "Button text to start CUE splitting" - }, - "actionCreate": "Create", - "@actionCreate": { - "description": "Generic action button - create" - }, - "collectionFoldersTitle": "My folders", - "@collectionFoldersTitle": { - "description": "Library section title for custom folders" - }, - "collectionWishlist": "Wishlist", - "@collectionWishlist": { - "description": "Custom folder for saved tracks to download later" - }, - "collectionLoved": "Loved", - "@collectionLoved": { - "description": "Custom folder for favorite tracks" - }, - "collectionFavoriteArtists": "Favorite Artists", - "@collectionFavoriteArtists": { - "description": "Custom folder for favorite artists" - }, - "collectionPlaylist": "Playlist", - "@collectionPlaylist": { - "description": "Single playlist label" - }, - "collectionAddToPlaylist": "Add to playlist", - "@collectionAddToPlaylist": { - "description": "Action to add a track to user playlist" - }, - "collectionCreatePlaylist": "Create playlist", - "@collectionCreatePlaylist": { - "description": "Action to create a new playlist" - }, - "collectionNoPlaylistsYet": "No playlists yet", - "@collectionNoPlaylistsYet": { - "description": "Empty state title when user has no playlists" - }, - "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", - "@collectionPlaylistTracks": { - "description": "Track count label for custom playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", - "@collectionArtistCount": { - "description": "Artist count label for favorite artists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionAddedToPlaylist": "Added to \"{playlistName}\"", - "@collectionAddedToPlaylist": { - "description": "Snackbar after adding track to playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", - "@collectionAlreadyInPlaylist": { - "description": "Snackbar when track already exists in playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistNameHint": "Playlist name", - "@collectionPlaylistNameHint": { - "description": "Hint text for playlist name input" - }, - "collectionPlaylistNameRequired": "Playlist name is required", - "@collectionPlaylistNameRequired": { - "description": "Validation error for empty playlist name" - }, - "collectionRenamePlaylist": "Rename playlist", - "@collectionRenamePlaylist": { - "description": "Action to rename playlist" - }, - "collectionDeletePlaylist": "Delete playlist", - "@collectionDeletePlaylist": { - "description": "Action to delete playlist" - }, - "collectionPlaylistRenamed": "Playlist renamed", - "@collectionPlaylistRenamed": { - "description": "Snackbar after renaming playlist" - }, - "collectionWishlistEmptyTitle": "Wishlist is empty", - "@collectionWishlistEmptyTitle": { - "description": "Wishlist empty state title" - }, - "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", - "@collectionWishlistEmptySubtitle": { - "description": "Wishlist empty state subtitle" - }, - "collectionLovedEmptyTitle": "Loved folder is empty", - "@collectionLovedEmptyTitle": { - "description": "Loved empty state title" - }, - "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", - "@collectionLovedEmptySubtitle": { - "description": "Loved empty state subtitle" - }, - "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", - "@collectionFavoriteArtistsEmptyTitle": { - "description": "Favorite artists empty state title" - }, - "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", - "@collectionFavoriteArtistsEmptySubtitle": { - "description": "Favorite artists empty state subtitle" - }, - "collectionPlaylistEmptyTitle": "Playlist is empty", - "@collectionPlaylistEmptyTitle": { - "description": "Playlist empty state title" - }, - "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", - "@collectionPlaylistEmptySubtitle": { - "description": "Playlist empty state subtitle" - }, - "collectionRemoveFromPlaylist": "Remove from playlist", - "@collectionRemoveFromPlaylist": { - "description": "Tooltip for removing track from playlist" - }, - "collectionRemoveFromFolder": "Remove from folder", - "@collectionRemoveFromFolder": { - "description": "Tooltip for removing track from wishlist/loved folder" - }, - "collectionAddedToLoved": "\"{trackName}\" added to Loved", - "@collectionAddedToLoved": { - "description": "Snackbar after adding track to loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", - "@collectionRemovedFromLoved": { - "description": "Snackbar after removing track from loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", - "@collectionAddedToWishlist": { - "description": "Snackbar after adding track to wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", - "@collectionRemovedFromWishlist": { - "description": "Snackbar after removing track from wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", - "@collectionAddedToFavoriteArtists": { - "description": "Snackbar after adding artist to favorite artists", - "placeholders": { - "artistName": { - "type": "String" - } - } - }, - "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", - "@collectionRemovedFromFavoriteArtists": { - "description": "Snackbar after removing artist from favorite artists", - "placeholders": { - "artistName": { - "type": "String" - } - } - }, - "trackOptionAddToLoved": "Add to Loved", - "@trackOptionAddToLoved": { - "description": "Bottom sheet action label - add track to loved folder" - }, - "trackOptionRemoveFromLoved": "Remove from Loved", - "@trackOptionRemoveFromLoved": { - "description": "Bottom sheet action label - remove track from loved folder" - }, - "trackOptionAddToWishlist": "Add to Wishlist", - "@trackOptionAddToWishlist": { - "description": "Bottom sheet action label - add track to wishlist" - }, - "trackOptionRemoveFromWishlist": "Remove from Wishlist", - "@trackOptionRemoveFromWishlist": { - "description": "Bottom sheet action label - remove track from wishlist" - }, - "artistOptionAddToFavorites": "Add to Favorite Artists", - "@artistOptionAddToFavorites": { - "description": "Action label - add artist to favorite artists" - }, - "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", - "@artistOptionRemoveFromFavorites": { - "description": "Action label - remove artist from favorite artists" - }, - "collectionPlaylistChangeCover": "Change cover image", - "@collectionPlaylistChangeCover": { - "description": "Bottom sheet action to pick a custom cover image for a playlist" - }, - "collectionPlaylistRemoveCover": "Remove cover image", - "@collectionPlaylistRemoveCover": { - "description": "Bottom sheet action to remove custom cover image from a playlist" - }, - "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", - "@selectionShareCount": { - "description": "Share button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionShareNoFiles": "No shareable files found", - "@selectionShareNoFiles": { - "description": "Snackbar when no selected files exist on disk" - }, - "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", - "@selectionConvertCount": { - "description": "Convert button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionConvertNoConvertible": "No convertible tracks selected", - "@selectionConvertNoConvertible": { - "description": "Snackbar when no selected tracks support conversion" - }, - "selectionBatchConvertConfirmTitle": "Batch Convert", - "@selectionBatchConvertConfirmTitle": { - "description": "Confirmation dialog title for batch conversion" - }, - "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessage": { - "description": "Confirmation dialog message for batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessageLossless": { - "description": "Confirmation dialog message for lossless batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", - "@selectionBatchConvertSuccess": { - "description": "Snackbar after batch conversion completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "downloadedAlbumDownloadedCount": "{count} downloaded", - "@downloadedAlbumDownloadedCount": { - "description": "Downloaded tracks count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", - "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { - "description": "Subtitle when album artist is used for folder names" - }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", - "@downloadUseAlbumArtistForFoldersTrackSubtitle": { - "description": "Subtitle when track artist is used for folder names" - }, - "lyricsProvidersTitle": "Lyrics Provider Priority", - "@lyricsProvidersTitle": { - "description": "Settings item title for lyrics provider order" - }, - "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", - "@lyricsProvidersDescription": { - "description": "Description on the lyrics provider priority page" - }, - "lyricsProvidersInfoText": "Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.", - "@lyricsProvidersInfoText": { - "description": "Info tip on lyrics provider priority page" - }, - "lyricsProvidersEnabledSection": "Enabled ({count})", - "@lyricsProvidersEnabledSection": { - "description": "Section header for enabled providers", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "lyricsProvidersDisabledSection": "Disabled ({count})", - "@lyricsProvidersDisabledSection": { - "description": "Section header for disabled providers", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", - "@lyricsProvidersAtLeastOne": { - "description": "Snackbar when user tries to disable the last enabled provider" - }, - "lyricsProvidersSaved": "Lyrics provider priority saved", - "@lyricsProvidersSaved": { - "description": "Snackbar after saving lyrics provider priority" - }, - "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", - "@lyricsProvidersDiscardContent": { - "description": "Body text of the discard-changes dialog on lyrics provider page" - }, - "lyricsProviderLrclibDesc": "Open-source synced lyrics database", - "@lyricsProviderLrclibDesc": { - "description": "Description for LRCLIB provider" - }, - "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", - "@lyricsProviderNeteaseDesc": { - "description": "Description for Netease provider" - }, - "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", - "@lyricsProviderMusixmatchDesc": { - "description": "Description for Musixmatch provider" - }, - "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", - "@lyricsProviderAppleMusicDesc": { - "description": "Description for Apple Music provider" - }, - "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", - "@lyricsProviderQqMusicDesc": { - "description": "Description for QQ Music provider" - }, - "lyricsProviderLyricsPlusDesc": "Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)", - "@lyricsProviderLyricsPlusDesc": { - "description": "Description for LyricsPlus provider" - }, - "lyricsProviderExtensionDesc": "Extension provider", - "@lyricsProviderExtensionDesc": { - "description": "Generic description for extension-based lyrics providers" - }, - "safMigrationTitle": "Storage Update Required", - "@safMigrationTitle": { - "description": "Title of SAF migration dialog" - }, - "safMigrationMessage1": "SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.", - "@safMigrationMessage1": { - "description": "First paragraph of SAF migration dialog" - }, - "safMigrationMessage2": "Please select your download folder again to switch to the new storage system.", - "@safMigrationMessage2": { - "description": "Second paragraph of SAF migration dialog" - }, - "safMigrationSuccess": "Download folder updated to SAF mode", - "@safMigrationSuccess": { - "description": "Snackbar after successfully migrating to SAF" - }, - "settingsDonate": "Support Development", - "@settingsDonate": { - "description": "Settings menu item - donate page" - }, - "settingsDonateSubtitle": "Buy the developer a coffee", - "@settingsDonateSubtitle": { - "description": "Subtitle for donate menu item" - }, - "settingsBackup": "Backup & Restore", - "@settingsBackup": { - "description": "Settings menu item - backup and restore page" - }, - "settingsBackupSubtitle": "Move your library, history and settings to a new device", - "@settingsBackupSubtitle": { - "description": "Subtitle for backup and restore settings item" - }, - "backupTitle": "Backup & Restore", - "@backupTitle": { - "description": "App bar title for the backup and restore page" - }, - "backupExportSectionTitle": "Create backup", - "@backupExportSectionTitle": { - "description": "Section title for the export/backup card" - }, - "backupExportSectionDescription": "Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.", - "@backupExportSectionDescription": { - "description": "Description of what a backup contains" - }, - "backupExportButton": "Create backup file", - "@backupExportButton": { - "description": "Button to create and share a backup file" - }, - "backupImportSectionTitle": "Restore backup", - "@backupImportSectionTitle": { - "description": "Section title for the import/restore card" - }, - "backupImportSectionDescription": "Pick a backup file to restore your data. This replaces the current settings, history and library on this device.", - "@backupImportSectionDescription": { - "description": "Description for the restore action" - }, - "backupImportButton": "Choose backup file", - "@backupImportButton": { - "description": "Button to pick a backup file to restore" - }, - "backupCreated": "Backup created", - "@backupCreated": { - "description": "Snackbar after a backup file is created" - }, - "backupCreateFailed": "Failed to create backup", - "@backupCreateFailed": { - "description": "Snackbar when backup creation fails" - }, - "backupRestoreConfirmTitle": "Restore this backup?", - "@backupRestoreConfirmTitle": { - "description": "Confirmation dialog title before restoring a backup" - }, - "backupRestoreConfirmMessage": "This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.", - "@backupRestoreConfirmMessage": { - "description": "Confirmation dialog message before restoring a backup" - }, - "backupRestoreConfirmButton": "Restore", - "@backupRestoreConfirmButton": { - "description": "Confirm button to proceed with restore" - }, - "backupRestored": "Backup restored successfully", - "@backupRestored": { - "description": "Snackbar after a successful restore" - }, - "backupRestoreFailed": "Failed to restore backup", - "@backupRestoreFailed": { - "description": "Snackbar when restore fails" - }, - "backupInvalidFile": "This file is not a valid SpotiFLAC backup", - "@backupInvalidFile": { - "description": "Snackbar when the chosen file is not a valid backup" - }, - "backupRestoreRestartHint": "Restart the app to make sure every change is applied.", - "@backupRestoreRestartHint": { - "description": "Hint shown after restoring that an app restart is recommended" - }, - "backupContentsTitle": "Backup contents", - "@backupContentsTitle": { - "description": "Header above the list summarizing what the backup contains" - }, - "backupContentsSettings": "App settings", - "@backupContentsSettings": { - "description": "Backup contents row label for settings" - }, - "backupContentsHistory": "{count} history {count, plural, =1{item} other{items}}", - "@backupContentsHistory": { - "description": "Backup contents row for history count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsLiked": "{count} liked {count, plural, =1{track} other{tracks}}", - "@backupContentsLiked": { - "description": "Backup contents row for liked tracks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsWishlist": "{count} wishlist {count, plural, =1{track} other{tracks}}", - "@backupContentsWishlist": { - "description": "Backup contents row for wishlist tracks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsPlaylists": "{count, plural, =1{1 playlist} other{{count} playlists}}", - "@backupContentsPlaylists": { - "description": "Backup contents row for playlist count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsArtists": "{count, plural, =1{1 favorite artist} other{{count} favorite artists}}", - "@backupContentsArtists": { - "description": "Backup contents row for favorite artists count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsExtensions": "{count, plural, =1{1 extension} other{{count} extensions}}", - "@backupContentsExtensions": { - "description": "Backup contents row for installed extensions count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupIncludeSecrets": "Include extension credentials", - "@backupIncludeSecrets": { - "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" - }, - "backupIncludeSecretsDescription": "Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.", - "@backupIncludeSecretsDescription": { - "description": "Explanation for the include-credentials toggle" - }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", - "@backupExtensionsRestoreFailed": { - "description": "Snackbar/hint when some extensions failed to reinstall during restore", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tooltipLoveAll": "Love All", - "@tooltipLoveAll": { - "description": "Tooltip for the Love All button on album/playlist screens" - }, - "tooltipAddToPlaylist": "Add to Playlist", - "@tooltipAddToPlaylist": { - "description": "Tooltip for the Add to Playlist button" - }, - "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", - "@snackbarRemovedTracksFromLoved": { - "description": "Snackbar after removing multiple tracks from Loved folder", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", - "@snackbarAddedTracksToLoved": { - "description": "Snackbar after adding multiple tracks to Loved folder", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogDownloadAllTitle": "Download All", - "@dialogDownloadAllTitle": { - "description": "Dialog title for bulk download confirmation" - }, - "dialogDownloadAllMessage": "Download {count} tracks?", - "@dialogDownloadAllMessage": { - "description": "Body of the Download All confirmation dialog", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "homeSkipAlreadyDownloaded": "Skip already downloaded songs", - "@homeSkipAlreadyDownloaded": { - "description": "Checkbox label in import dialog to skip already-downloaded songs" - }, - "homeGoToAlbum": "Go to Album", - "@homeGoToAlbum": { - "description": "Context menu item to navigate to the album page" - }, - "homeAlbumInfoUnavailable": "Album info not available", - "@homeAlbumInfoUnavailable": { - "description": "Snackbar when album info cannot be loaded" - }, - "snackbarLoadingCueSheet": "Loading CUE sheet...", - "@snackbarLoadingCueSheet": { - "description": "Snackbar while loading a CUE sheet file" - }, - "snackbarMetadataSaved": "Metadata saved successfully", - "@snackbarMetadataSaved": { - "description": "Snackbar after successfully saving track metadata" - }, - "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", - "@snackbarFailedToEmbedLyrics": { - "description": "Snackbar when lyrics embedding fails" - }, - "snackbarFailedToWriteStorage": "Failed to write back to storage", - "@snackbarFailedToWriteStorage": { - "description": "Snackbar when writing metadata back to file fails" - }, - "snackbarError": "Error: {error}", - "@snackbarError": { - "description": "Generic error snackbar with error detail", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "snackbarNoActionDefined": "No action defined for this button", - "@snackbarNoActionDefined": { - "description": "Snackbar when an extension button has no action configured" - }, - "noTracksFoundForAlbum": "No tracks found for this album", - "@noTracksFoundForAlbum": { - "description": "Empty state message when an album has no tracks" - }, - "downloadLocationSubtitle": "Choose where to save your downloaded tracks", - "@downloadLocationSubtitle": { - "description": "Subtitle shown in the download location picker sheet" - }, - "storageModeAppFolder": "App Folder (Recommended)", - "@storageModeAppFolder": { - "description": "Storage mode option - app-managed folder" - }, - "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", - "@storageModeAppFolderSubtitle": { - "description": "Subtitle for app folder storage mode" - }, - "storageModeSaf": "Custom Folder (SAF)", - "@storageModeSaf": { - "description": "Storage mode option - Storage Access Framework" - }, - "storageModeSafSubtitle": "Pick any folder, including SD card", - "@storageModeSafSubtitle": { - "description": "Subtitle for SAF storage mode" - }, - "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", - "@downloadFilenameDescription": { - "description": "Description shown in filename format editor" - }, - "downloadFilenameInsertTag": "Tap to insert tag:", - "@downloadFilenameInsertTag": { - "description": "Label above filename tag chips" - }, - "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", - "@downloadSeparateSinglesEnabled": { - "description": "Subtitle when separate singles folder is on" - }, - "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", - "@downloadSeparateSinglesDisabled": { - "description": "Subtitle when separate singles folder is off" - }, - "downloadArtistNameFilters": "Artist Name Filters", - "@downloadArtistNameFilters": { - "description": "Setting title for artist folder filter options" - }, - "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", - "@downloadCreatePlaylistSourceFolder": { - "description": "Setting to create a subfolder per playlist source" - }, - "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", - "@downloadCreatePlaylistSourceFolderEnabled": { - "description": "Subtitle when playlist folder is enabled" - }, - "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", - "@downloadCreatePlaylistSourceFolderDisabled": { - "description": "Subtitle when playlist folder is disabled" - }, - "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", - "@downloadCreatePlaylistSourceFolderRedundant": { - "description": "Subtitle when folder organization is already set to playlist" - }, - "downloadSongLinkRegion": "SongLink Region", - "@downloadSongLinkRegion": { - "description": "Setting for SongLink region used during fallback resolution" - }, - "downloadNetworkCompatibilityMode": "Network Compatibility Mode", - "@downloadNetworkCompatibilityMode": { - "description": "Setting for legacy TLS/network handling" - }, - "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", - "@downloadNetworkCompatibilityModeEnabled": { - "description": "Subtitle when network compatibility mode is on" - }, - "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", - "@downloadNetworkCompatibilityModeDisabled": { - "description": "Subtitle when network compatibility mode is off" - }, - "downloadAllowLocalNetwork": "Allow Local Network Access", - "@downloadAllowLocalNetwork": { - "description": "Setting title for allowing requests to private/local network targets" - }, - "downloadAllowLocalNetworkEnabled": "Requests to local/private addresses are allowed (for local proxy or custom DNS)", - "@downloadAllowLocalNetworkEnabled": { - "description": "Subtitle when allow local network access is on" - }, - "downloadAllowLocalNetworkDisabled": "Local/private addresses are blocked for security", - "@downloadAllowLocalNetworkDisabled": { - "description": "Subtitle when allow local network access is off" - }, - "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", - "@downloadSelectServiceToEnable": { - "description": "Subtitle when quality picker is disabled due to extension service" - }, - "downloadEmbedLyricsDisabled": "Enable metadata embedding first", - "@downloadEmbedLyricsDisabled": { - "description": "Subtitle when lyrics embedding is blocked by metadata toggle" - }, - "downloadNeteaseIncludeTranslation": "Netease: Include Translation", - "@downloadNeteaseIncludeTranslation": { - "description": "Setting to include translated lyrics from Netease" - }, - "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", - "@downloadNeteaseIncludeTranslationEnabled": { - "description": "Subtitle when Netease translation is on" - }, - "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", - "@downloadNeteaseIncludeTranslationDisabled": { - "description": "Subtitle when Netease translation is off" - }, - "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", - "@downloadNeteaseIncludeRomanization": { - "description": "Setting to include romanized lyrics from Netease" - }, - "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", - "@downloadNeteaseIncludeRomanizationEnabled": { - "description": "Subtitle when Netease romanization is on" - }, - "downloadNeteaseIncludeRomanizationDisabled": "No romanization", - "@downloadNeteaseIncludeRomanizationDisabled": { - "description": "Subtitle when Netease romanization is off" - }, - "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", - "@downloadAppleQqMultiPerson": { - "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" - }, - "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", - "@downloadAppleQqMultiPersonEnabled": { - "description": "Subtitle when multi-person lyrics is on" - }, - "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", - "@downloadAppleQqMultiPersonDisabled": { - "description": "Subtitle when multi-person lyrics is off" - }, - "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", - "@downloadAppleElrcWordSync": { - "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" - }, - "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", - "@downloadAppleElrcWordSyncEnabled": { - "description": "Subtitle when Apple Music eLRC word sync is enabled" - }, - "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", - "@downloadAppleElrcWordSyncDisabled": { - "description": "Subtitle when Apple Music eLRC word sync is disabled" - }, - "downloadMusixmatchLanguage": "Musixmatch Language", - "@downloadMusixmatchLanguage": { - "description": "Setting for Musixmatch lyrics translation language" - }, - "downloadMusixmatchLanguageAuto": "Auto (original language)", - "@downloadMusixmatchLanguageAuto": { - "description": "Subtitle when no language is set" - }, - "downloadFilterContributing": "Filter Contributing Artists", - "@downloadFilterContributing": { - "description": "Setting to strip contributing artists from Album Artist folder name" - }, - "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", - "@downloadFilterContributingEnabled": { - "description": "Subtitle when contributing artist filter is on" - }, - "downloadFilterContributingDisabled": "Full Album Artist string used", - "@downloadFilterContributingDisabled": { - "description": "Subtitle when contributing artist filter is off" - }, - "downloadProvidersNoneEnabled": "No providers enabled", - "@downloadProvidersNoneEnabled": { - "description": "Shown when no lyrics providers are active" - }, - "downloadMusixmatchLanguageCode": "Language code", - "@downloadMusixmatchLanguageCode": { - "description": "Label for Musixmatch language input field" - }, - "downloadMusixmatchLanguageHint": "e.g. en, de, ja", - "@downloadMusixmatchLanguageHint": { - "description": "Placeholder for Musixmatch language input" - }, - "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", - "@downloadMusixmatchLanguageDesc": { - "description": "Description in Musixmatch language picker" - }, - "downloadMusixmatchAuto": "Auto", - "@downloadMusixmatchAuto": { - "description": "Button to clear Musixmatch language (use auto)" - }, - "downloadNetworkAnySubtitle": "Use WiFi or mobile data", - "@downloadNetworkAnySubtitle": { - "description": "Subtitle for any-network option in picker" - }, - "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", - "@downloadNetworkWifiOnlySubtitle": { - "description": "Subtitle for WiFi-only option in picker" - }, - "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", - "@downloadSongLinkRegionDesc": { - "description": "Description in SongLink region picker" - }, - "snackbarUnsupportedAudioFormat": "Unsupported audio format", - "@snackbarUnsupportedAudioFormat": { - "description": "Snackbar when the audio format is not supported for the requested operation" - }, - "cacheRefresh": "Refresh", - "@cacheRefresh": { - "description": "Tooltip for refresh button on cache management page" - }, - "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", - "@dialogDownloadPlaylistsMessage": { - "description": "Dialog message for bulk playlist download confirmation", - "placeholders": { - "trackCount": { - "type": "int" - }, - "playlistCount": { - "type": "int" - } - } - }, - "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", - "@bulkDownloadPlaylistsButton": { - "description": "Button label for bulk downloading selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "bulkDownloadSelectPlaylists": "Select playlists to download", - "@bulkDownloadSelectPlaylists": { - "description": "Button label when no playlists are selected for download" - }, - "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", - "@snackbarSelectedPlaylistsEmpty": { - "description": "Snackbar when selected playlists contain no tracks" - }, - "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", - "@playlistsCount": { - "description": "Playlist count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "editMetadataAutoFill": "Auto-fill from online", - "@editMetadataAutoFill": { - "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" - }, - "editMetadataAutoFillDesc": "Select fields to fill automatically from online metadata", - "@editMetadataAutoFillDesc": { - "description": "Description for the auto-fill section" - }, - "editMetadataAutoFillFetch": "Fetch & Fill", - "@editMetadataAutoFillFetch": { - "description": "Button label to fetch online metadata and fill selected fields" - }, - "editMetadataAutoFillSearching": "Searching online...", - "@editMetadataAutoFillSearching": { - "description": "Snackbar shown while searching for online metadata" - }, - "editMetadataAutoFillNoResults": "No matching metadata found online", - "@editMetadataAutoFillNoResults": { - "description": "Snackbar when online metadata search returns no results" - }, - "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", - "@editMetadataAutoFillDone": { - "description": "Snackbar confirming how many fields were auto-filled", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", - "@editMetadataAutoFillNoneSelected": { - "description": "Snackbar when user taps Fetch without selecting any fields" - }, - "editMetadataFieldTitle": "Title", - "@editMetadataFieldTitle": { - "description": "Chip label for title field in auto-fill selector" - }, - "editMetadataFieldArtist": "Artist", - "@editMetadataFieldArtist": { - "description": "Chip label for artist field in auto-fill selector" - }, - "editMetadataFieldAlbum": "Album", - "@editMetadataFieldAlbum": { - "description": "Chip label for album field in auto-fill selector" - }, - "editMetadataFieldAlbumArtist": "Album Artist", - "@editMetadataFieldAlbumArtist": { - "description": "Chip label for album artist field in auto-fill selector" - }, - "editMetadataFieldDate": "Date", - "@editMetadataFieldDate": { - "description": "Chip label for date field in auto-fill selector" - }, - "editMetadataFieldTrackNum": "Track #", - "@editMetadataFieldTrackNum": { - "description": "Chip label for track number field in auto-fill selector" - }, - "editMetadataFieldDiscNum": "Disc #", - "@editMetadataFieldDiscNum": { - "description": "Chip label for disc number field in auto-fill selector" - }, - "editMetadataFieldGenre": "Genre", - "@editMetadataFieldGenre": { - "description": "Chip label for genre field in auto-fill selector" - }, - "editMetadataFieldIsrc": "ISRC", - "@editMetadataFieldIsrc": { - "description": "Chip label for ISRC field in auto-fill selector" - }, - "editMetadataFieldLabel": "Label", - "@editMetadataFieldLabel": { - "description": "Chip label for label field in auto-fill selector" - }, - "editMetadataFieldCopyright": "Copyright", - "@editMetadataFieldCopyright": { - "description": "Chip label for copyright field in auto-fill selector" - }, - "editMetadataFieldCover": "Cover Art", - "@editMetadataFieldCover": { - "description": "Chip label for cover art field in auto-fill selector" - }, - "editMetadataSelectAll": "All", - "@editMetadataSelectAll": { - "description": "Button to select all fields for auto-fill" - }, - "editMetadataSelectEmpty": "Empty only", - "@editMetadataSelectEmpty": { - "description": "Button to select only fields that are currently empty" - }, - "queueDownloadingCount": "Downloading ({count})", - "@queueDownloadingCount": { - "description": "Header for active downloads section with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueFilteringIndicator": "Filtering...", - "@queueFilteringIndicator": { - "description": "Shown while filter results are being computed" - }, - "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", - "@queueTrackCount": { - "description": "Track count label with plural support", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueAlbumCount": "{count, plural, =1{1 album} other{{count} albums}}", - "@queueAlbumCount": { - "description": "Album count label with plural support", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueEmptyAlbums": "No album downloads", - "@queueEmptyAlbums": { - "description": "Empty state title when no album downloads exist" - }, - "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", - "@queueEmptyAlbumsSubtitle": { - "description": "Empty state subtitle for album downloads" - }, - "queueEmptySingles": "No single downloads", - "@queueEmptySingles": { - "description": "Empty state title when no single track downloads exist" - }, - "queueEmptySinglesSubtitle": "Single track downloads will appear here", - "@queueEmptySinglesSubtitle": { - "description": "Empty state subtitle for single track downloads" - }, - "queueEmptyHistory": "No download history", - "@queueEmptyHistory": { - "description": "Empty state title when download history is empty" - }, - "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", - "@queueEmptyHistorySubtitle": { - "description": "Empty state subtitle for download history" - }, - "selectionAllPlaylistsSelected": "All playlists selected", - "@selectionAllPlaylistsSelected": { - "description": "Shown when all playlists are selected in selection mode" - }, - "selectionTapPlaylistsToSelect": "Tap playlists to select", - "@selectionTapPlaylistsToSelect": { - "description": "Hint shown in playlist selection mode" - }, - "selectionSelectPlaylistsToDelete": "Select playlists to delete", - "@selectionSelectPlaylistsToDelete": { - "description": "Hint shown when no playlists are selected for deletion" - }, - "audioAnalysisTitle": "Audio Quality Analysis", - "@audioAnalysisTitle": { - "description": "Title for audio analysis section" - }, - "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", - "@audioAnalysisDescription": { - "description": "Description for audio analysis tap-to-analyze prompt" - }, - "audioAnalysisAnalyzing": "Analyzing audio...", - "@audioAnalysisAnalyzing": { - "description": "Loading text while analyzing audio" - }, - "audioAnalysisSampleRate": "Sample Rate", - "@audioAnalysisSampleRate": { - "description": "Sample rate metric label" - }, - "audioAnalysisCodec": "Codec", - "@audioAnalysisCodec": { - "description": "Audio codec metric label" - }, - "audioAnalysisContainer": "Container", - "@audioAnalysisContainer": { - "description": "Audio container metric label" - }, - "audioAnalysisDecodedFormat": "Decoded Format", - "@audioAnalysisDecodedFormat": { - "description": "Decoded sample format metric label" - }, - "audioAnalysisBitDepth": "Bit Depth", - "@audioAnalysisBitDepth": { - "description": "Bit depth metric label" - }, - "audioAnalysisChannels": "Channels", - "@audioAnalysisChannels": { - "description": "Channels metric label" - }, - "audioAnalysisDuration": "Duration", - "@audioAnalysisDuration": { - "description": "Duration metric label" - }, - "audioAnalysisNyquist": "Nyquist", - "@audioAnalysisNyquist": { - "description": "Nyquist frequency metric label" - }, - "audioAnalysisFileSize": "Size", - "@audioAnalysisFileSize": { - "description": "File size metric label" - }, - "audioAnalysisDynamicRange": "Dynamic Range", - "@audioAnalysisDynamicRange": { - "description": "Dynamic range metric label" - }, - "audioAnalysisPeak": "Peak", - "@audioAnalysisPeak": { - "description": "Peak amplitude metric label" - }, - "audioAnalysisRms": "RMS", - "@audioAnalysisRms": { - "description": "RMS level metric label" - }, - "audioAnalysisLufs": "LUFS", - "@audioAnalysisLufs": { - "description": "Integrated loudness metric label" - }, - "audioAnalysisTruePeak": "True Peak", - "@audioAnalysisTruePeak": { - "description": "True peak metric label" - }, - "audioAnalysisClipping": "Clipping", - "@audioAnalysisClipping": { - "description": "Clipping metric label" - }, - "audioAnalysisNoClipping": "No clipping", - "@audioAnalysisNoClipping": { - "description": "Displayed when no clipped samples were detected" - }, - "audioAnalysisSpectralCutoff": "Spectral Cutoff", - "@audioAnalysisSpectralCutoff": { - "description": "Estimated spectral cutoff metric label" - }, - "audioAnalysisChannelStats": "Per-channel Stats", - "@audioAnalysisChannelStats": { - "description": "Per-channel audio analysis section label" - }, - "audioAnalysisSamples": "Samples", - "@audioAnalysisSamples": { - "description": "Total samples metric label" - }, - "audioAnalysisRescan": "Re-analyze", - "@audioAnalysisRescan": { - "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" - }, - "audioAnalysisRescanning": "Re-analyzing audio...", - "@audioAnalysisRescanning": { - "description": "Loading text while audio is being re-analyzed after an explicit refresh" - }, - "extensionsHomeFeedProvider": "Home Feed Provider", - "@extensionsHomeFeedProvider": { - "description": "Extensions page - label for home feed provider selector" - }, - "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", - "@extensionsHomeFeedDescription": { - "description": "Extensions page - description for home feed provider picker" - }, - "extensionsHomeFeedAuto": "Auto", - "@extensionsHomeFeedAuto": { - "description": "Label for auto-selected search provider" - }, - "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", - "@extensionsHomeFeedAutoSubtitle": { - "description": "Extensions page - subtitle for auto home feed option" - }, - "extensionsHomeFeedOff": "Off", - "@extensionsHomeFeedOff": { - "description": "Extensions page - home feed provider option: off" - }, - "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", - "@extensionsHomeFeedOffSubtitle": { - "description": "Extensions page - subtitle for off home feed option" - }, - "extensionsHomeFeedUse": "Use {extensionName} home feed", - "@extensionsHomeFeedUse": { - "description": "Extensions page - subtitle for a specific extension home feed option", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "extensionsNoHomeFeedExtensions": "No extensions with home feed", - "@extensionsNoHomeFeedExtensions": { - "description": "Extensions page - shown when no installed extension has home feed" - }, - "cancelDownloadTitle": "Cancel download?", - "@cancelDownloadTitle": { - "description": "Dialog title when confirming cancellation of an active download" - }, - "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", - "@cancelDownloadContent": { - "description": "Dialog body when confirming cancellation of an active download", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "cancelDownloadKeep": "Keep", - "@cancelDownloadKeep": { - "description": "Dialog button - keep the active download (do not cancel)" - }, - "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", - "@metadataSaveFailedFfmpeg": { - "description": "Snackbar error when FFmpeg fails to write metadata" - }, - "metadataSaveFailedStorage": "Failed to write metadata back to storage", - "@metadataSaveFailedStorage": { - "description": "Snackbar error when writing metadata file back to storage fails" - }, - "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", - "@snackbarFolderPickerFailed": { - "description": "Snackbar shown when folder picker fails to open", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "notifDownloadingTrack": "Downloading {trackName}", - "@notifDownloadingTrack": { - "description": "Notification title while downloading a track", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "notifFinalizingTrack": "Finalizing {trackName}", - "@notifFinalizingTrack": { - "description": "Notification title while finalizing (embedding metadata) a track", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "notifEmbeddingMetadata": "Embedding metadata...", - "@notifEmbeddingMetadata": { - "description": "Notification body while embedding metadata into a downloaded track" - }, - "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", - "@notifAlreadyInLibraryCount": { - "description": "Notification title when track is already in library, with count", - "placeholders": { - "completed": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "notifAlreadyInLibrary": "Already in Library", - "@notifAlreadyInLibrary": { - "description": "Notification title when track is already in library" - }, - "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", - "@notifDownloadCompleteCount": { - "description": "Notification title when download is complete, with count", - "placeholders": { - "completed": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "notifDownloadComplete": "Download Complete", - "@notifDownloadComplete": { - "description": "Notification title when a single download is complete" - }, - "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", - "@notifDownloadsFinished": { - "description": "Notification title when queue finishes with some failures", - "placeholders": { - "completed": { - "type": "int" - }, - "failed": { - "type": "int" - } - } - }, - "notifAllDownloadsComplete": "All Downloads Complete", - "@notifAllDownloadsComplete": { - "description": "Notification title when all downloads finish successfully" - }, - "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", - "@notifTracksDownloadedSuccess": { - "description": "Notification body for queue complete - how many tracks were downloaded", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", - "@notifDownloadsFinishedBody": { - "description": "Notification body when queue finishes with failures", - "placeholders": { - "completed": { - "type": "int" - }, - "failed": { - "type": "int" - } - } - }, - "notifDownloadsCanceledTitle": "Downloads canceled", - "@notifDownloadsCanceledTitle": { - "description": "Notification title when downloads are canceled by the user" - }, - "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", - "@notifDownloadsCanceledBody": { - "description": "Notification body when downloads are canceled by the user", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifScanningLibrary": "Scanning local library", - "@notifScanningLibrary": { - "description": "Notification title while scanning local library" - }, - "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", - "@notifLibraryScanProgressWithTotal": { - "description": "Notification body for library scan progress when total is known", - "placeholders": { - "scanned": { - "type": "int" - }, - "total": { - "type": "int" - }, - "percentage": { - "type": "int" - } - } - }, - "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", - "@notifLibraryScanProgressNoTotal": { - "description": "Notification body for library scan progress when total is unknown", - "placeholders": { - "scanned": { - "type": "int" - }, - "percentage": { - "type": "int" - } - } - }, - "notifLibraryScanComplete": "Library scan complete", - "@notifLibraryScanComplete": { - "description": "Notification title when library scan finishes" - }, - "notifLibraryScanCompleteBody": "{count} tracks indexed", - "@notifLibraryScanCompleteBody": { - "description": "Notification body for library scan complete - number of indexed tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanExcluded": "{count} excluded", - "@notifLibraryScanExcluded": { - "description": "Library scan complete suffix - excluded track count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanErrors": "{count} errors", - "@notifLibraryScanErrors": { - "description": "Library scan complete suffix - error count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanFailed": "Library scan failed", - "@notifLibraryScanFailed": { - "description": "Notification title when library scan fails" - }, - "notifLibraryScanCancelled": "Library scan cancelled", - "@notifLibraryScanCancelled": { - "description": "Notification title when library scan is cancelled by the user" - }, - "notifLibraryScanStopped": "Scan stopped before completion.", - "@notifLibraryScanStopped": { - "description": "Notification body when library scan is cancelled" - }, - "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", - "@notifDownloadingUpdate": { - "description": "Notification title while downloading an app update", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "notifUpdateProgress": "{received} / {total} MB • {percentage}%", - "@notifUpdateProgress": { - "description": "Notification body showing update download progress", - "placeholders": { - "received": { - "type": "String" - }, - "total": { - "type": "String" - }, - "percentage": { - "type": "int" - } - } - }, - "notifUpdateReady": "Update Ready", - "@notifUpdateReady": { - "description": "Notification title when app update download is complete" - }, - "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", - "@notifUpdateReadyBody": { - "description": "Notification body when app update is ready to install", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "notifUpdateFailed": "Update Failed", - "@notifUpdateFailed": { - "description": "Notification title when app update download fails" - }, - "notifUpdateFailedBody": "Could not download update. Try again later.", - "@notifUpdateFailedBody": { - "description": "Notification body when app update download fails" - }, - "searchTracks": "Tracks", - "@searchTracks": { - "description": "Search filter label - tracks" - }, - "homeSearchHintDefault": "Paste supported URL or search...", - "@homeSearchHintDefault": { - "description": "Default placeholder for the main search field on Home" - }, - "homeSearchHintProvider": "Search with {providerName}...", - "@homeSearchHintProvider": { - "description": "Placeholder for the main search field when a provider is selected", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, - "homeImportCsvTooltip": "Import CSV", - "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" - }, - "homeChangeSearchProviderTooltip": "Change search provider", - "@homeChangeSearchProviderTooltip": { - "description": "Tooltip for the Home search provider picker" - }, - "actionPaste": "Paste", - "@actionPaste": { - "description": "Generic action - paste from clipboard" - }, - "tutorialSearchHint": "Paste or search...", - "@tutorialSearchHint": { - "description": "Placeholder shown in the tutorial search demo" - }, - "tutorialDownloadCompletedSemantics": "Download completed", - "@tutorialDownloadCompletedSemantics": { - "description": "Accessibility label for completed download state in tutorial demo" - }, - "tutorialDownloadInProgressSemantics": "Download in progress", - "@tutorialDownloadInProgressSemantics": { - "description": "Accessibility label for active download state in tutorial demo" - }, - "tutorialStartDownloadSemantics": "Start download", - "@tutorialStartDownloadSemantics": { - "description": "Accessibility label for idle download button in tutorial demo" - }, - "optionsEmbedMetadata": "Embed Metadata", - "@optionsEmbedMetadata": { - "description": "Settings toggle title for writing metadata into downloaded files" - }, - "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", - "@optionsEmbedMetadataSubtitleOn": { - "description": "Subtitle when metadata embedding is enabled" - }, - "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", - "@optionsEmbedMetadataSubtitleOff": { - "description": "Subtitle when metadata embedding is disabled" - }, - "trackCoverNoEmbeddedArt": "No embedded album art found", - "@trackCoverNoEmbeddedArt": { - "description": "Message shown when a track file has no embedded cover art" - }, - "trackCoverReplace": "Replace Cover", - "@trackCoverReplace": { - "description": "Button label for replacing selected cover art" - }, - "trackCoverPick": "Pick Cover", - "@trackCoverPick": { - "description": "Button label for selecting cover art" - }, - "trackCoverClearSelected": "Clear selected cover", - "@trackCoverClearSelected": { - "description": "Tooltip for clearing the newly selected cover art" - }, - "trackCoverCurrent": "Current cover", - "@trackCoverCurrent": { - "description": "Label for the currently embedded cover preview" - }, - "trackCoverSelected": "Selected cover", - "@trackCoverSelected": { - "description": "Label for the newly selected cover preview" - }, - "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", - "@trackCoverReplaceNotice": { - "description": "Notice shown when a new cover has been selected but not saved yet" - }, - "actionStop": "Stop", - "@actionStop": { - "description": "Generic action - stop" - }, - "queueFinalizingDownload": "Finalizing download", - "@queueFinalizingDownload": { - "description": "Accessibility label for a queue item that is finalizing" - }, - "queueDownloadedFileMissing": "Downloaded file missing", - "@queueDownloadedFileMissing": { - "description": "Accessibility label when a downloaded file is missing from disk" - }, - "queueDownloadCompleted": "Download completed", - "@queueDownloadCompleted": { - "description": "Accessibility label for completed download state in queue" - }, - "queueRateLimitTitle": "Service rate limited", - "@queueRateLimitTitle": { - "description": "Title shown on a failed queue item when the download service rate limits requests" - }, - "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", - "@queueRateLimitMessage": { - "description": "Explanation shown on a failed queue item when the download service rate limits requests" - }, - "appearanceSelectAccentColor": "Select accent color {hex}", - "@appearanceSelectAccentColor": { - "description": "Accessibility label for picking an accent color", - "placeholders": { - "hex": { - "type": "String" - } - } - }, - "logAutoScrollOn": "Auto-scroll ON", - "@logAutoScrollOn": { - "description": "Tooltip when auto-scroll is enabled on the log screen" - }, - "logAutoScrollOff": "Auto-scroll OFF", - "@logAutoScrollOff": { - "description": "Tooltip when auto-scroll is disabled on the log screen" - }, - "logCopyLogs": "Copy logs", - "@logCopyLogs": { - "description": "Tooltip for copying logs" - }, - "logClearSearch": "Clear search", - "@logClearSearch": { - "description": "Tooltip for clearing the log search field" - }, - "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", - "@logIssueIspBlockingLabel": { - "description": "Diagnostic badge label when ISP blocking is detected" - }, - "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", - "@logIssueIspBlockingDescription": { - "description": "Diagnostic badge description for ISP blocking" - }, - "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", - "@logIssueIspBlockingSuggestion": { - "description": "Diagnostic badge suggestion for ISP blocking" - }, - "logIssueRateLimitedLabel": "RATE LIMITED", - "@logIssueRateLimitedLabel": { - "description": "Diagnostic badge label when the service rate limits requests" - }, - "logIssueRateLimitedDescription": "Too many requests to the service", - "@logIssueRateLimitedDescription": { - "description": "Diagnostic badge description for rate limiting" - }, - "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", - "@logIssueRateLimitedSuggestion": { - "description": "Diagnostic badge suggestion for rate limiting" - }, - "logIssueNetworkErrorLabel": "NETWORK ERROR", - "@logIssueNetworkErrorLabel": { - "description": "Diagnostic badge label for generic network errors" - }, - "logIssueNetworkErrorDescription": "Connection issues detected", - "@logIssueNetworkErrorDescription": { - "description": "Diagnostic badge description for generic network errors" - }, - "logIssueNetworkErrorSuggestion": "Check your internet connection", - "@logIssueNetworkErrorSuggestion": { - "description": "Diagnostic badge suggestion for generic network errors" - }, - "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", - "@logIssueTrackNotFoundLabel": { - "description": "Diagnostic badge label when a track is unavailable" - }, - "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", - "@logIssueTrackNotFoundDescription": { - "description": "Diagnostic badge description when a track is unavailable" - }, - "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", - "@logIssueTrackNotFoundSuggestion": { - "description": "Diagnostic badge suggestion when a track is unavailable" - }, - "clickableLookingUpArtist": "Looking up artist...", - "@clickableLookingUpArtist": { - "description": "Snackbar shown while clickable artist metadata is being resolved" - }, - "clickableInformationUnavailable": "{type} information not available", - "@clickableInformationUnavailable": { - "description": "Snackbar shown when clickable metadata cannot open a destination", - "placeholders": { - "type": { - "type": "String" - } - } - }, - "extensionDetailsTags": "Tags", - "@extensionDetailsTags": { - "description": "Section title for extension tags" - }, - "extensionDetailsInformation": "Information", - "@extensionDetailsInformation": { - "description": "Section title for extension metadata information" - }, - "extensionUtilityFunctions": "Utility Functions", - "@extensionUtilityFunctions": { - "description": "Capability label for utility-only extensions" - }, - "actionDismiss": "Dismiss", - "@actionDismiss": { - "description": "Generic action - dismiss" - }, - "setupChangeFolderTooltip": "Change folder", - "@setupChangeFolderTooltip": { - "description": "Tooltip for editing the selected download folder" - }, - "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", - "@a11yOpenTrackByArtist": { - "description": "Accessibility label for opening a track item", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "a11yOpenItem": "Open {itemType} {name}", - "@a11yOpenItem": { - "description": "Accessibility label for opening a generic item", - "placeholders": { - "itemType": { - "type": "String" - }, - "name": { - "type": "String" - } - } - }, - "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", - "@a11yOpenItemCount": { - "description": "Accessibility label for opening a grouped item with count", - "placeholders": { - "title": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", - "@a11yOpenAlbumByArtistTrackCount": { - "description": "Accessibility label for opening an album item with track count", - "placeholders": { - "albumName": { - "type": "String" - }, - "artistName": { - "type": "String" - }, - "trackCount": { - "type": "int" - } - } - }, - "a11yTrackByArtist": "{trackName} by {artistName}", - "@a11yTrackByArtist": { - "description": "Accessibility label for a queue or list track item", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "a11ySelectAlbum": "Select album {albumName}", - "@a11ySelectAlbum": { - "description": "Accessibility label for selecting an album", - "placeholders": { - "albumName": { - "type": "String" - } - } - }, - "a11yOpenAlbum": "Open album {albumName}", - "@a11yOpenAlbum": { - "description": "Accessibility label for opening an album", - "placeholders": { - "albumName": { - "type": "String" - } - } - }, - "settingsFiles": "Files & Folders", - "@settingsFiles": { - "description": "Settings menu item - file and folder settings" - }, - "settingsFilesSubtitle": "Download location, filename, folder structure", - "@settingsFilesSubtitle": { - "description": "Subtitle for files & folders settings" - }, - "settingsMetadata": "Metadata", - "@settingsMetadata": { - "description": "Settings menu item - metadata settings" - }, - "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", - "@settingsMetadataSubtitle": { - "description": "Subtitle for metadata settings" - }, - "settingsLyrics": "Lyrics", - "@settingsLyrics": { - "description": "Settings menu item - lyrics settings" - }, - "settingsLyricsSubtitle": "Embed, mode, providers, language options", - "@settingsLyricsSubtitle": { - "description": "Subtitle for lyrics settings" - }, - "settingsApp": "App", - "@settingsApp": { - "description": "Settings menu item - app settings" - }, - "settingsAppSubtitle": "Updates, data, extension repo, debug", - "@settingsAppSubtitle": { - "description": "Subtitle for app settings" - }, - "sectionMetadataProviders": "Providers", - "@sectionMetadataProviders": { - "description": "Settings section header for metadata providers" - }, - "sectionDuplicates": "Duplicates", - "@sectionDuplicates": { - "description": "Settings section header for deduplication" - }, - "sectionLyricsProviderOptions": "Provider Options", - "@sectionLyricsProviderOptions": { - "description": "Settings section header for per-provider lyrics options" - }, - "metadataProvidersTitle": "Metadata Provider Priority", - "@metadataProvidersTitle": { - "description": "Settings item title for metadata provider order" - }, - "metadataProvidersSubtitle": "Drag to set search and metadata source order", - "@metadataProvidersSubtitle": { - "description": "Subtitle for metadata provider priority item" - }, - "downloadDeduplication": "Skip Duplicate Downloads", - "@downloadDeduplication": { - "description": "Setting - skip tracks already in download history" - }, - "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", - "@downloadDeduplicationEnabled": { - "description": "Subtitle when deduplication is on" - }, - "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", - "@downloadDeduplicationDisabled": { - "description": "Subtitle when deduplication is off" - }, - "downloadFallbackExtensions": "Fallback Extensions", - "@downloadFallbackExtensions": { - "description": "Settings item for configuring fallback extension providers" - }, - "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", - "@downloadFallbackExtensionsSubtitle": { - "description": "Subtitle for fallback extensions item" - }, - "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", - "@editMetadataFieldDateHint": { - "description": "Hint text for the edit metadata date field" - }, - "editMetadataFieldTrackTotal": "Track Total", - "@editMetadataFieldTrackTotal": { - "description": "Label for total tracks field in the edit metadata sheet" - }, - "editMetadataFieldDiscTotal": "Disc Total", - "@editMetadataFieldDiscTotal": { - "description": "Label for total discs field in the edit metadata sheet" - }, - "editMetadataFieldComposer": "Composer", - "@editMetadataFieldComposer": { - "description": "Label for composer field in the edit metadata sheet" - }, - "editMetadataFieldComment": "Comment", - "@editMetadataFieldComment": { - "description": "Label for comment field in the edit metadata sheet" - }, - "editMetadataAdvanced": "Advanced", - "@editMetadataAdvanced": { - "description": "Expandable section label for advanced metadata fields" - }, - "libraryFilterMetadataMissingTrackNumber": "Missing track number", - "@libraryFilterMetadataMissingTrackNumber": { - "description": "Filter option - items missing track number" - }, - "libraryFilterMetadataMissingDiscNumber": "Missing disc number", - "@libraryFilterMetadataMissingDiscNumber": { - "description": "Filter option - items missing disc number" - }, - "libraryFilterMetadataMissingArtist": "Missing artist", - "@libraryFilterMetadataMissingArtist": { - "description": "Filter option - items missing artist" - }, - "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", - "@libraryFilterMetadataIncorrectIsrcFormat": { - "description": "Filter option - items with an invalid ISRC format" - }, - "libraryFilterMetadataMissingLabel": "Missing label", - "@libraryFilterMetadataMissingLabel": { - "description": "Filter option - items missing record label" - }, - "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", - "@collectionDeletePlaylistsMessage": { - "description": "Confirmation message for deleting selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", - "@collectionPlaylistsDeleted": { - "description": "Snackbar after deleting selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", - "@collectionAddedTracksToPlaylist": { - "description": "Snackbar after adding multiple tracks to a playlist", - "placeholders": { - "count": { - "type": "int" - }, - "playlistName": { - "type": "String" - } - } - }, - "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", - "@collectionAddedTracksToPlaylistWithExisting": { - "description": "Snackbar after adding multiple tracks to a playlist when some were already present", - "placeholders": { - "count": { - "type": "int" - }, - "playlistName": { - "type": "String" - }, - "alreadyCount": { - "type": "int" - } - } - }, - "itemCount": "{count} {count, plural, =1{item} other{items}}", - "@itemCount": { - "description": "Generic item count label", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", - "@trackReEnrichSuccessWithFailures": { - "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", - "placeholders": { - "successCount": { - "type": "int" - }, - "total": { - "type": "int" - }, - "failedCount": { - "type": "int" - } - } - }, - "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", - "@selectionDeleteTracksCount": { - "description": "Button label for deleting selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", - "@queueDownloadSpeedStatus": { - "description": "Queue status while downloading with speed", - "placeholders": { - "speed": { - "type": "String" - } - } - }, - "queueDownloadStarting": "Starting...", - "@queueDownloadStarting": { - "description": "Queue status before download progress is available" - }, - "a11ySelectTrack": "Select track", - "@a11ySelectTrack": { - "description": "Accessibility label for selecting a track" - }, - "a11yDeselectTrack": "Deselect track", - "@a11yDeselectTrack": { - "description": "Accessibility label for deselecting a track" - }, - "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", - "@a11yPlayTrackByArtist": { - "description": "Accessibility label for playing a local library track", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", - "@storeExtensionsCount": { - "description": "Store extension result count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "storeRequiresVersion": "Requires v{version}+", - "@storeRequiresVersion": { - "description": "Store compatibility badge for minimum app version", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "actionGo": "Go", - "@actionGo": { - "description": "Generic action button label" - }, - "logIssueSummary": "Issue Summary", - "@logIssueSummary": { - "description": "Header for log issue analysis summary" - }, - "logTotalErrors": "Total errors: {count}", - "@logTotalErrors": { - "description": "Total error count in log issue analysis", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "logAffectedDomains": "Affected: {domains}", - "@logAffectedDomains": { - "description": "Affected domains in log issue analysis", - "placeholders": { - "domains": { - "type": "String" - } - } - }, - "libraryScanCancelled": "Scan cancelled", - "@libraryScanCancelled": { - "description": "Library scan status when a scan was cancelled" - }, - "libraryScanCancelledSubtitle": "You can retry the scan when ready.", - "@libraryScanCancelledSubtitle": { - "description": "Library scan status subtitle after cancellation" - }, - "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", - "@libraryDownloadsHistoryExcluded": { - "description": "Library count note for downloaded history items excluded from the local list", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadNativeWorker": "Native download worker", - "@downloadNativeWorker": { - "description": "Setting title for Android native download worker" - }, - "downloadNativeWorkerSubtitle": "एक्सटेंशन डाउनलोड के लिए Android बैकग्राउंड सेवा", - "@downloadNativeWorkerSubtitle": { - "description": "Setting subtitle for Android native download worker" - }, - "badgeBeta": "BETA", - "@badgeBeta": { - "description": "Badge label for beta features" - }, - "extensionServiceStatus": "Service Status", - "@extensionServiceStatus": { - "description": "Extension detail section header for service status" - }, - "extensionServiceHealth": "Service health", - "@extensionServiceHealth": { - "description": "Extension capability label for service health checks" - }, - "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", - "@extensionHealthChecksConfigured": { - "description": "Extension service health check count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", - "@extensionOauthConnectHint": { - "description": "Hint for an OAuth login link field before connecting Spotify" - }, - "extensionLastChecked": "Last checked {time}", - "@extensionLastChecked": { - "description": "Timestamp for the latest extension service health check", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "extensionRefreshStatus": "Refresh status", - "@extensionRefreshStatus": { - "description": "Tooltip for refreshing extension service health status" - }, - "extensionCustomUrlHandling": "Custom URL Handling", - "@extensionCustomUrlHandling": { - "description": "Extension detail section title for custom URL handling" - }, - "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", - "@extensionCustomUrlHandlingSubtitle": { - "description": "Extension detail subtitle for custom URL handling" - }, - "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", - "@extensionCustomUrlHandlingShareHint": { - "description": "Extension detail hint explaining share-to-app URL handling" - }, - "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", - "@extensionSettingsCount": { - "description": "Count of settings exposed by an extension quality option", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionHealthOnline": "Online", - "@extensionHealthOnline": { - "description": "Extension service health status - online" - }, - "extensionHealthDegraded": "Degraded", - "@extensionHealthDegraded": { - "description": "Extension service health status - degraded" - }, - "extensionHealthOffline": "Offline", - "@extensionHealthOffline": { - "description": "Extension service health status - offline" - }, - "extensionHealthNotConfigured": "Not configured", - "@extensionHealthNotConfigured": { - "description": "Extension service health status - not configured" - }, - "extensionHealthUnknown": "Unknown", - "@extensionHealthUnknown": { - "description": "Extension service health status - unknown" - }, - "extensionHealthRequired": "required", - "@extensionHealthRequired": { - "description": "Label for a required extension service health check" - }, - "extensionSettingNotSet": "Not set", - "@extensionSettingNotSet": { - "description": "Value shown when an extension setting has no value" - }, - "extensionActionFailed": "Action failed", - "@extensionActionFailed": { - "description": "Fallback error when an extension action fails without details" - }, - "extensionEnterValue": "Enter value", - "@extensionEnterValue": { - "description": "Hint for editing an extension setting value" - }, - "extensionHealthServiceOnline": "Service online", - "@extensionHealthServiceOnline": { - "description": "Tooltip for online extension service" - }, - "extensionHealthServiceDegraded": "Service degraded", - "@extensionHealthServiceDegraded": { - "description": "Tooltip for degraded extension service" - }, - "extensionHealthServiceOffline": "Service offline", - "@extensionHealthServiceOffline": { - "description": "Tooltip for offline extension service" - }, - "extensionHealthServiceUnknown": "Service status unknown", - "@extensionHealthServiceUnknown": { - "description": "Tooltip for unknown extension service health" - }, - "audioAnalysisStereo": "Stereo", - "@audioAnalysisStereo": { - "description": "Audio channel layout label - stereo" - }, - "audioAnalysisMono": "Mono", - "@audioAnalysisMono": { - "description": "Audio channel layout label - mono" - }, - "trackOpenInService": "Open in {serviceName}", - "@trackOpenInService": { - "description": "Button label to open a track in a named music service", - "placeholders": { - "serviceName": { - "type": "String" - } - } - }, - "trackLyricsEmbeddedSource": "Embedded", - "@trackLyricsEmbeddedSource": { - "description": "Lyrics source label for embedded lyrics" - }, - "unknownAlbum": "Unknown Album", - "@unknownAlbum": { - "description": "Fallback album name when metadata is missing" - }, - "unknownArtist": "Unknown Artist", - "@unknownArtist": { - "description": "Fallback artist name when metadata is missing" - }, - "permissionAudio": "Audio", - "@permissionAudio": { - "description": "Audio permission type label" - }, - "permissionStorage": "Storage", - "@permissionStorage": { - "description": "Storage permission type label" - }, - "permissionNotification": "Notification", - "@permissionNotification": { - "description": "Notification permission type label" - }, - "errorInvalidFolderSelected": "Invalid folder selected", - "@errorInvalidFolderSelected": { - "description": "Error when the selected folder is invalid" - }, - "storeAnyVersion": "Any", - "@storeAnyVersion": { - "description": "Store detail value when any app version is accepted" - }, - "storeCategoryMetadata": "Metadata", - "@storeCategoryMetadata": { - "description": "Store extension category - metadata" - }, - "storeCategoryDownload": "Download", - "@storeCategoryDownload": { - "description": "Store extension category - download" - }, - "storeCategoryUtility": "Utility", - "@storeCategoryUtility": { - "description": "Store extension category - utility" - }, - "storeCategoryLyrics": "Lyrics", - "@storeCategoryLyrics": { - "description": "Store extension category - lyrics" - }, - "storeCategoryIntegration": "Integration", - "@storeCategoryIntegration": { - "description": "Store extension category - integration" - }, - "artistReleases": "Releases", - "@artistReleases": { - "description": "Section header for all artist releases" - }, - "editMetadataSelectNone": "None", - "@editMetadataSelectNone": { - "description": "Button to clear selected fields for auto-fill" - }, - "queueRetryAllFailed": "Retry {count} failed", - "@queueRetryAllFailed": { - "description": "Button to retry every failed download in the queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "settingsSaveDownloadHistory": "Save download history", - "@settingsSaveDownloadHistory": { - "description": "Settings switch title for storing completed downloads in history" - }, - "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", - "@settingsSaveDownloadHistorySubtitle": { - "description": "Settings switch subtitle for storing completed downloads in history" - }, - "dialogDisableHistoryTitle": "Turn off download history?", - "@dialogDisableHistoryTitle": { - "description": "Confirmation dialog title shown before disabling download history" - }, - "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", - "@dialogDisableHistoryMessage": { - "description": "Confirmation dialog message shown before disabling download history" - }, - "dialogDisableAndClear": "Turn off and clear", - "@dialogDisableAndClear": { - "description": "Confirmation action to disable download history and clear existing entries" - }, - "openInOtherServices": "Open in Other Services", - "@openInOtherServices": { - "description": "Title and tooltip for finding the current collection in other services" - }, - "shareSheetNoExtensions": "No other compatible services", - "@shareSheetNoExtensions": { - "description": "Empty state when no extensions can be searched for cross-service links" - }, - "shareSheetNotFound": "Not found", - "@shareSheetNotFound": { - "description": "Cross-service share sheet row subtitle when a service has no match" - }, - "shareSheetCopyLink": "Copy Link", - "@shareSheetCopyLink": { - "description": "Tooltip for copying a cross-service link" - }, - "shareSheetLinkCopied": "{service} link copied", - "@shareSheetLinkCopied": { - "description": "Snackbar after copying a cross-service link", - "placeholders": { - "service": {} - } - }, - "libraryPlayback": "Playback", - "@libraryPlayback": { - "description": "Section header for playback settings in library settings" - }, - "libraryExternalPlayer": "External player", - "@libraryExternalPlayer": { - "description": "Setting option to use an external music player" - }, - "libraryExternalPlayerSubtitle": "Recommended for listening, best quality, gapless playback, EQ, and wider format support", - "@libraryExternalPlayerSubtitle": { - "description": "Subtitle for external player option" - }, - "libraryBuiltInPreviewPlayer": "Built-in preview player", - "@libraryBuiltInPreviewPlayer": { - "description": "Setting option to use the built-in preview player" - }, - "libraryBuiltInPreviewPlayerSubtitle": "Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening", - "@libraryBuiltInPreviewPlayerSubtitle": { - "description": "Subtitle for built-in preview player option" - }, - "libraryBuiltInPlayerInfo": "The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.", - "@libraryBuiltInPlayerInfo": { - "description": "Info note explaining the built-in player is for previews only" - }, - "nowPlayingTitle": "Now Playing", - "@nowPlayingTitle": { - "description": "Title for the now playing screen" - }, - "nowPlayingNothingPlaying": "Nothing is playing", - "@nowPlayingNothingPlaying": { - "description": "Empty state when no track is currently playing" - }, - "nowPlayingMinimize": "Minimize", - "@nowPlayingMinimize": { - "description": "Tooltip for minimizing the now playing screen" - }, - "nowPlayingUpNext": "Up next", - "@nowPlayingUpNext": { - "description": "Title for the playback queue sheet" - }, - "nowPlayingDetails": "Details", - "@nowPlayingDetails": { - "description": "Menu item and section title for track metadata details" - }, - "nowPlayingOpenInExternalPlayer": "Open in external player", - "@nowPlayingOpenInExternalPlayer": { - "description": "Menu item to open the current track in an external player" - }, - "nowPlayingTabPlayer": "Player", - "@nowPlayingTabPlayer": { - "description": "Tab label for the player view" - }, - "nowPlayingTabLyrics": "Lyrics", - "@nowPlayingTabLyrics": { - "description": "Tab label for the lyrics view" - }, - "nowPlayingNoLyrics": "No lyrics in this file", - "@nowPlayingNoLyrics": { - "description": "Empty state when the playing file has no embedded lyrics" - }, - "nowPlayingLibraryEmpty": "Your library is empty", - "@nowPlayingLibraryEmpty": { - "description": "Snackbar when shuffle library is requested but library has no tracks" - }, - "nowPlayingShuffleLibraryFailed": "Could not shuffle library: {error}", - "@nowPlayingShuffleLibraryFailed": { - "description": "Snackbar when shuffling the library fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "nowPlayingShuffleOn": "Shuffle on", - "@nowPlayingShuffleOn": { - "description": "Tooltip when shuffle mode is enabled" - }, - "nowPlayingPlayInOrder": "Play in order", - "@nowPlayingPlayInOrder": { - "description": "Tooltip when shuffle mode is disabled" - }, - "nowPlayingShuffleLibrary": "Shuffle library", - "@nowPlayingShuffleLibrary": { - "description": "Button label to shuffle and play the entire local library" - }, - "nowPlayingQueueEmpty": "Queue is empty", - "@nowPlayingQueueEmpty": { - "description": "Empty state when the playback queue has no items" - }, - "nowPlayingNoMetadata": "No metadata available", - "@nowPlayingNoMetadata": { - "description": "Empty state when track metadata cannot be loaded" - }, - "announcementUnableToOpenLink": "Unable to open link. Please try again.", - "@announcementUnableToOpenLink": { - "description": "Snackbar shown when an announcement CTA link cannot be opened" - }, - "trackConvertLosslessOutputWithCap": "Lossless output with {quality} cap", - "@trackConvertLosslessOutputWithCap": { - "description": "Hint shown when lossless conversion will cap bit depth or sample rate", - "placeholders": { - "quality": { - "type": "String" - } - } - }, - "trackConvertConfirmMessageLosslessCapped": "Convert from {sourceFormat} to {targetFormat} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.", - "@trackConvertConfirmMessageLosslessCapped": { - "description": "Confirmation dialog message for capped lossless conversion of a single file", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "selectionBatchConvertConfirmMessageLosslessCapped": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessageLosslessCapped": { - "description": "Confirmation dialog message for capped lossless batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "trackConvertActionLabelLossless": "{sourceFormat} → {targetFormat} ({quality})", - "@trackConvertActionLabelLossless": { - "description": "Convert button label for lossless conversion with quality cap", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", - "@trackConvertActionLabelLossy": { - "description": "Convert button label for lossy conversion", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "aboutPaxsenixSubtitle": "Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius", - "@aboutPaxsenixSubtitle": { - "description": "Subtitle for Paxsenix special thanks entry on the about page" - }, - "snackbarPlayingNext": "Playing next", - "@snackbarPlayingNext": { - "description": "Snackbar when a track is inserted as the next queue item" - }, - "snackbarAddedToQueueGeneric": "Added to queue", - "@snackbarAddedToQueueGeneric": { - "description": "Snackbar when a track is added to the playback queue without naming it" - }, - "selectionDeletePlaylistsCount": "Delete {count} {count, plural, =1{playlist} other{playlists}}", - "@selectionDeletePlaylistsCount": { - "description": "Button label for deleting multiple selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "actionShuffle": "Shuffle", - "@actionShuffle": { - "description": "Tooltip for shuffle playback action" - }, - "downloadPrimaryArtistOnlyOn": "Primary only: On", - "@downloadPrimaryArtistOnlyOn": { - "description": "Status label when primary-artist-only folder naming is enabled" - }, - "downloadPrimaryArtistOnlyOff": "Primary only: Off", - "@downloadPrimaryArtistOnlyOff": { - "description": "Status label when primary-artist-only folder naming is disabled" - }, - "downloadAlbumArtistMetadataPrimaryOnly": "Album Artist metadata: Primary only", - "@downloadAlbumArtistMetadataPrimaryOnly": { - "description": "Status label when album-artist folder filtering uses primary artist only" - }, - "downloadAlbumArtistMetadataFull": "Album Artist metadata: Full", - "@downloadAlbumArtistMetadataFull": { - "description": "Status label when album-artist folder filtering uses full metadata" - }, - "trackConvertOriginal": "Original", - "@trackConvertOriginal": { - "description": "Label for keeping original bit depth or sample rate during conversion" - }, - "trackConvertOriginalQuality": "Original quality", - "@trackConvertOriginalQuality": { - "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" - }, - "trackConvertLosslessSuffix": "Lossless", - "@trackConvertLosslessSuffix": { - "description": "Suffix used in converted lossless quality labels" - }, - "trackConvertDithering": "Dithering", - "@trackConvertDithering": { - "description": "Section label for lossless conversion dithering options" - }, - "trackConvertResampler": "Resampler", - "@trackConvertResampler": { - "description": "Section label for lossless conversion resampler options" - }, - "trackConvertDitherNone": "None", - "@trackConvertDitherNone": { - "description": "Lossless conversion dither option with no dithering applied" - }, - "trackConvertDitherTriangular": "TPDF", - "@trackConvertDitherTriangular": { - "description": "Lossless conversion triangular probability density function dither option" - }, - "trackConvertDitherTriangularHp": "Triangular HP", - "@trackConvertDitherTriangularHp": { - "description": "Lossless conversion high-pass triangular dither option" - }, - "trackConvertResamplerSwr": "SWR", - "@trackConvertResamplerSwr": { - "description": "Lossless conversion default FFmpeg swresample resampler option" - }, - "trackConvertResamplerSoxr": "SoXr", - "@trackConvertResamplerSoxr": { - "description": "Lossless conversion SoX resampler option" - }, - "updateSeeReleaseNotes": "See release notes for details.", - "@updateSeeReleaseNotes": { - "description": "Fallback changelog text when release notes cannot be parsed" - }, - "unknownTitle": "Unknown title", - "@unknownTitle": { - "description": "Fallback track title when metadata is missing" - }, - "trackPlayNext": "Play next", - "@trackPlayNext": { - "description": "Menu action to play a track as the next queue item" - }, - "trackAddToQueue": "Add to queue", - "@trackAddToQueue": { - "description": "Menu action to add a track to the playback queue" - }, - "snackbarExtensionInstalledEnable": "{extensionName} installed. Enable it in Settings > Extensions", - "@snackbarExtensionInstalledEnable": { - "description": "Snackbar after installing an extension from the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarExtensionUpdatedVersion": "{extensionName} updated to v{version}", - "@snackbarExtensionUpdatedVersion": { - "description": "Snackbar after updating an extension from the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - }, - "version": { - "type": "String" - } - } - }, - "snackbarFailedToInstallNamed": "Failed to install {extensionName}", - "@snackbarFailedToInstallNamed": { - "description": "Snackbar when extension install fails in the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarFailedToUpdateNamed": "Failed to update {extensionName}", - "@snackbarFailedToUpdateNamed": { - "description": "Snackbar when extension update fails in the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "releaseTypeEp": "EP", - "@releaseTypeEp": { - "description": "Badge label for EP releases" - }, - "releaseTypeSingle": "Single", - "@releaseTypeSingle": { - "description": "Badge label for single releases" - }, - "trackCoverOnline": "Online cover", - "@trackCoverOnline": { - "description": "Label shown when metadata autofill downloaded cover art from the internet" - }, - "regionCountryUS": "United States", - "@regionCountryUS": { - "description": "Country name for SongLink region picker" - }, - "regionCountryGB": "United Kingdom", - "@regionCountryGB": { - "description": "Country name for SongLink region picker" - }, - "regionCountryFR": "France", - "@regionCountryFR": { - "description": "Country name for SongLink region picker" - }, - "regionCountryDE": "Germany", - "@regionCountryDE": { - "description": "Country name for SongLink region picker" - }, - "regionCountryJP": "Japan", - "@regionCountryJP": { - "description": "Country name for SongLink region picker" - }, - "regionCountryKR": "South Korea", - "@regionCountryKR": { - "description": "Country name for SongLink region picker" - }, - "regionCountryIN": "India", - "@regionCountryIN": { - "description": "Country name for SongLink region picker" - }, - "regionCountryID": "Indonesia", - "@regionCountryID": { - "description": "Country name for SongLink region picker" - }, - "regionCountryBR": "Brazil", - "@regionCountryBR": { - "description": "Country name for SongLink region picker" - }, - "regionCountryMX": "Mexico", - "@regionCountryMX": { - "description": "Country name for SongLink region picker" - }, - "regionCountryAU": "Australia", - "@regionCountryAU": { - "description": "Country name for SongLink region picker" - }, - "regionCountryCA": "Canada", - "@regionCountryCA": { - "description": "Country name for SongLink region picker" - }, - "regionCountryXK": "Kosovo", - "@regionCountryXK": { - "description": "Country name for SongLink region picker" - }, - "extensionVerificationBrowserTitle": "Verification browser", - "@extensionVerificationBrowserTitle": { - "description": "Settings option title for extension verification browser preference" - }, - "extensionVerificationBrowserSubtitleExternal": "Open challenges in the default browser first", - "@extensionVerificationBrowserSubtitleExternal": { - "description": "Subtitle when external browser is preferred for extension verification" - }, - "extensionVerificationBrowserSubtitleInApp": "Open challenges in the in-app browser first", - "@extensionVerificationBrowserSubtitleInApp": { - "description": "Subtitle when in-app browser is preferred for extension verification" - }, - "extensionVerificationBrowserExternal": "External", - "@extensionVerificationBrowserExternal": { - "description": "Chip label for external browser verification mode" - }, - "extensionVerificationBrowserInApp": "In-app", - "@extensionVerificationBrowserInApp": { - "description": "Chip label for in-app browser verification mode" - }, - "extensionVerificationHelpTitleManual": "Open verification manually", - "@extensionVerificationHelpTitleManual": { - "description": "Dialog title when automatic browser launch for verification fails" - }, - "extensionVerificationHelpTitleWaiting": "Verification still waiting", - "@extensionVerificationHelpTitleWaiting": { - "description": "Dialog title when verification is taking longer than expected" - }, - "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.", - "@extensionVerificationHelpMessageManual": { - "description": "Dialog message when automatic browser launch for verification fails" - }, - "extensionVerificationHelpMessageWaiting": "If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.", - "@extensionVerificationHelpMessageWaiting": { - "description": "Dialog message when verification may need manual browser help" - }, - "extensionVerificationClose": "Close", - "@extensionVerificationClose": { - "description": "Button to dismiss the extension verification help dialog" - }, - "extensionVerificationCopyLink": "Copy link", - "@extensionVerificationCopyLink": { - "description": "Button to copy the extension verification URL" - }, - "extensionVerificationLinkCopied": "Verification link copied", - "@extensionVerificationLinkCopied": { - "description": "Snackbar after copying the extension verification URL" - }, - "extensionVerificationOpenBrowser": "Open browser", - "@extensionVerificationOpenBrowser": { - "description": "Button to open the extension verification URL in a browser" - } -} diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb deleted file mode 100644 index a5f44ab7..00000000 --- a/lib/l10n/arb/app_ko.arb +++ /dev/null @@ -1,5887 +0,0 @@ -{ - "@@locale": "ko", - "@@last_modified": "2026-04-28", - "libraryEnableLocalLibrarySubtitle": "기존 음악을 스캔하고 추적하세요", - "@libraryEnableLocalLibrarySubtitle": { - "description": "Subtitle for enable toggle" - }, - "@audioAnalysisCodec": { - "description": "Audio codec metric label" - }, - "extensionUtilityFunctions": "유틸리티 함수", - "@extensionUtilityFunctions": { - "description": "Capability label for utility-only extensions" - }, - "logClearLogsMessage": "모든 로그를 삭제하시겠습니까?", - "@logClearLogsMessage": { - "description": "Clear logs confirmation message" - }, - "@storeClearFilters": { - "description": "Button to clear all filters" - }, - "cacheCleanupUnused": "사용되지 않는 데이터 정리", - "@cacheCleanupUnused": { - "description": "Action title for cleaning unused entries" - }, - "trackConvertDitherNone": "없음", - "@trackConvertDitherNone": { - "description": "Lossless conversion dither option with no dithering applied" - }, - "libraryTracksUnit": "{count, plural, =1{트랙} other{트랙}}", - "@libraryTracksUnit": { - "description": "Unit label for tracks count (without the number itself)", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "folderOrganizationNone": "정리하지 않음", - "@folderOrganizationNone": { - "description": "Folder option - flat structure" - }, - "@storeRepoUrlHint": { - "description": "Hint/placeholder for the repository URL input field" - }, - "@trackConvertConfirmTitle": { - "description": "Confirmation dialog title" - }, - "@extensionPatternsCount": { - "description": "URL patterns count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "audioAnalysisContainer": "컨테이너", - "@audioAnalysisContainer": { - "description": "Audio container metric label" - }, - "libraryAutoScanOff": "끄기", - "@libraryAutoScanOff": { - "description": "Auto scan disabled" - }, - "shareSheetLinkCopied": "{service} 링크가 복사됨", - "@shareSheetLinkCopied": { - "description": "Snackbar after copying a cross-service link", - "placeholders": { - "service": {} - } - }, - "providerPriorityFallbackExtensionsDescription": "자동 대체 중에 사용할 수 있는 설치된 다운로드 확장 프로그램을 선택하세요", - "@providerPriorityFallbackExtensionsDescription": { - "description": "Section description for extension fallback selection" - }, - "@replayGainBatchConfirmMessage": { - "description": "Message of the batch ReplayGain confirmation dialog", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@extensionsHomeFeedUse": { - "description": "Extensions page - subtitle for a specific extension home feed option", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "selectionShareCount": "{count} {count, plural, =1{트랙} other{트랙}} 공유", - "@selectionShareCount": { - "description": "Share button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@storeExtensionsCount": { - "description": "Store extension result count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@logSearchHint": { - "description": "Log search placeholder" - }, - "@audioAnalysisSamples": { - "description": "Total samples metric label" - }, - "trackCoverReplace": "표지 교체", - "@trackCoverReplace": { - "description": "Button label for replacing selected cover art" - }, - "@discographyAddedToQueue": { - "description": "Snackbar - tracks added from discography", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadAppleElrcWordSyncEnabled": "단어별 타임스탬프 원본 유지", - "@downloadAppleElrcWordSyncEnabled": { - "description": "Subtitle when Apple Music eLRC word sync is enabled" - }, - "@nowPlayingDetails": { - "description": "Menu item and section title for track metadata details" - }, - "@trackGenre": { - "description": "Metadata label - music genre" - }, - "recentTypeSong": "노래", - "@recentTypeSong": { - "description": "Recent access item type - song/track" - }, - "logShareLogs": "로그 공유", - "@logShareLogs": { - "description": "Share button tooltip" - }, - "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" - }, - "extensionsInstallButton": "확장 프로그램 설치", - "@extensionsInstallButton": { - "description": "Button to install extension from file" - }, - "replayGainBatchSuccess": "{total} 개의 트랙 중 {success} 개에 리플레이게인이 추가됨", - "@replayGainBatchSuccess": { - "description": "Snackbar after batch ReplayGain completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "nowPlayingMinimize": "최소화", - "@nowPlayingMinimize": { - "description": "Tooltip for minimizing the now playing screen" - }, - "logIssueNetworkErrorSuggestion": "인터넷 연결 상태를 확인하세요", - "@logIssueNetworkErrorSuggestion": { - "description": "Diagnostic badge suggestion for generic network errors" - }, - "extensionsNoExtensions": "설치된 확장 프로그램이 없음", - "@extensionsNoExtensions": { - "description": "Empty state - no extensions" - }, - "@cacheRefresh": { - "description": "Tooltip for refresh button on cache management page" - }, - "@snackbarHistoryCleared": { - "description": "Snackbar - history deleted" - }, - "cueSplitFailed": "CUE 분할 실패", - "@cueSplitFailed": { - "description": "Snackbar when CUE split fails" - }, - "trackConvertLosslessSuffix": "무손실", - "@trackConvertLosslessSuffix": { - "description": "Suffix used in converted lossless quality labels" - }, - "homeSubtitle": "지원되는 URL을 붙여넣거나, 이름으로 검색하세요", - "@homeSubtitle": { - "description": "Subtitle shown below search box" - }, - "selectionBatchConvertConfirmMessageLossless": "{count} 개의 {count, plural, =1{트랙} other{트랙}}을 {format}으로 변환하시겠습니까? (무손실 — 음질 손실 없음)\n\n변환 후 원본 파일이 삭제됩니다", - "@selectionBatchConvertConfirmMessageLossless": { - "description": "Confirmation dialog message for lossless batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "@extensionVerificationHelpMessageManual": { - "description": "Dialog message when automatic browser launch for verification fails" - }, - "queueRateLimitMessage": "이 트랙은 아직 사용 가능할 수 있습니다. 몇 분 기다렸다가 병렬 다운로드를 줄인 후에 다시 시도하세요", - "@queueRateLimitMessage": { - "description": "Explanation shown on a failed queue item when the download service rate limits requests" - }, - "searchSortDateOldest": "발매일자 (오래된순)", - "@searchSortDateOldest": { - "description": "Sort option - oldest release first" - }, - "aboutSjdonadoDesc": "I Don't Have Spotify(IDHS) 개발자입니다. 위급 상황 발생 시 해결해 주는 대체 링크 해결 도구를 만들었습니다!", - "@aboutSjdonadoDesc": { - "description": "Credit description for sjdonado" - }, - "nowPlayingShuffleOn": "셔플 켜기", - "@nowPlayingShuffleOn": { - "description": "Tooltip when shuffle mode is enabled" - }, - "sectionColor": "색상", - "@sectionColor": { - "description": "Settings section header" - }, - "@providerPriorityFallbackExtensionsHint": { - "description": "Hint below the extension fallback selection list" - }, - "cacheCoverImage": "표지 이미지 캐시", - "@cacheCoverImage": { - "description": "Cache item title for persistent cover images" - }, - "@navSettings": { - "description": "Bottom navigation - Settings tab" - }, - "@trackCoverReplaceNotice": { - "description": "Notice shown when a new cover has been selected but not saved yet" - }, - "cueSplitConfirmTitle": "CUE 앨범 분할", - "@cueSplitConfirmTitle": { - "description": "CUE split confirmation dialog title" - }, - "@trackDeleteConfirmMessage": { - "description": "Delete confirmation message" - }, - "cacheClearSuccess": "지워짐: {target}", - "@cacheClearSuccess": { - "description": "Snackbar after clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "editMetadataFieldCover": "표지 이미지", - "@editMetadataFieldCover": { - "description": "Chip label for cover art field in auto-fill selector" - }, - "snackbarSelectExtFile": ".spotiflac-ext 파일을 선택하세요", - "@snackbarSelectExtFile": { - "description": "Snackbar - wrong file type selected" - }, - "libraryFilterFormat": "형식", - "@libraryFilterFormat": { - "description": "Filter section - file format" - }, - "@downloadLossyAac": { - "description": "Lossy format option - AAC in M4A container at 320kbps" - }, - "@setupNext": { - "description": "Next button text" - }, - "@releaseTypeSingle": { - "description": "Badge label for single releases" - }, - "@optionsDefaultSearchTab": { - "description": "Title for the preferred default search tab setting" - }, - "trackConvertLosslessOutputWithCap": "{quality} 제한이 있는 무손실 출력", - "@trackConvertLosslessOutputWithCap": { - "description": "Hint shown when lossless conversion will cap bit depth or sample rate", - "placeholders": { - "quality": { - "type": "String" - } - } - }, - "bulkDownloadSelectPlaylists": "다운로드할 재생목록 선택", - "@bulkDownloadSelectPlaylists": { - "description": "Button label when no playlists are selected for download" - }, - "artistOptionAddToFavorites": "즐겨찾는 아티스트에 추가", - "@artistOptionAddToFavorites": { - "description": "Action label - add artist to favorite artists" - }, - "@timeJustNow": { - "description": "Relative time - less than a minute ago" - }, - "downloadLossyOpus256": "Opus 256kbps", - "@downloadLossyOpus256": { - "description": "Lossy format option - Opus 256kbps" - }, - "discographySinglesOnlySubtitle": "{albumCount} 개의 싱글에서 {count} 개의 트랙", - "@discographySinglesOnlySubtitle": { - "description": "Subtitle showing singles tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "optionsExtensionStore": "확장 프로그램 리포", - "@optionsExtensionStore": { - "description": "Show/hide store tab" - }, - "libraryDownloadsHistoryExcluded": "다운로드 기록에서 {count} 개 (목록에서 제외됨)", - "@libraryDownloadsHistoryExcluded": { - "description": "Library count note for downloaded history items excluded from the local list", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@errorUrlFetchFailed": { - "description": "Error message - generic URL fetch failure" - }, - "@trackOptionAddToWishlist": { - "description": "Bottom sheet action label - add track to wishlist" - }, - "discographySinglesOnly": "싱글 & EP만", - "@discographySinglesOnly": { - "description": "Option - download only singles" - }, - "@downloadSongLinkRegionDesc": { - "description": "Description in SongLink region picker" - }, - "notifEmbeddingMetadata": "메타데이터를 삽입하는 중...", - "@notifEmbeddingMetadata": { - "description": "Notification body while embedding metadata into a downloaded track" - }, - "@settingsLocalLibrarySubtitle": { - "description": "Subtitle for local library settings" - }, - "@downloadLocationSubtitle": { - "description": "Subtitle shown in the download location picker sheet" - }, - "trackConvertOriginalQuality": "원본 음질", - "@trackConvertOriginalQuality": { - "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" - }, - "nowPlayingTabLyrics": "가사", - "@nowPlayingTabLyrics": { - "description": "Tab label for the lyrics view" - }, - "selectionConvertCount": "{count} {count, plural, =1{트랙} other{트랙}} 변환", - "@selectionConvertCount": { - "description": "Convert button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@extensionsInstalledSection": { - "description": "Section header - installed extensions" - }, - "@downloadNetworkCompatibilityModeDisabled": { - "description": "Subtitle when network compatibility mode is off" - }, - "nowPlayingShuffleLibrary": "라이브러리 셔플", - "@nowPlayingShuffleLibrary": { - "description": "Button label to shuffle and play the entire local library" - }, - "trackReEnrichFieldCover": "표지 이미지", - "@trackReEnrichFieldCover": { - "description": "Checkbox label for cover art field in re-enrich" - }, - "tutorialExtensionsTip3": "가사, 향상된 메타데이터 및 더 많은 기능을 이용하세요", - "@tutorialExtensionsTip3": { - "description": "Tutorial extensions tip 3" - }, - "@cacheCleanupUnusedDesc": { - "description": "Description of what cleanup unused data does" - }, - "a11yOpenAlbum": "앨범 ''{albumName}'' 열기", - "@a11yOpenAlbum": { - "description": "Accessibility label for opening an album", - "placeholders": { - "albumName": { - "type": "String" - } - } - }, - "@settingsLyrics": { - "description": "Settings menu item - lyrics settings" - }, - "nowPlayingQueueEmpty": "현재 다운로드 목록이 비어 있음", - "@nowPlayingQueueEmpty": { - "description": "Empty state when the playback queue has no items" - }, - "@settingsDownload": { - "description": "Settings section - download options" - }, - "notifTracksDownloadedSuccess": "{count, plural, =1{1 개의 트랙 다운로드 성공} other{{count} 개의 트랙 다운로드 성공}}", - "@notifTracksDownloadedSuccess": { - "description": "Notification body for queue complete - how many tracks were downloaded", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "storeCategoryDownload": "다운로드", - "@storeCategoryDownload": { - "description": "Store extension category - download" - }, - "aboutTelegramChannel": "텔레그램 채널", - "@aboutTelegramChannel": { - "description": "Link to Telegram channel" - }, - "@downloadedAlbumDiscHeader": { - "description": "Header for disc separator in multi-disc albums", - "placeholders": { - "discNumber": { - "type": "int", - "example": "1" - } - } - }, - "@recentEmpty": { - "description": "Empty state text for recent access list" - }, - "@backupRestoreConfirmMessage": { - "description": "Confirmation dialog message before restoring a backup" - }, - "@shareSheetCopyLink": { - "description": "Tooltip for copying a cross-service link" - }, - "regionCountryID": "인도네시아", - "@regionCountryID": { - "description": "Country name for SongLink region picker" - }, - "@libraryInLibrary": { - "description": "Badge shown on tracks that exist in local library" - }, - "extensionPostProcessingHooks": "후처리 후크", - "@extensionPostProcessingHooks": { - "description": "Capability - post-processing" - }, - "@setupGrantPermission": { - "description": "Button to request permission" - }, - "storeFilterDownload": "다운로드", - "@storeFilterDownload": { - "description": "Store filter - download providers" - }, - "@collectionAddToPlaylist": { - "description": "Action to add a track to user playlist" - }, - "@discographyFailedToFetch": { - "description": "Error - some albums failed to load" - }, - "@updateWhatsNew": { - "description": "Changelog section title" - }, - "@setupLanguageDescription": { - "description": "Description for the language selection step in setup" - }, - "dialogDeleteSelectedTitle": "선택 항목 삭제", - "@dialogDeleteSelectedTitle": { - "description": "Dialog title - delete selected items" - }, - "trackCoverPick": "표지 선택", - "@trackCoverPick": { - "description": "Button label for selecting cover art" - }, - "@collectionCreatePlaylist": { - "description": "Action to create a new playlist" - }, - "selectionBatchConvertSuccess": "{total} 개 중 {success} 개를 {format}로 변환 완료", - "@selectionBatchConvertSuccess": { - "description": "Snackbar after batch conversion completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "qualityHiResFlacMax": "Hi-Res FLAC Max", - "@qualityHiResFlacMax": { - "description": "Quality option - maximum resolution FLAC" - }, - "audioAnalysisStereo": "스테레오", - "@audioAnalysisStereo": { - "description": "Audio channel layout label - stereo" - }, - "backupExportButton": "백업 파일 생성", - "@backupExportButton": { - "description": "Button to create and share a backup file" - }, - "settingsApp": "앱", - "@settingsApp": { - "description": "Settings menu item - app settings" - }, - "clickableInformationUnavailable": "{type} 정보를 사용할 수 없음", - "@clickableInformationUnavailable": { - "description": "Snackbar shown when clickable metadata cannot open a destination", - "placeholders": { - "type": { - "type": "String" - } - } - }, - "@logFilterLevel": { - "description": "Filter by log level" - }, - "sectionTheme": "테마", - "@sectionTheme": { - "description": "Settings section header" - }, - "@extensionActionFailed": { - "description": "Fallback error when an extension action fails without details" - }, - "@downloadAppleElrcWordSync": { - "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" - }, - "@extensionsNoCustomSearch": { - "description": "Empty state - no search providers" - }, - "@collectionPlaylistRemoveCover": { - "description": "Bottom sheet action to remove custom cover image from a playlist" - }, - "@tutorialWelcomeDesc": { - "description": "Tutorial welcome page description" - }, - "@tutorialSearchDesc": { - "description": "Tutorial search page description" - }, - "collectionAddedToWishlist": "''{trackName}''가 위시리스트에 추가됨", - "@collectionAddedToWishlist": { - "description": "Snackbar after adding track to wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "logAffectedDomains": "영향받은 도메인: {domains}", - "@logAffectedDomains": { - "description": "Affected domains in log issue analysis", - "placeholders": { - "domains": { - "type": "String" - } - } - }, - "@folderOrganizationByArtistSubtitle": { - "description": "Subtitle for artist folder option" - }, - "errorNoTracksFound": "트랙을 찾을 수 없음", - "@errorNoTracksFound": { - "description": "Error - search returned no results" - }, - "providerPriorityTitle": "제공자 우선순위", - "@providerPriorityTitle": { - "description": "Provider priority page title" - }, - "@notifUpdateReadyBody": { - "description": "Notification body when app update is ready to install", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "@settingsExtensions": { - "description": "Settings section - extension management" - }, - "trackDeleteConfirmTitle": "기기에서 제거하시겠습니까?", - "@trackDeleteConfirmTitle": { - "description": "Delete confirmation title" - }, - "@settingsDownloadNetwork": { - "description": "Setting for network type preference" - }, - "downloadProvidersNoneEnabled": "활성화된 제공자가 없음", - "@downloadProvidersNoneEnabled": { - "description": "Shown when no lyrics providers are active" - }, - "@homeEmptySubtitle": { - "description": "Subtitle shown on home when no providers are available yet" - }, - "trackReEnrichFieldBasicTags": "앨범, 앨범 아티스트", - "@trackReEnrichFieldBasicTags": { - "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" - }, - "@audioAnalysisSpectralCutoff": { - "description": "Estimated spectral cutoff metric label" - }, - "@logClearLogsTitle": { - "description": "Clear logs dialog title" - }, - "storageModeSafSubtitle": "SD 카드를 포함한 아무 폴더나 선택하세요", - "@storageModeSafSubtitle": { - "description": "Subtitle for SAF storage mode" - }, - "@notifUpdateProgress": { - "description": "Notification body showing update download progress", - "placeholders": { - "received": { - "type": "String" - }, - "total": { - "type": "String" - }, - "percentage": { - "type": "int" - } - } - }, - "downloadUsePrimaryArtistOnlyEnabled": "폴더 이름에서 피처링 아티스트가 제거됩니다 (예: Justin Bieber, Quavo → Justin Bieber)", - "@downloadUsePrimaryArtistOnlyEnabled": { - "description": "Subtitle when primary artist only is enabled" - }, - "notifScanningLibrary": "로컬 라이브러리를 스캔하는 중", - "@notifScanningLibrary": { - "description": "Notification title while scanning local library" - }, - "@metadataProvidersSubtitle": { - "description": "Subtitle for metadata provider priority item" - }, - "setupGetStarted": "시작하기", - "@setupGetStarted": { - "description": "Final setup button" - }, - "libraryFilterQualityCD": "CD (16bit)", - "@libraryFilterQualityCD": { - "description": "Filter option - CD quality audio" - }, - "sectionLayout": "레이아웃", - "@sectionLayout": { - "description": "Settings section header" - }, - "@tooltipLoveAll": { - "description": "Tooltip for the Love All button on album/playlist screens" - }, - "queueFinalizingDownload": "다운로드를 마무리하는 중", - "@queueFinalizingDownload": { - "description": "Accessibility label for a queue item that is finalizing" - }, - "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", - "@trackConvertActionLabelLossy": { - "description": "Convert button label for lossy conversion", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "extensionsMetadataPriority": "메타데이터 우선순위", - "@extensionsMetadataPriority": { - "description": "Setting - metadata provider order" - }, - "updateCurrent": "현재 버전", - "@updateCurrent": { - "description": "Label for current version" - }, - "@aboutFeatureRequest": { - "description": "Link to suggest features" - }, - "@safMigrationSuccess": { - "description": "Snackbar after successfully migrating to SAF" - }, - "backupRestoreConfirmMessage": "현재 설정, 다운로드 기록, 좋아요 표시한 트랙, 위시리스트 및 재생목록이 백업 파일의 내용으로 대체됩니다. 이 작업은 되돌릴 수 없습니다", - "@cleanupOrphanedDownloadsNone": { - "description": "Snackbar when no orphans found" - }, - "lyricsProviderNeteaseDesc": "NetEase Cloud Music (아시아 노래에 적합)", - "@lyricsProviderNeteaseDesc": { - "description": "Description for Netease provider" - }, - "libraryScanCancelledSubtitle": "준비가 되면 스캔을 다시 시도할 수 있습니다", - "@libraryScanCancelledSubtitle": { - "description": "Library scan status subtitle after cancellation" - }, - "@collectionFavoriteArtists": { - "description": "Custom folder for favorite artists" - }, - "@trackAlbum": { - "description": "Metadata label - album name" - }, - "dialogDeleteSelectedMessage": "기록에서 {count} 개의 {count, plural, =1{트랙} other{트랙}}을 삭제하시겠습니까?\n\n저장소에서도 파일이 삭제됩니다", - "@dialogDeleteSelectedMessage": { - "description": "Dialog message - delete selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackReEnrich": "보강", - "@trackReEnrich": { - "description": "Menu action - re-embed metadata into audio file" - }, - "@lyricsProvidersSaved": { - "description": "Snackbar after saving lyrics provider priority" - }, - "@storageModeSaf": { - "description": "Storage mode option - Storage Access Framework" - }, - "libraryStorageAccessRequired": "저장소 접근 권한 필요", - "@libraryStorageAccessRequired": { - "description": "Dialog title for storage permission" - }, - "@cacheClearAllConfirmTitle": { - "description": "Dialog title before clearing all caches" - }, - "@unknownArtist": { - "description": "Fallback artist name when metadata is missing" - }, - "downloadCreatePlaylistSourceFolderEnabled": "각 재생 목록에 대한 하위 폴더를 만듭니다", - "@downloadCreatePlaylistSourceFolderEnabled": { - "description": "Subtitle when playlist folder is enabled" - }, - "dialogClearHistoryMessage": "모든 다운로드 기록을 지우시겠습니까? 이 작업은 되돌릴 수 없습니다", - "@dialogClearHistoryMessage": { - "description": "Dialog message - clear history confirmation" - }, - "@sectionData": { - "description": "Settings section header" - }, - "audioAnalysisRms": "RMS", - "@audioAnalysisRms": { - "description": "RMS level metric label" - }, - "downloadFilterContributingEnabled": "앨범 아티스트 폴더 이름에서 제거된 참여 아티스트", - "@downloadFilterContributingEnabled": { - "description": "Subtitle when contributing artist filter is on" - }, - "timeJustNow": "방금 전", - "@extensionCustomUrlHandlingShareHint": { - "description": "Extension detail hint explaining share-to-app URL handling" - }, - "cleanupOrphanedDownloads": "불필요한 다운로드 파일 정리", - "@cleanupOrphanedDownloads": { - "description": "Button to remove history entries for deleted files" - }, - "@audioAnalysisNoClipping": { - "description": "Displayed when no clipped samples were detected" - }, - "@tutorialWelcomeTitle": { - "description": "Tutorial welcome page title" - }, - "collectionFavoriteArtists": "좋아하는 아티스트", - "audioAnalysisRescanning": "오디오를 다시 분석하는 중...", - "@audioAnalysisRescanning": { - "description": "Loading text while audio is being re-analyzed after an explicit refresh" - }, - "logTitle": "로그", - "@logTitle": { - "description": "Logs screen title" - }, - "@regionCountryGB": { - "description": "Country name for SongLink region picker" - }, - "@progressFetchingMetadata": { - "description": "Progress indicator - loading track info", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "aboutLogoArtist": "아름다운 로고를 만들어주신 재능 있는 아티스트!", - "@aboutLogoArtist": { - "description": "Role description for logo artist" - }, - "channelPreview": "베타", - "@channelPreview": { - "description": "Update channel - beta/preview releases" - }, - "collectionPlaylistsDeleted": "{count} 개의 {count, plural, =1{재생목록} other{재생목록}}이 삭제됨", - "@collectionPlaylistsDeleted": { - "description": "Snackbar after deleting selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@libraryFilterMetadataMissingGenre": { - "description": "Filter option - items missing genre" - }, - "homeTitle": "홈", - "@homeTitle": { - "description": "Home screen title" - }, - "extensionMinAppVersion": "최소 앱 버전", - "@extensionMinAppVersion": { - "description": "Extension detail - minimum app version" - }, - "backupContentsLiked": "{count} 개의 좋아요 표시한 {count, plural, =1{트랙} other{트랙}}", - "@backupContentsLiked": { - "description": "Backup contents row for liked tracks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "audioAnalysisTruePeak": "트루 피크", - "@audioAnalysisTruePeak": { - "description": "True peak metric label" - }, - "notifDownloadsCanceledBody": "{count, plural, =1{1 개의 다운로드가 사용자에 의해 취소됨} other{{count} 개의 다운로드가 사용자에 의해 취소됨}}", - "@notifDownloadsCanceledBody": { - "description": "Notification body when downloads are canceled by the user", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@dialogRetry": { - "description": "Dialog button - retry action" - }, - "@homeChangeSearchProviderTooltip": { - "description": "Tooltip for the Home search provider picker" - }, - "@sectionLyricsProviderOptions": { - "description": "Settings section header for per-provider lyrics options" - }, - "@trackReEnrichSuccessWithFailures": { - "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", - "placeholders": { - "successCount": { - "type": "int" - }, - "total": { - "type": "int" - }, - "failedCount": { - "type": "int" - } - } - }, - "previewUnavailable": "미리듣기를 사용할 수 없음", - "@previewUnavailable": { - "description": "Snackbar shown when a track preview snippet cannot be played" - }, - "nowPlayingTabPlayer": "플레이어", - "@nowPlayingTabPlayer": { - "description": "Tab label for the player view" - }, - "backupContentsPlaylists": "{count, plural, =1{1 개의 재생목록} other{{count} 개의 재생목록}}", - "@backupContentsPlaylists": { - "description": "Backup contents row for playlist count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryLastScannedNever": "절대 안 함", - "@libraryLastScannedNever": { - "description": "Shown when library has never been scanned" - }, - "trackTrackNumber": "트랙 번호", - "@trackTrackNumber": { - "description": "Metadata label - track number" - }, - "trackReplayGainScanning": "음량을 분석하는 중...", - "@trackReplayGainScanning": { - "description": "Snackbar/progress message while scanning ReplayGain for a single track" - }, - "downloadLossyMp3": "MP3 320kbps", - "@downloadLossyMp3": { - "description": "Lossy format option - MP3 320kbps" - }, - "@albumFolderArtistAlbumSingles": { - "description": "Album folder option with singles inside artist" - }, - "@extensionHealthNotConfigured": { - "description": "Extension service health status - not configured" - }, - "@downloadSeparateSinglesDisabled": { - "description": "Subtitle when separate singles folder is off" - }, - "downloadCreatePlaylistSourceFolder": "재생목록 소스 폴더", - "@downloadCreatePlaylistSourceFolder": { - "description": "Setting to create a subfolder per playlist source" - }, - "@trackReleaseDate": { - "description": "Metadata label - release date" - }, - "aboutContributors": "개발에 힘써주신 분들", - "@aboutContributors": { - "description": "Section for contributors" - }, - "@audioAnalysisMono": { - "description": "Audio channel layout label - mono" - }, - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, - "@audioAnalysisNyquist": { - "description": "Nyquist frequency metric label" - }, - "permissionStorage": "저장소", - "@permissionStorage": { - "description": "Storage permission type label" - }, - "permissionAudio": "오디오", - "@permissionAudio": { - "description": "Audio permission type label" - }, - "@libraryScanSubtitle": { - "description": "Subtitle for scan button" - }, - "@snackbarUnsupportedAudioFormat": { - "description": "Snackbar when the audio format is not supported for the requested operation" - }, - "@notifLibraryScanStopped": { - "description": "Notification body when library scan is cancelled" - }, - "@downloadMusixmatchAuto": { - "description": "Button to clear Musixmatch language (use auto)" - }, - "@trackLyricsTimeout": { - "description": "Message when lyrics request times out" - }, - "@trackReEnrichFieldReleaseInfo": { - "description": "Checkbox label for release info in re-enrich" - }, - "@regionCountryXK": { - "description": "Country name for SongLink region picker" - }, - "aboutTelegramChatSubtitle": "다른 이용자와 소통", - "@aboutTelegramChatSubtitle": { - "description": "Subtitle for Telegram chat" - }, - "selectionAllPlaylistsSelected": "모든 재생목록이 선택됨", - "@selectionAllPlaylistsSelected": { - "description": "Shown when all playlists are selected in selection mode" - }, - "cacheTrackLookupDesc": "Spotify/Deezer 트랙 ID을 조회합니다. 지우면 속도가 느려질 수 있습니다", - "@cacheTrackLookupDesc": { - "description": "Description of what track lookup cache contains" - }, - "@unknownAlbum": { - "description": "Fallback album name when metadata is missing" - }, - "@extensionsErrorLoading": { - "description": "Error message when extension fails to load" - }, - "@cacheTitle": { - "description": "Cache management page title" - }, - "@downloadFilenameFormat": { - "description": "Setting for output filename pattern" - }, - "errorUrlNotRecognized": "링크를 인식할 수 없음", - "@errorUrlNotRecognized": { - "description": "Error title - URL not handled by any extension or service" - }, - "downloadAppleElrcWordSync": "Apple Music eLRC 단어 동기화", - "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { - "description": "Subtitle when album artist is used for folder names" - }, - "@qualityFlacLossless": { - "description": "Quality option - CD quality FLAC" - }, - "downloadNeteaseIncludeTranslationEnabled": "중국어 번역 포함", - "@downloadNeteaseIncludeTranslationEnabled": { - "description": "Subtitle when Netease translation is on" - }, - "collectionLovedEmptySubtitle": "트랙에 하트를 탭하여 '좋아요'를 유지하세요", - "@collectionLovedEmptySubtitle": { - "description": "Loved empty state subtitle" - }, - "@libraryBuiltInPlayerInfo": { - "description": "Info note explaining the built-in player is for previews only" - }, - "@notifLibraryScanProgressNoTotal": { - "description": "Notification body for library scan progress when total is unknown", - "placeholders": { - "scanned": { - "type": "int" - }, - "percentage": { - "type": "int" - } - } - }, - "@tutorialSearchTitle": { - "description": "Tutorial search page title" - }, - "trackReEnrichSuccessWithFailures": "메타데이터 재구성 성공 ({successCount}/{total}) - 실패: {failedCount}", - "@a11yTrackByArtist": { - "description": "Accessibility label for a queue or list track item", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "libraryFilterMetadataMissingLabel": "레이블 누락", - "@libraryFilterMetadataMissingLabel": { - "description": "Filter option - items missing record label" - }, - "@badgeBeta": { - "description": "Badge label for beta features" - }, - "@audioAnalysisLufs": { - "description": "Integrated loudness metric label" - }, - "trackMetadata": "메타데이터", - "@trackMetadata": { - "description": "Tab title - track metadata" - }, - "trackOptionRemoveFromLoved": "좋아요 표시한 트랙에서 제거", - "@trackOptionRemoveFromLoved": { - "description": "Bottom sheet action label - remove track from loved folder" - }, - "@aboutTelegramChat": { - "description": "Link to Telegram chat group" - }, - "@trackCopiedToClipboard": { - "description": "Snackbar - content copied" - }, - "aboutKeepAndroidOpen": "Keep Android Open", - "@aboutKeepAndroidOpen": { - "description": "Link to Keep Android Open campaign website" - }, - "@lyricsProvidersDisabledSection": { - "description": "Section header for disabled providers", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@downloadAllowLocalNetwork": { - "description": "Setting title for allowing requests to private/local network targets" - }, - "@openInOtherServices": { - "description": "Title and tooltip for finding the current collection in other services" - }, - "@extensionVerificationBrowserInApp": { - "description": "Chip label for in-app browser verification mode" - }, - "sectionSearchSource": "검색 출처", - "@sectionSearchSource": { - "description": "Settings section header" - }, - "allFilesAccess": "모든 파일 접근", - "@allFilesAccess": { - "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" - }, - "extensionsInstalledCount": "{count} 개의 확장 프로그램 설치 성공", - "@extensionsInstalledCount": { - "description": "Success message after installing multiple extensions", - "placeholders": { - "count": { - "type": "int", - "description": "Number of installed extensions" - } - } - }, - "snackbarFailedToEmbedLyrics": "가사 삽입 실패", - "@snackbarFailedToEmbedLyrics": { - "description": "Snackbar when lyrics embedding fails" - }, - "@lyricsProviderMusixmatchDesc": { - "description": "Description for Musixmatch provider" - }, - "queueRateLimitTitle": "서비스 사용 제한됨", - "@queueRateLimitTitle": { - "description": "Title shown on a failed queue item when the download service rate limits requests" - }, - "@notifDownloadComplete": { - "description": "Notification title when a single download is complete" - }, - "@homeSupports": { - "description": "Info text about supported URL types" - }, - "notifDownloadsCanceledTitle": "다운로드 취소됨", - "@notifDownloadsCanceledTitle": { - "description": "Notification title when downloads are canceled by the user" - }, - "@lyricsModeEmbedSubtitle": { - "description": "Subtitle for embed option" - }, - "optionsReplayGain": "리플레이게인", - "@optionsReplayGain": { - "description": "Title for ReplayGain setting toggle" - }, - "@storeLoadError": { - "description": "Error heading when the store cannot be loaded" - }, - "@trackArtist": { - "description": "Metadata label - artist name" - }, - "cacheCoverImageDesc": "다운로드된 앨범 및 트랙 표지 이미지입니다. 볼 때 다시 다운로드됩니다", - "@cacheCoverImageDesc": { - "description": "Description of what cover image cache contains" - }, - "queueClearAll": "모두 지우기", - "@queueClearAll": { - "description": "Button - clear all queue items" - }, - "downloadUsePrimaryArtistOnlyDisabled": "폴더 이름에 전체 아티스트 문자열이 사용됩니다", - "@downloadUsePrimaryArtistOnlyDisabled": { - "description": "Subtitle when primary artist only is disabled" - }, - "backupImportSectionTitle": "백업 복원", - "@backupImportSectionTitle": { - "description": "Section title for the import/restore card" - }, - "@downloadMusixmatchLanguageHint": { - "description": "Placeholder for Musixmatch language input" - }, - "collectionRemoveFromFolder": "폴더에서 제거", - "@collectionRemoveFromFolder": { - "description": "Tooltip for removing track from wishlist/loved folder" - }, - "storeFilterMetadata": "메타데이터", - "@storeFilterMetadata": { - "description": "Store filter - metadata providers" - }, - "shareSheetCopyLink": "링크 복사", - "errorRateLimitedMessage": "요청이 너무 많습니다. 잠시 후 다시 검색해 주세요", - "@errorRateLimitedMessage": { - "description": "Error message - rate limit explanation" - }, - "libraryFilterSortGenreDesc": "장르 (내림차순)", - "@libraryFilterSortGenreDesc": { - "description": "Sort option - genre descending" - }, - "trackFileNotFound": "파일을 찾을 수 없음", - "@trackFileNotFound": { - "description": "Error - file doesn't exist" - }, - "@queueEmptySinglesSubtitle": { - "description": "Empty state subtitle for single track downloads" - }, - "@queueDownloadStarting": { - "description": "Queue status before download progress is available" - }, - "metadataProviderPriorityInfo": "Deezer는 요청 횟수 제한이 없으므로 기본 앱으로 사용하는 것이 좋습니다. Spotify는 요청 횟수가 많아지면 요청 횟수를 제한할 수 있습니다", - "@metadataProviderPriorityInfo": { - "description": "Info tip about rate limits" - }, - "aboutPCSource": "PC 소스 코드", - "@aboutPCSource": { - "description": "Link to PC GitHub repo" - }, - "editMetadataAutoFill": "온라인에서 자동 채우기", - "@editMetadataAutoFill": { - "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" - }, - "snackbarDeletedTracks": "{count} 개의 {count, plural, =1{트랙} other{트랙}}이 제거됨", - "@snackbarDeletedTracks": { - "description": "Snackbar - tracks deleted", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@extensionHealthServiceDegraded": { - "description": "Tooltip for degraded extension service" - }, - "lyricsProviderLrclibDesc": "오픈 소스 동기화 가사 데이터베이스", - "@lyricsProviderLrclibDesc": { - "description": "Description for LRCLIB provider" - }, - "downloadMusixmatchLanguageDesc": "Musixmatch에서 번역된 가사를 요청하려면 BCP-47 언어 코드를 입력하세요 (예시: en, de, ja)", - "@downloadMusixmatchLanguageDesc": { - "description": "Description in Musixmatch language picker" - }, - "@optionsEmbedMetadataSubtitleOn": { - "description": "Subtitle when metadata embedding is enabled" - }, - "@setupSkipForNow": { - "description": "Skip button text" - }, - "@a11ySelectTrack": { - "description": "Accessibility label for selecting a track" - }, - "@folderOrganizationByAlbumSubtitle": { - "description": "Subtitle for album folder option" - }, - "downloadLossyAac": "AAC/M4A 320kbps", - "@extensionVerificationBrowserTitle": { - "description": "Settings option title for extension verification browser preference" - }, - "@backupContentsExtensions": { - "description": "Backup contents row for installed extensions count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarUrlCopied": "{platform} 링크가 클립보드에 저장됨", - "@snackbarUrlCopied": { - "description": "Snackbar - URL copied", - "placeholders": { - "platform": { - "type": "String", - "description": "Platform name (Spotify/Deezer)" - } - } - }, - "aboutBinimumDesc": "QQDL 및 HiFi API 개발자입니다. 이 프로젝트는 무손실 다운로드 지원을 형성하는 데 도움을 주셨습니다", - "@aboutBinimumDesc": { - "description": "Credit description for binimum" - }, - "discographyFetchingAlbum": "{total} 개 중 {current} 개를 가져오는 중...", - "@discographyFetchingAlbum": { - "description": "Progress - fetching specific album", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "logAutoScrollOn": "자동 스크롤: ON", - "@logAutoScrollOn": { - "description": "Tooltip when auto-scroll is enabled on the log screen" - }, - "@settingsMetadataSubtitle": { - "description": "Subtitle for metadata settings" - }, - "@regionCountryBR": { - "description": "Country name for SongLink region picker" - }, - "@lyricsProvidersTitle": { - "description": "Settings item title for lyrics provider order" - }, - "trackMetadataService": "제공자", - "@trackMetadataService": { - "description": "Metadata field - download service used" - }, - "discographyAddedToQueue": "다운로드 목록에 {count} 개의 트랙이 추가됨", - "cueSplitTrackCount": "{count} 개의 트랙", - "@cueSplitTrackCount": { - "description": "Number of tracks in CUE sheet", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogImportPlaylistTitle": "재생목록 가져오기", - "@dialogImportPlaylistTitle": { - "description": "Dialog title - import CSV playlist" - }, - "@cleanupOrphanedDownloadsSubtitle": { - "description": "Subtitle for orphaned cleanup button" - }, - "settingsLocalLibrary": "로컬 라이브러리", - "@settingsLocalLibrary": { - "description": "Settings menu item - local library" - }, - "@metadataSaveFailedStorage": { - "description": "Snackbar error when writing metadata file back to storage fails" - }, - "logCopyLogs": "로그 복사", - "@logCopyLogs": { - "description": "Tooltip for copying logs" - }, - "downloadNetworkWifiOnlySubtitle": "모바일 네트워크 사용 시 다운로드 일시 중지", - "@downloadNetworkWifiOnlySubtitle": { - "description": "Subtitle for WiFi-only option in picker" - }, - "@lyricsModeBothSubtitle": { - "description": "Subtitle for both option" - }, - "@collectionAlreadyInPlaylist": { - "description": "Snackbar when track already exists in playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "@collectionFoldersTitle": { - "description": "Library section title for custom folders" - }, - "searchSortDateNewest": "발매일자 (최신순)", - "@searchSortDateNewest": { - "description": "Sort option - newest release first" - }, - "downloadDeduplicationDisabled": "기록과 관계없이 모든 트랙이 다운로드됩니다", - "@downloadDeduplicationDisabled": { - "description": "Subtitle when deduplication is off" - }, - "@recentTypeAlbum": { - "description": "Recent access item type - album" - }, - "nowPlayingPlayInOrder": "순서대로 재생", - "@nowPlayingPlayInOrder": { - "description": "Tooltip when shuffle mode is disabled" - }, - "@cueSplitConfirmMessage": { - "description": "CUE split confirmation dialog message", - "placeholders": { - "album": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "@audioAnalysisFileSize": { - "description": "File size metric label" - }, - "artistSingles": "싱글 및 EP", - "@artistSingles": { - "description": "Section header for singles/EPs" - }, - "@snackbarProviderPrioritySaved": { - "description": "Snackbar - provider order saved" - }, - "@recentPlaylistInfo": { - "description": "Snackbar message when tapping playlist in recent access", - "placeholders": { - "name": { - "type": "String", - "description": "Playlist name" - } - } - }, - "@lyricsProviderLyricsPlusDesc": { - "description": "Description for LyricsPlus provider" - }, - "@libraryFilterDownloaded": { - "description": "Filter chip - show only downloaded items" - }, - "recentPlaylistInfo": "재생목록: {name}", - "@optionsReplayGainSubtitleOn": { - "description": "Subtitle when ReplayGain is enabled" - }, - "@actionCreate": { - "description": "Generic action button - create" - }, - "@downloadSelectQuality": { - "description": "Dialog title - choose audio quality" - }, - "cueSplitAlbum": "앨범: {album}", - "@cueSplitAlbum": { - "description": "Album name in CUE split sheet", - "placeholders": { - "album": { - "type": "String" - } - } - }, - "@trackCoverNoSource": { - "description": "Snackbar when no cover art URL or embedded cover" - }, - "@storeRepoUrlLabel": { - "description": "Label for the repository URL input field" - }, - "@notifLibraryScanCompleteBody": { - "description": "Notification body for library scan complete - number of indexed tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "optionsDetailedLogging": "상세 로깅", - "@optionsDetailedLogging": { - "description": "Enable verbose logs for debugging" - }, - "@lyricsProvidersDiscardContent": { - "description": "Body text of the discard-changes dialog on lyrics provider page" - }, - "@dialogDisableHistoryTitle": { - "description": "Confirmation dialog title shown before disabling download history" - }, - "downloadLossyOpus128Subtitle": "트랙당 최소 크기, 약 4MB", - "@downloadLossyOpus128Subtitle": { - "description": "Subtitle for Opus 128kbps lossy option" - }, - "@appName": { - "description": "App name - DO NOT TRANSLATE" - }, - "libraryActions": "작업", - "@libraryActions": { - "description": "Section header for library actions" - }, - "setupNoFolderSelected": "선택된 폴더가 없습니다. 기본 음악 폴더를 사용하시겠습니까?", - "@setupNoFolderSelected": { - "description": "Prompt when no folder selected" - }, - "downloadMusixmatchLanguageHint": "예시: en, de, ja", - "trackSaveFailed": "실패: {error}", - "@trackSaveFailed": { - "description": "Snackbar when save operation fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "replayGainBatchConfirmTitle": "리플레이게인 추가", - "@replayGainBatchConfirmTitle": { - "description": "Title of the batch ReplayGain confirmation dialog" - }, - "tutorialExtensionsTip1": "유용한 확장 프로그램을 찾으려면 리포 탭을 탐색하세요", - "@tutorialExtensionsTip1": { - "description": "Tutorial extensions tip 1" - }, - "@trackAddToQueue": { - "description": "Menu action to add a track to the playback queue" - }, - "@cacheTrackLookup": { - "description": "Cache item title for track ID lookup cache" - }, - "@discographyNoAlbums": { - "description": "Error - no albums found for artist" - }, - "@updateLater": { - "description": "Update button - dismiss" - }, - "@snackbarFailedToInstall": { - "description": "Snackbar - extension install error" - }, - "@albumFolderArtistAlbumFlatSubtitle": { - "description": "Folder structure example for flat singles" - }, - "@errorMissingExtensionSource": { - "description": "Error - extension source not available", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "libraryFilterSortAlbumAsc": "앨범 (오름차순)", - "@libraryFilterSortAlbumAsc": { - "description": "Sort option - album ascending" - }, - "@queueTrackCount": { - "description": "Track count label with plural support", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "audioAnalysisMono": "모노", - "@trackLyricsSource": { - "description": "Label showing the lyrics source/provider", - "placeholders": { - "source": { - "type": "String" - } - } - }, - "@lyricsModeEmbed": { - "description": "Lyrics mode option - embed in audio file" - }, - "@storeRepoDialogCurrent": { - "description": "Label shown above the current repository URL in the dialog" - }, - "@cacheRefreshStats": { - "description": "Button label to refresh cache statistics" - }, - "lyricsProviderAppleMusicDesc": "단어별 동기화 가사 (프록시 경유)", - "@lyricsProviderAppleMusicDesc": { - "description": "Description for Apple Music provider" - }, - "@downloadDeduplication": { - "description": "Setting - skip tracks already in download history" - }, - "updateFailedMessage": "업데이트 다운로드 실패", - "@updateFailedMessage": { - "description": "Update error message" - }, - "cacheEstimatedTotal": "예상 캐시 사용량: {size}", - "@cacheEstimatedTotal": { - "description": "Total cache size shown in summary", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "@aboutVersion": { - "description": "Version info label" - }, - "dialogRetry": "다시 시도", - "@cueSplitSplitting": { - "description": "Snackbar while splitting CUE", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "@searchSortTitleZA": { - "description": "Sort option - title descending" - }, - "tutorialLibraryTip2": "음악 플레이어로 재생하려면 아무 트랙이나 탭하세요", - "@tutorialLibraryTip2": { - "description": "Tutorial library tip 2" - }, - "extensionHealthServiceOffline": "서비스 오프라인", - "@extensionHealthServiceOffline": { - "description": "Tooltip for offline extension service" - }, - "actionDeselect": "선택 해제", - "@actionDeselect": { - "description": "Action button - deselect all" - }, - "@trackConvertOriginal": { - "description": "Label for keeping original bit depth or sample rate during conversion" - }, - "@libraryClearConfirmTitle": { - "description": "Dialog title for clear confirmation" - }, - "@dialogDownloadAllMessage": { - "description": "Body of the Download All confirmation dialog", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "homeSupports": "지원 항목: 트랙, 앨범, 재생목록, 아티스트 URL", - "@downloadedAlbumDeleteSelected": { - "description": "Button - delete selected tracks" - }, - "@recentShowAllDownloads": { - "description": "Button label to unhide hidden downloads in recent access" - }, - "artistOptionRemoveFromFavorites": "즐겨찾는 아티스트에서 제거", - "@artistOptionRemoveFromFavorites": { - "description": "Action label - remove artist from favorite artists" - }, - "collectionPlaylistEmptyTitle": "재생목록이 비어 있음", - "@collectionPlaylistEmptyTitle": { - "description": "Playlist empty state title" - }, - "libraryFilterSortLatest": "최신순", - "@libraryFilterSortLatest": { - "description": "Sort option - newest first" - }, - "@libraryFilterMetadataMissingYear": { - "description": "Filter option - items missing release year/date" - }, - "@selectionSelected": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@tracksCount": { - "description": "Track count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@optionsCheckUpdates": { - "description": "Auto update check toggle" - }, - "@qualityHiResFlacMaxSubtitle": { - "description": "Technical spec for hi-res max" - }, - "actionStop": "중지", - "@actionStop": { - "description": "Generic action - stop" - }, - "@selectionSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "folderOrganizationNoneSubtitle": "다운로드 폴더의 모든 파일", - "@folderOrganizationNoneSubtitle": { - "description": "Subtitle for no organization option" - }, - "@updateDownloading": { - "description": "Update status - downloading" - }, - "artistAlbums": "앨범", - "@artistAlbums": { - "description": "Section header for artist albums" - }, - "trackConvertDitherTriangular": "TPDF", - "@trackConvertDitherTriangular": { - "description": "Lossless conversion triangular probability density function dither option" - }, - "nowPlayingShuffleLibraryFailed": "라이브러리에서 셔플을 사용할 수 없음: {error}", - "@nowPlayingShuffleLibraryFailed": { - "description": "Snackbar when shuffling the library fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "@setupIcloudNotSupported": { - "description": "Error when user selects iCloud Drive on iOS" - }, - "@optionsArtistTagModeSplitVorbis": { - "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" - }, - "@extensionsProviderPrioritySection": { - "description": "Section header - provider priority" - }, - "@libraryShowDuplicateIndicatorSubtitle": { - "description": "Subtitle for duplicate indicator toggle" - }, - "sectionDuplicates": "중복", - "@sectionDuplicates": { - "description": "Settings section header for deduplication" - }, - "@backupTitle": { - "description": "App bar title for the backup and restore page" - }, - "trackCoverReplaceNotice": "저장을 탭하면 선택한 표지가 현재 내장된 표지를 대체합니다", - "cacheSectionMaintenance": "유지 관리", - "@cacheSectionMaintenance": { - "description": "Section header for cleanup actions" - }, - "@editMetadataFieldGenre": { - "description": "Chip label for genre field in auto-fill selector" - }, - "@extensionsFallbackSubtitle": { - "description": "Subtitle for download fallback extensions menu" - }, - "selectionBatchConvertConfirmMessage": "{count} 개의 {count, plural, =1{트랙} other{트랙}}을 {bitrate} 비트레이트로 {format}으로 변환하시겠습니까?\n\n변환 후 원본 파일이 삭제됩니다", - "@selectionBatchConvertConfirmMessage": { - "description": "Confirmation dialog message for batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "@selectionTapPlaylistsToSelect": { - "description": "Hint shown in playlist selection mode" - }, - "qualityHiResFlacMaxSubtitle": "24-bit / 최대 192kHz", - "snackbarRemovedTracksFromLoved": "'좋아요 표시한 트랙'에서 {count} 개의 트랙이 제거됨", - "@snackbarRemovedTracksFromLoved": { - "description": "Snackbar after removing multiple tracks from Loved folder", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "folderOrganizationByArtistAlbum": "아티스트/앨범", - "@folderOrganizationByArtistAlbum": { - "description": "Folder option - nested folders" - }, - "snackbarCannotOpenFile": "파일을 열 수 없음: {error}", - "@snackbarCannotOpenFile": { - "description": "Snackbar - file open error", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "@optionsDetailedLoggingOff": { - "description": "Status when logging disabled" - }, - "@setupStorageDescription": { - "description": "Explanation for storage permission" - }, - "audioAnalysisCodec": "코덱", - "@regionCountryFR": { - "description": "Country name for SongLink region picker" - }, - "@optionsArtistTagMode": { - "description": "Setting title for how artist metadata is written into files" - }, - "@libraryClearConfirmMessage": { - "description": "Dialog message for clear confirmation" - }, - "trackLyricsNotAvailable": "이 트랙의 가사를 사용할 수 없습니다", - "@trackLyricsNotAvailable": { - "description": "Message when lyrics not found" - }, - "storeFilterUtility": "유틸리티", - "@storeFilterUtility": { - "description": "Store filter - utility extensions" - }, - "collectionAddedToPlaylist": "''{playlistName}''에 추가됨", - "@collectionAddedToPlaylist": { - "description": "Snackbar after adding track to playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "cacheClearConfirmTitle": "캐시를 지우시겠습니까?", - "@cacheClearConfirmTitle": { - "description": "Dialog title before clearing one cache category" - }, - "@downloadAppleElrcWordSyncDisabled": { - "description": "Subtitle when Apple Music eLRC word sync is disabled" - }, - "@aboutMobileDeveloper": { - "description": "Role description for mobile dev" - }, - "albumFolderYearAlbum": "[연도] 앨범", - "@albumFolderYearAlbum": { - "description": "Album folder option with year" - }, - "cacheTitle": "저장소 & 캐시", - "@extensionPostProcessing": { - "description": "Capability - post-download processing" - }, - "extensionsNoMetadataProvider": "메타데이터 제공자가 있는 확장 프로그램이 없음", - "@extensionsNoMetadataProvider": { - "description": "Empty state - no metadata providers" - }, - "searchSortTitleZA": "제목 (내림차순)", - "@queueClearAllMessage": { - "description": "Clear queue confirmation" - }, - "audioAnalysisTitle": "오디오 음질 분석", - "@audioAnalysisTitle": { - "description": "Title for audio analysis section" - }, - "@aboutReportIssueSubtitle": { - "description": "Subtitle for report issue" - }, - "@audioAnalysisSampleRate": { - "description": "Sample rate metric label" - }, - "@discographySelectedCount": { - "description": "Selection count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", - "@qualityFlacLosslessSubtitle": { - "description": "Technical spec for lossless" - }, - "libraryScanFinalizing": "라이브러리를 마무리하는 중...", - "@libraryScanFinalizing": { - "description": "Status shown after file scanning finishes but library persistence is still running" - }, - "@trackEditMetadata": { - "description": "Menu action - edit embedded metadata" - }, - "@downloadNeteaseIncludeRomanization": { - "description": "Setting to include romanized lyrics from Netease" - }, - "@optionsArtistTagModeJoinedSubtitle": { - "description": "Subtitle for joined artist tag mode" - }, - "regionCountryDE": "독일", - "@regionCountryDE": { - "description": "Country name for SongLink region picker" - }, - "optionsAutoFallback": "자동 대체", - "@optionsAutoFallback": { - "description": "Auto-retry with other services" - }, - "@trackMetadataPlay": { - "description": "Action button - play track" - }, - "settingsFiles": "파일 & 폴더", - "@settingsFiles": { - "description": "Settings menu item - file and folder settings" - }, - "aboutMobileDeveloper": "모바일 버전 개발자", - "@trackDownloaded": { - "description": "Metadata label - download date" - }, - "homeSkipAlreadyDownloaded": "이미 다운로드한 노래 건너뛰기", - "@homeSkipAlreadyDownloaded": { - "description": "Checkbox label in import dialog to skip already-downloaded songs" - }, - "dialogUninstall": "삭제", - "@dialogUninstall": { - "description": "Dialog button - uninstall extension" - }, - "collectionDeletePlaylist": "재생목록 삭제", - "@collectionDeletePlaylist": { - "description": "Action to delete playlist" - }, - "trackCoverOnline": "온라인 표지", - "@trackCoverOnline": { - "description": "Label shown when metadata autofill downloaded cover art from the internet" - }, - "downloadTitle": "다운로드", - "@downloadTitle": { - "description": "Download settings page title" - }, - "searchArtists": "아티스트", - "@searchArtists": { - "description": "Search result category - artists" - }, - "extensionUrlHandler": "URL 핸들러", - "@extensionUrlHandler": { - "description": "Capability - handles URLs" - }, - "@timeHoursAgo": { - "description": "Relative time - hours ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "editMetadataAdvanced": "고급", - "@editMetadataAdvanced": { - "description": "Expandable section label for advanced metadata fields" - }, - "@actionSelectAll": { - "description": "Action button - select all items" - }, - "timeMinutesAgo": "{count, plural, =1{1 분 전} other{{count} 분 전}}", - "@timeMinutesAgo": { - "description": "Relative time - minutes ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "regionCountryXK": "코소보", - "@downloadAskQualitySubtitle": { - "description": "Subtitle for ask quality toggle" - }, - "setupLanguageSystemDefault": "시스템 기본값", - "@setupLanguageSystemDefault": { - "description": "Option to use the system language" - }, - "@updateAvailable": { - "description": "Update dialog title" - }, - "cacheEntries": "{count} 개의 항목", - "@cacheEntries": { - "description": "Track cache entry count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@notifLibraryScanExcluded": { - "description": "Library scan complete suffix - excluded track count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionsMetadataPrioritySubtitle": "검색 & 메타데이터 출처 순서 설정", - "@extensionsMetadataPrioritySubtitle": { - "description": "Subtitle for metadata priority" - }, - "downloadedAlbumSelectToDelete": "삭제할 트랙 선택", - "@downloadedAlbumSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "@dialogClearHistoryTitle": { - "description": "Dialog title - clear download history" - }, - "tutorialSettingsTip1": "다운로드 위치 및 폴더 구성 변경", - "@tutorialSettingsTip1": { - "description": "Tutorial settings tip 1" - }, - "@extensionsInstalledSuccess": { - "description": "Success message after install" - }, - "allFilesAccessDisabledSubtitle": "미디어 폴더에만 제한됨", - "@allFilesAccessDisabledSubtitle": { - "description": "Subtitle when all files access is disabled" - }, - "@appearanceHistoryViewList": { - "description": "List layout option" - }, - "@notifAlreadyInLibraryCount": { - "description": "Notification title when track is already in library, with count", - "placeholders": { - "completed": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "@libraryFilterAll": { - "description": "Filter chip - show all library items" - }, - "settingsDownload": "다운로드", - "settingsFilesSubtitle": "다운로드 위치, 파일 이름, 폴더 구조", - "@settingsFilesSubtitle": { - "description": "Subtitle for files & folders settings" - }, - "@libraryFilterSort": { - "description": "Filter section - sort order" - }, - "metadataProvidersSubtitle": "드래그하여 검색 및 메타데이터 출처 순서를 설정하세요", - "@extensionPermissions": { - "description": "Section header - required permissions" - }, - "selectionSelectToDelete": "삭제할 트랙을 선택", - "@libraryExternalPlayerSubtitle": { - "description": "Subtitle for external player option" - }, - "extensionVerificationOpenBrowser": "브라우저 열기", - "@extensionVerificationOpenBrowser": { - "description": "Button to open the extension verification URL in a browser" - }, - "@trackConvertConfirmMessageLossless": { - "description": "Confirmation dialog message for lossless-to-lossless conversion", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - } - } - }, - "@snackbarAddedTracksToQueue": { - "description": "Snackbar - multiple tracks added to queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@backupContentsWishlist": { - "description": "Backup contents row for wishlist tracks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@cacheCleanupUnusedSubtitle": { - "description": "Subtitle for cleanup unused data action" - }, - "trackLabel": "레이블", - "@trackLabel": { - "description": "Metadata label - record label" - }, - "@collectionAddedToLoved": { - "description": "Snackbar after adding track to loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "regionCountryGB": "영국", - "dialogCancel": "취소", - "@dialogCancel": { - "description": "Dialog button - cancel action" - }, - "@folderOrganizationByArtistAlbumSubtitle": { - "description": "Subtitle for nested folder option" - }, - "@notifAllDownloadsComplete": { - "description": "Notification title when all downloads finish successfully" - }, - "setupEnableNotifications": "알림 활성화", - "@setupEnableNotifications": { - "description": "Button to enable notifications" - }, - "@notifFinalizingTrack": { - "description": "Notification title while finalizing (embedding metadata) a track", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "@downloadLossy320FormatDesc": { - "description": "Description in the lossy format picker" - }, - "filenameFormat": "파일 이름 형식", - "@filenameFormat": { - "description": "Setting title - filename pattern" - }, - "historySearchHint": "기록 검색...", - "@historySearchHint": { - "description": "Search bar placeholder in history" - }, - "@tutorialReadyMessage": { - "description": "Tutorial completion message" - }, - "cacheTempDirectoryDesc": "다운로드 및 오디오 변환으로 생성된 임시 파일", - "@cacheTempDirectoryDesc": { - "description": "Description of what temporary directory contains" - }, - "@trackSaveLyrics": { - "description": "Menu action - save lyrics as .lrc file" - }, - "@notifDownloadsFinished": { - "description": "Notification title when queue finishes with some failures", - "placeholders": { - "completed": { - "type": "int" - }, - "failed": { - "type": "int" - } - } - }, - "@historyFilterAlbums": { - "description": "Filter chip - show albums only" - }, - "trackEmbedLyrics": "가사 삽입", - "@trackEmbedLyrics": { - "description": "Action - embed lyrics into audio file" - }, - "@downloadPrimaryArtistOnlyOff": { - "description": "Status label when primary-artist-only folder naming is disabled" - }, - "@trackReEnrichFieldTrackInfo": { - "description": "Checkbox label for track info in re-enrich" - }, - "snackbarHistoryCleared": "기록 삭제됨", - "downloadNetworkCompatibilityModeDisabled": "표준 ​​네트워크 설정 사용", - "@artistPopular": { - "description": "Section header for popular/top tracks" - }, - "@trackFetchOnlineLyrics": { - "description": "Action - fetch lyrics from online providers" - }, - "extensionLyricsProvider": "가사 제공자", - "@extensionLyricsProvider": { - "description": "Capability - provides lyrics" - }, - "historyFilterAll": "모두", - "@historyFilterAll": { - "description": "Filter chip - show all items" - }, - "tutorialSearchTitle": "음악 찾기", - "@lyricsModeExternal": { - "description": "Lyrics mode option - separate LRC file" - }, - "@actionDismiss": { - "description": "Generic action - dismiss" - }, - "trackOpenInSpotify": "Spotify에서 열기", - "@trackOpenInSpotify": { - "description": "Action - open track in Spotify app" - }, - "@libraryClear": { - "description": "Button to clear all library entries" - }, - "discographyFailedToFetch": "일부 앨범 가져오기 실패", - "@filenameShowAdvancedTagsDescription": { - "description": "Description for advanced filename tag toggle" - }, - "@storeUpdate": { - "description": "Update available button" - }, - "collectionPlaylistTracks": "{count, plural, =1{1 개의 트랙} other{{count} 개의 트랙}}", - "@collectionPlaylistTracks": { - "description": "Track count label for custom playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "optionsPrimaryProviderSubtitle": "트랙 또는 앨범 이름으로 검색하는 데 사용되는 서비스", - "@optionsPrimaryProviderSubtitle": { - "description": "Subtitle for primary provider" - }, - "@downloadEmbedLyricsDisabled": { - "description": "Subtitle when lyrics embedding is blocked by metadata toggle" - }, - "@librarySourceLocal": { - "description": "Badge for tracks from local library scan" - }, - "@searchSortDurationLong": { - "description": "Sort option - longest duration first" - }, - "@downloadFilterContributingDisabled": { - "description": "Subtitle when contributing artist filter is off" - }, - "queueDownloadingCount": "다운로드하는 중 ({count})", - "@queueDownloadingCount": { - "description": "Header for active downloads section with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionVerificationBrowserInApp": "내부", - "trackAudioQuality": "오디오 음질", - "@trackAudioQuality": { - "description": "Metadata label - audio quality" - }, - "libraryRemovedMissingFiles": "라이브러리에서 누락된 파일 {count} 개가 제거됨", - "@libraryRemovedMissingFiles": { - "description": "Snackbar after cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionFavoriteArtistsEmptyTitle": "아직 좋아하는 아티스트가 없음", - "@collectionFavoriteArtistsEmptyTitle": { - "description": "Favorite artists empty state title" - }, - "@errorInvalidFolderSelected": { - "description": "Error when the selected folder is invalid" - }, - "@searchSortArtistZA": { - "description": "Sort option - artist descending" - }, - "snackbarAddedTracksToLoved": "'좋아요 표시한 트랙'에 {count} 개의 트랙이 추가됨", - "@snackbarAddedTracksToLoved": { - "description": "Snackbar after adding multiple tracks to Loved folder", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cancelDownloadContent": "''{trackName}''에 대한 활성 다운로드를 취소합니다", - "@cancelDownloadContent": { - "description": "Dialog body when confirming cancellation of an active download", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "settingsCacheSubtitle": "크기 보기 및 캐시된 데이터 지우기", - "@settingsCacheSubtitle": { - "description": "Subtitle for cache management menu" - }, - "notifLibraryScanCompleteBody": "{count} 개의 트랙이 색인됨", - "@cacheSizeWithFiles": { - "description": "Cache size and file count", - "placeholders": { - "size": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "@downloadAskBeforeDownload": { - "description": "Setting - show quality picker" - }, - "@extensionHealthDegraded": { - "description": "Extension service health status - degraded" - }, - "@sectionPerformance": { - "description": "Settings section header" - }, - "@trackCoverCurrent": { - "description": "Label for the currently embedded cover preview" - }, - "discographySelectAlbums": "앨범 검색...", - "@discographySelectAlbums": { - "description": "Option - manually select albums to download" - }, - "aboutAppDescription": "음악 메타데이터를 검색하고, 확장 프로그램을 관리하고, 라이브러리를 정리하세요", - "@aboutAppDescription": { - "description": "App description in header card" - }, - "extensionCustomTrackMatching": "사용자 정의 트랙 매칭", - "@extensionCustomTrackMatching": { - "description": "Capability - custom track matching algorithm" - }, - "@editMetadataSelectNone": { - "description": "Button to clear selected fields for auto-fill" - }, - "@trackPlayNext": { - "description": "Menu action to play a track as the next queue item" - }, - "extensionCapabilities": "기능", - "@extensionCapabilities": { - "description": "Section header - extension features" - }, - "@downloadSelectServiceToEnable": { - "description": "Subtitle when quality picker is disabled due to extension service" - }, - "logIssueRateLimitedDescription": "서비스에 대한 요청이 너무 많습니다", - "@logIssueRateLimitedDescription": { - "description": "Diagnostic badge description for rate limiting" - }, - "@actionResume": { - "description": "Action button - resume download" - }, - "@updateDownloadInstall": { - "description": "Update button - download and install" - }, - "downloadLossy320Format": "손실 압축 320kbps 형식", - "@downloadLossy320Format": { - "description": "Title of the lossy format picker bottom sheet" - }, - "settingsMetadataSubtitle": "표지 이미지, 태그, 리플레이게인, 제공자", - "@trackCopyright": { - "description": "Metadata label - copyright information" - }, - "@snackbarExtensionInstalled": { - "description": "Snackbar - extension installed successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "@regionCountryJP": { - "description": "Country name for SongLink region picker" - }, - "trackReEnrichOnlineSubtitle": "온라인에서 메타데이터를 검색하고 파일에 삽입", - "@trackReEnrichOnlineSubtitle": { - "description": "Subtitle for re-enrich metadata action for local items" - }, - "nowPlayingNothingPlaying": "재생 중인 노래가 없음", - "@nowPlayingNothingPlaying": { - "description": "Empty state when no track is currently playing" - }, - "tutorialDownloadDesc": "음악 다운로드는 간단하고 빠릅니다. 작동 방식은 다음과 같습니다", - "@tutorialDownloadDesc": { - "description": "Tutorial download page description" - }, - "@appearanceTitle": { - "description": "Appearance settings page title" - }, - "@backupExportSectionDescription": { - "description": "Description of what a backup contains" - }, - "@downloadLossyOpus128": { - "description": "Lossy format option - Opus 128kbps" - }, - "@logFilterSection": { - "description": "Filter section title" - }, - "trackReEnrichSuccess": "메타데이터 재구성 성공", - "@trackReEnrichSuccess": { - "description": "Snackbar after successful re-enrichment" - }, - "backupContentsHistory": "{count} 개의 기록 {count, plural, =1{항목} other{항목}}", - "@backupContentsHistory": { - "description": "Backup contents row for history count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedToQueue": "''{trackName}''가 다운로드 목록에 추가됨", - "@snackbarAddedToQueue": { - "description": "Snackbar - track added to download queue", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "libraryAutoScanOnOpen": "앱을 열 때마다", - "@libraryAutoScanOnOpen": { - "description": "Auto scan when app opens" - }, - "audioAnalysisChannels": "채널", - "@audioAnalysisChannels": { - "description": "Channels metric label" - }, - "appearanceHistoryViewList": "리스트", - "updateDownloadInstall": "다운로드 & 설치", - "@libraryShowDuplicateIndicator": { - "description": "Toggle for duplicate indicator in search" - }, - "extensionsHomeFeedOff": "끄기", - "@extensionsHomeFeedOff": { - "description": "Extensions page - home feed provider option: off" - }, - "searchSortTitleAZ": "제목 (오름차순)", - "@searchSortTitleAZ": { - "description": "Sort option - title ascending" - }, - "collectionRemovedFromLoved": "''{trackName}''이 '좋아요 표시한 트랙'에서 제거됨", - "@collectionRemovedFromLoved": { - "description": "Snackbar after removing track from loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "sectionAudioQuality": "오디오 품질", - "@sectionAudioQuality": { - "description": "Settings section header" - }, - "trackConvertSuccess": "{format}으로 변환 성공", - "@trackConvertSuccess": { - "description": "Snackbar after successful conversion", - "placeholders": { - "format": { - "type": "String" - } - } - }, - "dialogUninstallExtensionMessage": "''{extensionName}''을 제거하시겠습니까?", - "@dialogUninstallExtensionMessage": { - "description": "Dialog message - uninstall specific extension", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "downloadNativeWorkerSubtitle": "확장 프로그램 다운로드용 Android 백그라운드 서비스", - "@downloadNativeWorkerSubtitle": { - "description": "Setting subtitle for Android native download worker" - }, - "storeUpdate": "업데이트", - "libraryFilterMetadataMissingAny": "메타데이터 누락", - "@libraryFilterMetadataMissingAny": { - "description": "Filter option - items missing any tracked metadata field" - }, - "@selectionBatchConvertConfirmMessageLosslessCapped": { - "description": "Confirmation dialog message for capped lossless batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "editMetadataAutoFillDesc": "온라인 메타데이터에서 자동으로 채워질 필드를 선택하세요", - "@editMetadataAutoFillDesc": { - "description": "Description for the auto-fill section" - }, - "@lyricsProviderExtensionDesc": { - "description": "Generic description for extension-based lyrics providers" - }, - "downloadSongLinkRegion": "SongLink 지역", - "@downloadSongLinkRegion": { - "description": "Setting for SongLink region used during fallback resolution" - }, - "shareSheetNoExtensions": "호환되는 다른 서비스가 없음", - "@shareSheetNoExtensions": { - "description": "Empty state when no extensions can be searched for cross-service links" - }, - "queueFlacConfirmMessage": "선택한 트랙에 대한 온라인 일치 항목을 검색하고 FLAC을 다운로드 목록에 추가합니다\n\n기존 파일은 수정되거나 삭제되지 않습니다\n\n신뢰도가 높은 일치 항목만 자동으로 대기열에 추가됩니다\n\n{count} 개가 선택되었습니다", - "@queueFlacConfirmMessage": { - "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tooltipAddToPlaylist": "재생목록에 추가", - "@tooltipAddToPlaylist": { - "description": "Tooltip for the Add to Playlist button" - }, - "@snackbarAddedToQueueGeneric": { - "description": "Snackbar when a track is added to the playback queue without naming it" - }, - "@tutorialSettingsTip2": { - "description": "Tutorial settings tip 2" - }, - "extensionPermissions": "권한", - "releaseTypeSingle": "싱글", - "aboutTelegramChannelSubtitle": "공지 및 업데이트 안내", - "@aboutTelegramChannelSubtitle": { - "description": "Subtitle for Telegram channel" - }, - "@dialogDisableAndClear": { - "description": "Confirmation action to disable download history and clear existing entries" - }, - "@homeSearchHintProvider": { - "description": "Placeholder for the main search field when a provider is selected", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, - "metadataProvidersTitle": "메타데이터 제공자 우선순위", - "@metadataProvidersTitle": { - "description": "Settings item title for metadata provider order" - }, - "trackAddToQueue": "다운로드 목록에 추가", - "audioAnalysisDecodedFormat": "디코딩 형식", - "@audioAnalysisDecodedFormat": { - "description": "Decoded sample format metric label" - }, - "@editMetadataSelectEmpty": { - "description": "Button to select only fields that are currently empty" - }, - "collectionAlreadyInPlaylist": "이미 ''{playlistName}''에 있음", - "discographyAlbumsOnlySubtitle": "{albumCount} 개의 앨범에서 {count} 개의 트랙", - "@discographyAlbumsOnlySubtitle": { - "description": "Subtitle showing album tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "setupNotificationEnable": "알림 활성화", - "@setupNotificationEnable": { - "description": "Button to enable notifications" - }, - "settingsAppearanceSubtitle": "테마, 색상, 디스플레이", - "@settingsAppearanceSubtitle": { - "description": "Appearance settings description" - }, - "@notifUpdateFailedBody": { - "description": "Notification body when app update download fails" - }, - "@aboutOriginalCreator": { - "description": "Role description for original creator" - }, - "libraryBuiltInPreviewPlayer": "내장 미리듣기 플레이어", - "@libraryBuiltInPreviewPlayer": { - "description": "Setting option to use the built-in preview player" - }, - "tooltipPlay": "재생", - "@tooltipPlay": { - "description": "Tooltip - play button" - }, - "@safMigrationMessage2": { - "description": "Second paragraph of SAF migration dialog" - }, - "@extensionsSearchProvider": { - "description": "Setting - search provider selection" - }, - "libraryAboutDescription": "기존 음악 라이브러리를 검사하여 다운로드 시 중복 곡을 감지합니다. FLAC, ALAC, M4A, MP3, Opus, OGG, WAV, AIFF 및 APE 형식을 지원합니다. 가능한 경우 파일 태그의 메타데이터를 읽어 사용합니다", - "@libraryAboutDescription": { - "description": "Description of local library feature" - }, - "downloadAskBeforeDownload": "다운로드 전 확인", - "nowPlayingNoMetadata": "사용할 수 있는 메타데이터가 없음", - "@nowPlayingNoMetadata": { - "description": "Empty state when track metadata cannot be loaded" - }, - "trackInstrumental": "반주 트랙", - "@trackInstrumental": { - "description": "Message when track is instrumental (no lyrics)" - }, - "@collectionWishlistEmptyTitle": { - "description": "Wishlist empty state title" - }, - "selectionBatchConvertConfirmMessageLosslessCapped": "{count} 개의 {count, plural, =1{트랙} other{트랙}}을 {format}({quality})으로 변환하시겠습니까?\n\n출력은 무손실 코덱을 유지하지만 비트 심도/샘플 속도가 제한됩니다. 변환 후 원본 파일이 삭제됩니다", - "downloadDeduplication": "중복 다운로드 건너뛰기", - "libraryFilterSortOldest": "오래된순", - "@libraryFilterSortOldest": { - "description": "Sort option - oldest first" - }, - "setupSkip": "다음에 할래요", - "@setupSkip": { - "description": "Skip current step button" - }, - "@setupFolderDescription": { - "description": "Explanation for folder selection" - }, - "@settingsLogsSubtitle": { - "description": "Logs settings description" - }, - "storeNewRepoUrlLabel": "새 리포지토리 URL", - "@storeNewRepoUrlLabel": { - "description": "Label for the new repository URL field inside the dialog" - }, - "cacheClearConfirmMessage": "''{target}''의 캐시된 데이터를 지웁니다. 다운로드한 음악 파일은 삭제되지 않습니다", - "@cacheClearConfirmMessage": { - "description": "Dialog message before clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "trackMetadataPlay": "재생", - "@libraryEnableLocalLibrary": { - "description": "Toggle to enable library scanning" - }, - "optionsUpdateChannel": "업데이트 채널", - "@optionsUpdateChannel": { - "description": "Stable vs preview releases" - }, - "@downloadCreatePlaylistSourceFolderDisabled": { - "description": "Subtitle when playlist folder is disabled" - }, - "@extensionRefreshStatus": { - "description": "Tooltip for refreshing extension service health status" - }, - "backupRestoreRestartHint": "모든 변경 사항을 적용하려면 앱을 다시 시작하세요", - "@backupRestoreRestartHint": { - "description": "Hint shown after restoring that an app restart is recommended" - }, - "@snackbarExtensionInstalledEnable": { - "description": "Snackbar after installing an extension from the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "settingsAutoExportFailedSubtitle": "실패한 다운로드를 TXT 파일으로 자동 저장합니다", - "@settingsAutoExportFailedSubtitle": { - "description": "Subtitle for auto-export setting" - }, - "searchSortArtistAZ": "아티스트 (오름차순)", - "@searchSortArtistAZ": { - "description": "Sort option - artist ascending" - }, - "editMetadataFieldAlbumArtist": "앨범 아티스트", - "@editMetadataFieldAlbumArtist": { - "description": "Chip label for album artist field in auto-fill selector" - }, - "@queueEmptyHistory": { - "description": "Empty state title when download history is empty" - }, - "@dialogDisableHistoryMessage": { - "description": "Confirmation dialog message shown before disabling download history" - }, - "queueFlacNoReliableMatches": "선택한 항목에 대한 신뢰할 수 있는 온라인 일치 항목을 찾을 수 없음", - "@queueFlacNoReliableMatches": { - "description": "Snackbar when no safe FLAC redownload matches were found" - }, - "trackOpenInDeezer": "Deezer에서 열기", - "@trackOpenInDeezer": { - "description": "Action - open track in Deezer app" - }, - "setupChooseFromFilesSubtitle": "iCloud 또는 다른 위치를 선택하세요", - "@setupChooseFromFilesSubtitle": { - "description": "Subtitle for file picker" - }, - "artistMonthlyListeners": "월별 청취자: {count}", - "@artistMonthlyListeners": { - "description": "Monthly listener count display", - "placeholders": { - "count": { - "type": "String", - "description": "Formatted listener count" - } - } - }, - "@downloadLossyAacSubtitle": { - "description": "Subtitle for AAC/M4A 320kbps lossy option" - }, - "cacheSectionStorage": "캐시된 데이터", - "@cacheSectionStorage": { - "description": "Section header for cache entries" - }, - "@libraryAutoScanWeekly": { - "description": "Auto scan once per week" - }, - "tutorialDownloadCompletedSemantics": "다운로드 완료", - "@tutorialDownloadCompletedSemantics": { - "description": "Accessibility label for completed download state in tutorial demo" - }, - "@logNoLogsYet": { - "description": "Empty state title" - }, - "@selectionDeletePlaylistsCount": { - "description": "Button label for deleting multiple selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadSeparateSinglesEnabled": "싱글과 EP를 별도의 폴더에 저장합니다", - "@downloadSeparateSinglesEnabled": { - "description": "Subtitle when separate singles folder is on" - }, - "setupAppDocumentsFolder": "앱 문서 폴더", - "@setupAppDocumentsFolder": { - "description": "iOS documents folder option" - }, - "storeLoadError": "리포지토리 불러오기 실패", - "settingsDownloadNetwork": "다운로드 네트워크", - "metadataSaveFailedStorage": "저장소에 메타데이터 다시 쓰기 실패", - "@logAutoScrollOff": { - "description": "Tooltip when auto-scroll is disabled on the log screen" - }, - "@trackConvertFormat": { - "description": "Menu item - convert audio format" - }, - "optionsArtistTagModeJoined": "단일 결합 값", - "@optionsArtistTagModeJoined": { - "description": "Artist tag mode option that joins multiple artists into one value" - }, - "@dateYesterday": { - "description": "Relative date - yesterday" - }, - "@settingsExtensionsSubtitle": { - "description": "Extensions settings description" - }, - "searchSortArtistZA": "아티스트 (내림차순)", - "@extensionSettings": { - "description": "Section header - extension settings" - }, - "@extensionOauthConnectHint": { - "description": "Hint for an OAuth login link field before connecting Spotify" - }, - "@notifUpdateReady": { - "description": "Notification title when app update download is complete" - }, - "@regionCountryMX": { - "description": "Country name for SongLink region picker" - }, - "@nowPlayingOpenInExternalPlayer": { - "description": "Menu item to open the current track in an external player" - }, - "trackConvertDithering": "디더링", - "@trackConvertDithering": { - "description": "Section label for lossless conversion dithering options" - }, - "settingsDownloadSubtitle": "서비스, 음질, 대체", - "@settingsDownloadSubtitle": { - "description": "Download settings description" - }, - "libraryLastScanned": "마지막 스캔 시간: {time}", - "@libraryLastScanned": { - "description": "Last scan time display", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "setupIosEmptyFolderWarning": "iOS 제한 사항: 빈 폴더는 선택할 수 없습니다. 파일이 하나 이상 있는 폴더를 선택하세요", - "@setupIosEmptyFolderWarning": { - "description": "iOS folder selection warning" - }, - "@storeAddRepoDescription": { - "description": "Store setup screen - explanatory text" - }, - "@snackbarFailedToInstallNamed": { - "description": "Snackbar when extension install fails in the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "@collectionAddedTracksToPlaylist": { - "description": "Snackbar after adding multiple tracks to a playlist", - "placeholders": { - "count": { - "type": "int" - }, - "playlistName": { - "type": "String" - } - } - }, - "updateNew": "새 버전", - "@updateNew": { - "description": "Label for new version" - }, - "settingsExtensionsSubtitle": "다운로드 제공자 관리", - "@albumFolderArtistAlbumSinglesSubtitle": { - "description": "Folder structure example" - }, - "trackReEnrichSelectAll": "모두 선택", - "@trackReEnrichSelectAll": { - "description": "Select all fields checkbox in re-enrich" - }, - "@extensionsUninstall": { - "description": "Uninstall extension button" - }, - "@downloadUseAlbumArtistForFoldersTrackSubtitle": { - "description": "Subtitle when track artist is used for folder names" - }, - "@logIssueNetworkErrorLabel": { - "description": "Diagnostic badge label for generic network errors" - }, - "albumFolderArtistYearAlbumSubtitle": "앨범/아티스트 이름/[2005] 앨범 이름/", - "@albumFolderArtistYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "itemCount": "{count} 개의 {count, plural, =1{항목} other{항목}}", - "@itemCount": { - "description": "Generic item count label", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographyFetchingTracks": "트랙을 가져오는 중...", - "@discographyFetchingTracks": { - "description": "Progress - fetching album tracks" - }, - "@libraryFolder": { - "description": "Folder selection setting" - }, - "queueEmptyAlbums": "앨범 다운로드가 없음", - "@queueEmptyAlbums": { - "description": "Empty state title when no album downloads exist" - }, - "@metadataProviderPriorityDescription": { - "description": "Metadata priority page description" - }, - "@extensionVerificationHelpTitleManual": { - "description": "Dialog title when automatic browser launch for verification fails" - }, - "extensionError": "오류", - "@extensionError": { - "description": "Extension detail - error message" - }, - "@trackLyricsLoadFailed": { - "description": "Message when lyrics loading fails" - }, - "@downloadedAlbumDeleteCount": { - "description": "Delete button text with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@extensionsNoHomeFeedExtensions": { - "description": "Extensions page - shown when no installed extension has home feed" - }, - "@collectionArtistCount": { - "description": "Artist count label for favorite artists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsArtists": "{count, plural, =1{1 명의 좋아하는 아티스트} other{{count} 명의 좋아하는 아티스트}}", - "@backupContentsArtists": { - "description": "Backup contents row for favorite artists count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@trackRemoveFromDevice": { - "description": "Action - delete downloaded file" - }, - "lyricsProvidersEnabledSection": "활성화됨 ({count})", - "@lyricsProvidersEnabledSection": { - "description": "Section header for enabled providers", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@cueSplitTitle": { - "description": "Title for CUE split bottom sheet" - }, - "@downloadedAlbumSelectedCount": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@trackOptionRemoveFromWishlist": { - "description": "Bottom sheet action label - remove track from wishlist" - }, - "notifDownloadingTrack": "''{trackName}''를 다운로드하는 중", - "@notifDownloadingTrack": { - "description": "Notification title while downloading a track", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "@discographySkippedDownloaded": { - "description": "Snackbar - with skipped tracks count", - "placeholders": { - "added": { - "type": "int" - }, - "skipped": { - "type": "int" - } - } - }, - "@tutorialSettingsTip3": { - "description": "Tutorial settings tip 3" - }, - "@announcementUnableToOpenLink": { - "description": "Snackbar shown when an announcement CTA link cannot be opened" - }, - "trackReleaseDate": "발매일자", - "discographySelectedCount": "{count} 개 선택됨", - "collectionArtistCount": "{count, plural, =1{1 명의 아티스트} other{{count} 명의 아티스트}}", - "logIssueNetworkErrorLabel": "네트워크 오류", - "updateStartingDownload": "다운로드를 시작하는 중...", - "@updateStartingDownload": { - "description": "Update status - initializing" - }, - "trackDiscNumber": "디스크 번호", - "@trackDiscNumber": { - "description": "Metadata label - disc number" - }, - "optionsUsingExtension": "확장 프로그램 사용: {extensionName}", - "@optionsUsingExtension": { - "description": "Shows active extension name", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "dialogDisableHistoryTitle": "다운로드 기록을 끄시겠습니까?", - "tutorialWelcomeTip3": "메타데이터, 표지 이미지 및 가사 자동 삽입", - "@tutorialWelcomeTip3": { - "description": "Tutorial welcome tip 3" - }, - "@collectionPlaylistEmptySubtitle": { - "description": "Playlist empty state subtitle" - }, - "badgeBeta": "베타", - "@tutorialSearchHint": { - "description": "Placeholder shown in the tutorial search demo" - }, - "cleanupOrphanedDownloadsNone": "불필요한 항목이 없습니다", - "discographySkippedDownloaded": "{added} 개 추가됨, {skipped} 개 이미 다운로드됨", - "@updateDontRemind": { - "description": "Update button - skip this version" - }, - "@snackbarLoadingCueSheet": { - "description": "Snackbar while loading a CUE sheet file" - }, - "@dialogUninstallExtension": { - "description": "Dialog title - uninstall extension" - }, - "lyricsProvidersTitle": "가사 제공자 우선순위", - "@dialogRemove": { - "description": "Dialog button - remove item" - }, - "snackbarError": "오류: {error}", - "@snackbarError": { - "description": "Generic error snackbar with error detail", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "@sectionApp": { - "description": "Settings section header" - }, - "@libraryPlayback": { - "description": "Section header for playback settings in library settings" - }, - "@downloadPrimaryArtistOnlyOn": { - "description": "Status label when primary-artist-only folder naming is enabled" - }, - "lyricsProvidersDiscardContent": "저장되지 않은 변경 사항이 손실됩니다", - "previewStop": "미리듣기 중지", - "@previewStop": { - "description": "Tooltip for the button that stops the playing track preview snippet" - }, - "trackConvertConfirmMessageLossless": "{sourceFormat}에서 {targetFormat}으로 변환하시겠습니까? (무손실 — 음질 손실 없음)\n\n변환 후에 원본 파일이 삭제됩니다", - "discographyAlbumsOnly": "앨범만", - "@discographyAlbumsOnly": { - "description": "Option - download only albums" - }, - "@editMetadataFieldCopyright": { - "description": "Chip label for copyright field in auto-fill selector" - }, - "extensionsFallbackSubtitle": "설치된 다운로드 확장 프로그램 중 대체 프로그램으로 사용할 항목을 선택하세요", - "aboutSocial": "소셜 네트워크", - "@aboutSocial": { - "description": "Section for social links" - }, - "audioAnalysisNyquist": "나이퀴스트", - "trackCoverSelected": "선택된 표지", - "@trackCoverSelected": { - "description": "Label for the newly selected cover preview" - }, - "downloadDeduplicationEnabled": "이미 다운로드된 트랙은 건너뜁니다", - "@downloadDeduplicationEnabled": { - "description": "Subtitle when deduplication is on" - }, - "homeEmptyTitle": "아직 검색 제공자가 없음", - "@homeEmptyTitle": { - "description": "Title shown on home when no providers are available yet" - }, - "@extensionHealthUnknown": { - "description": "Extension service health status - unknown" - }, - "storeInstalled": "설치됨", - "@storeInstalled": { - "description": "Already installed badge" - }, - "trackReplayGainSuccess": "리플레이게인 태그가 추가됨", - "@trackReplayGainSuccess": { - "description": "Snackbar message after ReplayGain tags written for a single track" - }, - "libraryShowDuplicateIndicatorSubtitle": "기존 트랙을 검색할 때 표시", - "@collectionPlaylistRenamed": { - "description": "Snackbar after renaming playlist" - }, - "@trackConvertResamplerSoxr": { - "description": "Lossless conversion SoX resampler option" - }, - "@dialogUnsavedChanges": { - "description": "Dialog message - unsaved changes" - }, - "dialogDownload": "다운로드", - "@dialogDownload": { - "description": "Confirm button in Download All dialog" - }, - "trackLyricsLoadFailed": "가사 불러오기 실패", - "@backupContentsTitle": { - "description": "Header above the list summarizing what the backup contains" - }, - "@safMigrationTitle": { - "description": "Title of SAF migration dialog" - }, - "@trackReEnrichFieldLyrics": { - "description": "Checkbox label for lyrics field in re-enrich" - }, - "setupPermissionDeniedMessage": "권한이 거부되었습니다. 계속하려면 모든 권한을 허용해 주세요", - "@setupPermissionDeniedMessage": { - "description": "Error when permission denied" - }, - "settingsDownloadNetworkWifiOnly": "WiFi 전용", - "@settingsDownloadNetworkWifiOnly": { - "description": "Network option - only use WiFi" - }, - "@backupIncludeSecrets": { - "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" - }, - "@libraryFilterMetadataMissingAlbumArtist": { - "description": "Filter option - items missing album artist" - }, - "@extensionHealthServiceUnknown": { - "description": "Tooltip for unknown extension service health" - }, - "snackbarExtensionUpdated": "''{extensionName}''이 설치됨", - "@snackbarExtensionUpdated": { - "description": "Snackbar - extension updated successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "homeEmptySubtitle": "계속하려면 확장 프로그램을 설치하세요", - "@settingsTitle": { - "description": "Settings screen title" - }, - "@libraryFilterMetadataIncorrectIsrcFormat": { - "description": "Filter option - items with an invalid ISRC format" - }, - "@notifLibraryScanComplete": { - "description": "Notification title when library scan finishes" - }, - "@logIssueIspBlockingLabel": { - "description": "Diagnostic badge label when ISP blocking is detected" - }, - "tutorialDownloadTitle": "음악 다운로드", - "@tutorialDownloadTitle": { - "description": "Tutorial download page title" - }, - "unknownTitle": "알 수 없는 제목", - "@unknownTitle": { - "description": "Fallback track title when metadata is missing" - }, - "navLibrary": "라이브러리", - "@navLibrary": { - "description": "Bottom navigation - Library tab" - }, - "@snackbarAlreadyDownloaded": { - "description": "Snackbar - track already exists", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "editMetadataSelectAll": "모두", - "@editMetadataSelectAll": { - "description": "Button to select all fields for auto-fill" - }, - "storeEmptyNoExtensions": "사용 가능한 확장 프로그램이 없음", - "@storeEmptyNoExtensions": { - "description": "Message when store has no extensions" - }, - "optionsUpdateChannelWarning": "베타 버전은 불안정할 수 있습니다", - "@optionsUpdateChannelWarning": { - "description": "Warning about preview channel" - }, - "@collectionPlaylistNameHint": { - "description": "Hint text for playlist name input" - }, - "notifLibraryScanComplete": "라이브러리 스캔 완료", - "editMetadataFieldIsrc": "ISRC", - "@editMetadataFieldIsrc": { - "description": "Chip label for ISRC field in auto-fill selector" - }, - "@libraryFolderHint": { - "description": "Placeholder when no folder selected" - }, - "homeSearchHintDefault": "지원되는 URL을 붙여넣거나 검색...", - "@homeSearchHintDefault": { - "description": "Default placeholder for the main search field on Home" - }, - "extensionsNoExtensionsSubtitle": "새 제공자를 추가하려면 .spotiflac-ext 파일을 설치하세요", - "@extensionsNoExtensionsSubtitle": { - "description": "Empty state subtitle" - }, - "@extensionEnterValue": { - "description": "Hint for editing an extension setting value" - }, - "backupRestoreConfirmTitle": "이 백업을 복원하시겠습니까?", - "@backupRestoreConfirmTitle": { - "description": "Confirmation dialog title before restoring a backup" - }, - "@libraryScanSelectFolderFirst": { - "description": "Message when trying to scan without folder" - }, - "@qualityHiResFlac": { - "description": "Quality option - high resolution FLAC" - }, - "aboutSpecialThanks": "특별히 감사드리는 분들", - "@aboutSpecialThanks": { - "description": "Section for special thanks" - }, - "storeInstall": "설치", - "@storeInstall": { - "description": "Install extension button" - }, - "@collectionWishlistEmptySubtitle": { - "description": "Wishlist empty state subtitle" - }, - "historyFilterAlbums": "앨범", - "extensionCustomUrlHandlingSubtitle": "이 확장 프로그램은 다음 사이트의 링크를 처리할 수 있습니다", - "@extensionCustomUrlHandlingSubtitle": { - "description": "Extension detail subtitle for custom URL handling" - }, - "filenameShowAdvancedTagsDescription": "트랙 패딩 및 날짜 패턴에 대한 서식 있는 태그를 활성화합니다", - "@aboutReportIssue": { - "description": "Link to report bugs" - }, - "@folderOrganizationByPlaylist": { - "description": "Folder option - playlist folders" - }, - "@dateWeeksAgo": { - "description": "Relative date - weeks ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "logEntriesFiltered": "항목 ({count} 개 필터됨)", - "@logEntriesFiltered": { - "description": "Log count with filter active", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@lyricsModeDescription": { - "description": "Lyrics mode picker description" - }, - "@setupAppDocumentsFolderSubtitle": { - "description": "Subtitle for documents folder" - }, - "storeAddRepoButton": "리포지토리 추가", - "@storeAddRepoButton": { - "description": "Button to submit a new repository URL" - }, - "@collectionLovedEmptyTitle": { - "description": "Loved empty state title" - }, - "aboutReportIssue": "문제 신고", - "snackbarFailedToWriteStorage": "저장소 다시 쓰기 실패", - "@snackbarFailedToWriteStorage": { - "description": "Snackbar when writing metadata back to file fails" - }, - "errorInvalidFolderSelected": "잘못된 폴더가 선택됨", - "allFilesAccessDisabledMessage": "모든 파일 접근을 비활성화하였습니다. 앱은 제한된 저장소 접근을 사용합니다", - "@allFilesAccessDisabledMessage": { - "description": "Snackbar message when user disables all files access" - }, - "downloadMusixmatchLanguageCode": "언어 코드", - "@downloadMusixmatchLanguageCode": { - "description": "Label for Musixmatch language input field" - }, - "dialogUnsavedChanges": "저장되지 않은 변경 사항이 있습니다. 폐기하시겠습니까?", - "setupChooseFromFiles": "파일 탐색기에서 선택", - "@setupChooseFromFiles": { - "description": "iOS file picker option" - }, - "@collectionFavoriteArtistsEmptySubtitle": { - "description": "Favorite artists empty state subtitle" - }, - "downloadLossy320FormatDesc": "320kbps 손실 다운로드의 출력 형식을 선택하세요. 필요에 따라 원본 스트림이 선택한 형식으로 변환됩니다", - "@backupRestoreConfirmButton": { - "description": "Confirm button to proceed with restore" - }, - "@queueEmptyAlbumsSubtitle": { - "description": "Empty state subtitle for album downloads" - }, - "collectionRemovedFromWishlist": "''{trackName}''가 위시리스트에서 제거됨", - "@collectionRemovedFromWishlist": { - "description": "Snackbar after removing track from wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "extensionsInstalledSuccess": "확장 프로그램 설치 성공", - "progressReadingCsv": "CSV 파일을 읽는 중...", - "@progressReadingCsv": { - "description": "Progress indicator - parsing CSV file" - }, - "artistReleases": "릴리스", - "@artistReleases": { - "description": "Section header for all artist releases" - }, - "extensionVerificationBrowserTitle": "인증 브라우저", - "@optionsDefaultSearchTabSubtitle": { - "description": "Subtitle for the preferred default search tab setting" - }, - "optionsArtistTagModeJoinedSubtitle": "플레이어 호환성을 최대화하려면 '아티스트 A, 아티스트 B'와 같이 하나의 아티스트 값을 입력하세요", - "downloadLossy320": "손실 압축 320kbps", - "@downloadLossy320": { - "description": "Quality option label for lossy 320kbps" - }, - "queueFlacAction": "FLAC 다운로드 목록", - "@queueFlacAction": { - "description": "Action/button label for queueing FLAC redownloads for local tracks" - }, - "@setupDownloadLocationIosMessage": { - "description": "iOS-specific folder info" - }, - "trackConvertOriginal": "원본", - "sectionLyricsProviderOptions": "제공자 옵션", - "nowPlayingTitle": "현재 재생 중", - "@nowPlayingTitle": { - "description": "Title for the now playing screen" - }, - "@extensionHealthChecksConfigured": { - "description": "Extension service health check count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@cacheClearAll": { - "description": "Button label to clear all caches" - }, - "a11yDeselectTrack": "트랙 선택 해제", - "@a11yDeselectTrack": { - "description": "Accessibility label for deselecting a track" - }, - "@lyricsProvidersInfoText": { - "description": "Info tip on lyrics provider priority page" - }, - "queueEmptyHistory": "다운로드 기록이 없음", - "dialogClear": "지우기", - "@dialogClear": { - "description": "Dialog button - clear items" - }, - "allFilesAccessDescription": "사용자 정의 폴더에 저장할 경우에 쓰기 오류가 발생하면 이 옵션을 활성화하세요. Android 13 이상에서는 기본적으로 특정 디렉터리에 대한 접근이 제한됩니다", - "@allFilesAccessDescription": { - "description": "Description explaining when to enable all files access" - }, - "trackConvertConfirmTitle": "변환 확인", - "storeCategoryLyrics": "가사", - "@storeCategoryLyrics": { - "description": "Store extension category - lyrics" - }, - "@lyricsProvidersDescription": { - "description": "Description on the lyrics provider priority page" - }, - "tooltipLoveAll": "모두 좋아요 표시", - "downloadDirectory": "다운로드 디렉토리", - "@downloadDirectory": { - "description": "Setting - download folder" - }, - "@tutorialExtensionsTip2": { - "description": "Tutorial extensions tip 2" - }, - "libraryFolder": "라이브러리 폴더", - "optionsMaxQualityCoverSubtitle": "최고 해상도의 표지 이미지를 다운로드", - "@metadataProviderPriorityTitle": { - "description": "Metadata priority page title" - }, - "@cleanupOrphanedDownloadsResult": { - "description": "Snackbar after orphan cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cacheExploreFeedDesc": "탐색 탭 콘텐츠(신규 발매, 인기 콘텐츠)는 다음 방문 시 새로 고쳐집니다", - "@cacheExploreFeedDesc": { - "description": "Description of what explore feed cache contains" - }, - "a11yOpenTrackByArtist": "''{artistName}''의 트랙 ''{trackName}'' 열기", - "@a11yOpenTrackByArtist": { - "description": "Accessibility label for opening a track item", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "announcementUnableToOpenLink": "링크를 열 수 없습니다. 다시 시도해 주세요", - "libraryFilterSortAlbumDesc": "앨범 (내림차순)", - "@libraryFilterSortAlbumDesc": { - "description": "Sort option - album descending" - }, - "trackConvertBitrate": "비트레이트", - "@trackConvertBitrate": { - "description": "Label for bitrate selection" - }, - "audioAnalysisFileSize": "크기", - "extensionHealthServiceOnline": "서비스 온라인", - "@extensionHealthServiceOnline": { - "description": "Tooltip for online extension service" - }, - "logEntries": "항목 ({count})", - "@logEntries": { - "description": "Total log count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackConvertConfirmMessage": "{bitrate} 비트레이트로 {sourceFormat}에서 {targetFormat}으로 변환하시겠습니까?\n\n변환 후 원본 파일이 삭제됩니다", - "@trackConvertConfirmMessage": { - "description": "Confirmation dialog message", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "@optionsArtistTagModeSplitVorbisSubtitle": { - "description": "Subtitle for split Vorbis artist tag mode" - }, - "folderOrganizationByAlbum": "앨범별", - "@folderOrganizationByAlbum": { - "description": "Folder option - album folders" - }, - "libraryPlayback": "재생", - "@storeFilterAll": { - "description": "Store filter - all extensions" - }, - "aboutApp": "앱 정보", - "@aboutApp": { - "description": "Section for app info" - }, - "optionsReplayGainSubtitleOff": "비활성화됨: 음량 정규화 태그 없음", - "@optionsReplayGainSubtitleOff": { - "description": "Subtitle when ReplayGain is disabled" - }, - "@storeRepoDialogTitle": { - "description": "Title of the change/remove repository dialog" - }, - "settingsLyricsSubtitle": "삽입, 모드, 제공자, 언어 옵션", - "@settingsLyricsSubtitle": { - "description": "Subtitle for lyrics settings" - }, - "logIssueIspBlockingLabel": "ISP 차단 감지됨", - "storeFilterIntegration": "연동", - "@storeFilterIntegration": { - "description": "Store filter - integrations" - }, - "@lyricsProvidersAtLeastOne": { - "description": "Snackbar when user tries to disable the last enabled provider" - }, - "@appearanceHistoryViewGrid": { - "description": "Grid layout option" - }, - "trackDownloaded": "다운로드됨", - "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile에서 브라우저를 자동으로 열지 못하였습니다. 아래 링크를 브라우저에서 열거나 직접 복사하세요", - "setupDownloadLocationIosMessage": "iOS에서는 다운로드한 파일이 앱의 문서 폴더에 저장됩니다. 파일 앱을 통해 해당 파일에 접근할 수 있습니다", - "optionsArtistTagModeDescription": "여러 아티스트를 내장 태그에 작성하는 방법을 선택하세요", - "@optionsArtistTagModeDescription": { - "description": "Bottom-sheet description for artist tag mode setting" - }, - "@queueRetryAllFailed": { - "description": "Button to retry every failed download in the queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@trackConvertDitherTriangularHp": { - "description": "Lossless conversion high-pass triangular dither option" - }, - "@extensionVerificationCopyLink": { - "description": "Button to copy the extension verification URL" - }, - "searchSongs": "노래", - "@searchSongs": { - "description": "Search result category - songs" - }, - "@appearanceHistoryView": { - "description": "Layout style for history" - }, - "sectionFileSettings": "파일 설정", - "@sectionFileSettings": { - "description": "Settings section header" - }, - "@cancelDownloadTitle": { - "description": "Dialog title when confirming cancellation of an active download" - }, - "@cacheLibraryCover": { - "description": "Cache item title for local library cover art images" - }, - "audioAnalysisSpectralCutoff": "주파수 컷오프", - "dialogDelete": "삭제", - "@dialogDelete": { - "description": "Dialog button - delete item" - }, - "tutorialLibraryDesc": "다운로드한 모든 음악은 라이브러리 탭에 정리되어 있습니다", - "@tutorialLibraryDesc": { - "description": "Tutorial library page description" - }, - "@queueDownloadSpeedStatus": { - "description": "Queue status while downloading with speed", - "placeholders": { - "speed": { - "type": "String" - } - } - }, - "@extensionsHomeFeedOffSubtitle": { - "description": "Extensions page - subtitle for off home feed option" - }, - "cacheCleanupResult": "정리 완료: {downloadCount} 개의 사용되지 않는 다운로드, {libraryCount} 개의 누락된 라이브러리 항목", - "@cacheCleanupResult": { - "description": "Snackbar after unused data cleanup", - "placeholders": { - "downloadCount": { - "type": "int" - }, - "libraryCount": { - "type": "int" - } - } - }, - "trackConvertLosslessHint": "무손실 변환 — 음질 손실 없음", - "@trackConvertLosslessHint": { - "description": "Hint shown when converting between lossless formats" - }, - "collectionRenamePlaylist": "재생목록 이름 변경", - "@collectionRenamePlaylist": { - "description": "Action to rename playlist" - }, - "@libraryFilterTitle": { - "description": "Filter bottom sheet title" - }, - "@storageModeAppFolder": { - "description": "Storage mode option - app-managed folder" - }, - "logTotalErrors": "총 오류 수: {count}", - "@logTotalErrors": { - "description": "Total error count in log issue analysis", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@setupStorageRequired": { - "description": "Title when storage permission needed" - }, - "@snackbarMetadataProviderSaved": { - "description": "Snackbar - metadata provider order saved" - }, - "@selectionBatchConvertConfirmTitle": { - "description": "Confirmation dialog title for batch conversion" - }, - "extensionsHomeFeedAutoSubtitle": "사용 가능한 최적의 항목을 자동으로 선택합니다", - "@extensionsHomeFeedAutoSubtitle": { - "description": "Extensions page - subtitle for auto home feed option" - }, - "setupLanguageDescription": "앱에서 사용할 언어를 선택하세요. 나중에 설정에서 변경할 수 있습니다", - "settingsBackupSubtitle": "라이브러리, 기록 및 설정을 새 기기로 옮겨보세요", - "@settingsBackupSubtitle": { - "description": "Subtitle for backup and restore settings item" - }, - "recentTypeArtist": "아티스트", - "@recentTypeArtist": { - "description": "Recent access item type - artist" - }, - "collectionPlaylistEmptySubtitle": "아무 트랙에서 +를 길게 탭하여 여기에 추가하세요", - "artistCompilations": "컴필레이션", - "@artistCompilations": { - "description": "Section header for compilations" - }, - "snackbarFolderPickerFailed": "폴더 선택기 열기 실패: {error}", - "@snackbarFolderPickerFailed": { - "description": "Snackbar shown when folder picker fails to open", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "@optionsDetailedLoggingOn": { - "description": "Status when logging enabled" - }, - "settingsSaveDownloadHistory": "다운로드 기록 저장", - "@settingsSaveDownloadHistory": { - "description": "Settings switch title for storing completed downloads in history" - }, - "@storeCategoryIntegration": { - "description": "Store extension category - integration" - }, - "a11yOpenItemCount": "{title}, {count} 개의 {count, plural, =1{항목} other{항목}} 열기", - "@a11yOpenItemCount": { - "description": "Accessibility label for opening a grouped item with count", - "placeholders": { - "title": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "trackFileInfo": "파일 정보", - "@trackFileInfo": { - "description": "Tab title - file information" - }, - "libraryFilterMetadataMissingAlbumArtist": "앨범 아티스트 누락", - "audioAnalysisNoClipping": "클리핑 없음", - "tutorialSettingsDesc": "설정에서 앱을 원하는 대로 맞춤 설정하세요", - "@tutorialSettingsDesc": { - "description": "Tutorial settings page description" - }, - "lyricsModeExternalSubtitle": "삼성 뮤직과 같은 플레이어용 별도 .lrc 파일", - "@lyricsModeExternalSubtitle": { - "description": "Subtitle for external option" - }, - "trackLoadLyrics": "가사 불러오기", - "@trackLoadLyrics": { - "description": "Action - fetch lyrics" - }, - "extensionVerificationHelpTitleWaiting": "아직 인증을 기다리는 중", - "@extensionVerificationHelpTitleWaiting": { - "description": "Dialog title when verification is taking longer than expected" - }, - "libraryFilterReset": "초기화", - "@libraryFilterReset": { - "description": "Reset all filters button" - }, - "@downloadAlbumArtistMetadataFull": { - "description": "Status label when album-artist folder filtering uses full metadata" - }, - "storeTitle": "확장 프로그램 리포", - "@storeTitle": { - "description": "Store screen title" - }, - "libraryCleared": "라이브러리가 초기화됨", - "@libraryCleared": { - "description": "Snackbar after clearing library" - }, - "queueDownloadCompleted": "다운로드 완료", - "@queueDownloadCompleted": { - "description": "Accessibility label for completed download state in queue" - }, - "libraryTitle": "로컬 라이브러리", - "@libraryTitle": { - "description": "Library settings page title" - }, - "queueAlbumCount": "{count, plural, =1{1 개의 앨범} other{{count} 개의 앨범}}", - "@queueAlbumCount": { - "description": "Album count label with plural support", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryClearConfirmTitle": "라이브러리 정리", - "@backupExportSectionTitle": { - "description": "Section title for the export/backup card" - }, - "dialogClearAll": "모두 지우기", - "@dialogClearAll": { - "description": "Dialog title - clear all items" - }, - "tutorialExtensionsDesc": "커뮤니티 확장 프로그램을 사용하여 앱의 기능을 확장하세요", - "@tutorialExtensionsDesc": { - "description": "Tutorial extensions page description" - }, - "libraryExternalPlayer": "외부 플레이어", - "@libraryExternalPlayer": { - "description": "Setting option to use an external music player" - }, - "editMetadataFieldGenre": "장르", - "@tutorialLibraryTitle": { - "description": "Tutorial library page title" - }, - "folderOrganizationByPlaylist": "재생목록별", - "queueTrackCount": "{count, plural, =1{1 개의 트랙} other{{count} 개의 트랙}}", - "@searchSortTitle": { - "description": "Bottom sheet title for search sort options" - }, - "editMetadataSelectNone": "없음", - "@historyFilterSingles": { - "description": "Filter chip - show singles only" - }, - "@setupLanguageTitle": { - "description": "Title for the language selection step in setup" - }, - "trackSaveCoverArt": "표지 이미지 저장", - "@trackSaveCoverArt": { - "description": "Menu action - save album cover art as file" - }, - "@downloadAlbumFolderStructure": { - "description": "Setting - album folder organization" - }, - "lyricsProvidersAtLeastOne": "최소 한 명의 제공자가 활성화된 상태로 유지되어야 합니다", - "@notifDownloadCompleteCount": { - "description": "Notification title when download is complete, with count", - "placeholders": { - "completed": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "setupUseDefault": "기본값 사용", - "@setupUseDefault": { - "description": "Button to use default folder" - }, - "logNoLogsYetSubtitle": "앱을 사용하는 동안에 로그가 여기에 표시됩니다", - "@logNoLogsYetSubtitle": { - "description": "Empty state subtitle" - }, - "@dateToday": { - "description": "Relative date - today" - }, - "trackSaveLyricsProgress": "가사를 저장하는 중...", - "@trackSaveLyricsProgress": { - "description": "Snackbar while saving lyrics to file" - }, - "trackCoverSaved": "표지 이미지가 ''{fileName}''에 저장됨", - "@trackCoverSaved": { - "description": "Snackbar after cover art saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackReEnrichFieldLyrics": "가사", - "@audioAnalysisRescan": { - "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" - }, - "@downloadNeteaseIncludeRomanizationEnabled": { - "description": "Subtitle when Netease romanization is on" - }, - "dialogDisableAndClear": "끄고 지우기", - "extensionHealthChecksConfigured": "{count} 개의 {count, plural, =1{검사} other{검사}}가 설정됨", - "cleanupOrphanedDownloadsSubtitle": "더 이상 존재하지 않는 파일의 기록 항목을 제거합니다", - "@notifLibraryScanProgressWithTotal": { - "description": "Notification body for library scan progress when total is known", - "placeholders": { - "scanned": { - "type": "int" - }, - "total": { - "type": "int" - }, - "percentage": { - "type": "int" - } - } - }, - "@extensionDetailsTags": { - "description": "Section title for extension tags" - }, - "@albumFolderAlbumOnlySubtitle": { - "description": "Folder structure example" - }, - "@audioAnalysisAnalyzing": { - "description": "Loading text while analyzing audio" - }, - "@settingsDonate": { - "description": "Settings menu item - donate page" - }, - "@collectionPlaylistNameRequired": { - "description": "Validation error for empty playlist name" - }, - "@backupImportSectionDescription": { - "description": "Description for the restore action" - }, - "storeFilterLyrics": "가사", - "libraryAutoScan": "자동 스캔", - "@libraryAutoScan": { - "description": "Setting for automatic library scanning" - }, - "safMigrationMessage1": "SpotiFLAC은 이제 다운로드에 Android 저장소 접근 프레임워크(SAF)를 사용합니다. 이로써 Android 10 이상에서 '권한 거부' 오류가 해결됩니다", - "@safMigrationMessage1": { - "description": "First paragraph of SAF migration dialog" - }, - "setupStorageRequired": "저장소 접근 권한 필요", - "@notifLibraryScanErrors": { - "description": "Library scan complete suffix - error count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "appearanceHistoryViewGrid": "그리드", - "trackConvertConverting": "오디오를 변환하는 중...", - "@trackConvertConverting": { - "description": "Snackbar while converting" - }, - "@setupUseDefaultFolder": { - "description": "Dialog title for default folder" - }, - "optionsArtistTagModeSplitVorbisSubtitle": "FLAC 및 Opus의 경우 아티스트당 하나의 아티스트 태그를 작성하세요. MP3 및 M4A는 병합된 상태로 유지됩니다", - "snackbarPlayingNext": "다음 곡 재생", - "@snackbarPlayingNext": { - "description": "Snackbar when a track is inserted as the next queue item" - }, - "optionsDefaultSearchTabSubtitle": "새 검색 결과를 표시할 탭을 먼저 선택하세요", - "@editMetadataAutoFillFetch": { - "description": "Button label to fetch online metadata and fill selected fields" - }, - "tutorialSearchDesc": "다운로드하고 싶은 음악을 찾는 두 가지 쉬운 방법이 있습니다", - "@sectionService": { - "description": "Settings section header" - }, - "notifUpdateProgress": "{received} / {total} MB • {percentage}%", - "@discographyDownloadSelected": { - "description": "Button - download selected albums" - }, - "cacheClearAllConfirmMessage": "이 페이지의 모든 캐시 카테고리가 지워집니다. 다운로드한 음악 파일은 삭제되지 않습니다", - "@cacheClearAllConfirmMessage": { - "description": "Dialog message before clearing all caches" - }, - "extensionsHomeFeedProvider": "홈 피드 제공자", - "@extensionsHomeFeedProvider": { - "description": "Extensions page - label for home feed provider selector" - }, - "@cacheExploreFeed": { - "description": "Cache item title for explore home feed cache" - }, - "@audioAnalysisDynamicRange": { - "description": "Dynamic range metric label" - }, - "unknownAlbum": "알 수 없는 앨범", - "trackCoverCurrent": "현재 표지", - "downloadSongLinkRegionDesc": "SongLink를 통해 트랙 링크를 해결할 경우에 사용되는 지역입니다. 스트리밍 서비스를 이용할 수 있는 국가를 선택하세요", - "downloadPrimaryArtistOnlyOff": "기본 아티스트만: OFF", - "dialogDone": "완료", - "@dialogDone": { - "description": "Dialog button - action completed" - }, - "storeRepoUrlLabel": "리포지토리 URL", - "downloadSelectServiceToEnable": "이 옵션을 활성화하려면 음질 옵션이 있는 공급자를 선택하세요", - "@logIssueRateLimitedSuggestion": { - "description": "Diagnostic badge suggestion for rate limiting" - }, - "libraryScanProgress": "{total} 개의 파일 중 {progress}%", - "@libraryScanProgress": { - "description": "Scan progress display", - "placeholders": { - "progress": { - "type": "String" - }, - "total": { - "type": "int" - } - } - }, - "collectionLovedEmptyTitle": "'좋아요 표시한 트랙' 폴더가 비어 있음", - "tutorialExtensionsTitle": "확장 프로그램", - "@tutorialExtensionsTitle": { - "description": "Tutorial extensions page title" - }, - "searchSortDurationShort": "재생시간 (짧은순)", - "@searchSortDurationShort": { - "description": "Sort option - shortest duration first" - }, - "trackCopyFilePath": "파일 경로 복사", - "@trackCopyFilePath": { - "description": "Action - copy file path" - }, - "albumFolderArtistAlbumFlatSubtitle": "아티스트/앨범/ 및 아티스트/song.flac", - "@trackConvertResampler": { - "description": "Section label for lossless conversion resampler options" - }, - "editMetadataFieldTrackNum": "트랙 #", - "@editMetadataFieldTrackNum": { - "description": "Chip label for track number field in auto-fill selector" - }, - "snackbarFailedToUpdate": "확장 프로그램 업데이트 실패", - "@snackbarFailedToUpdate": { - "description": "Snackbar - extension update error" - }, - "notifAlreadyInLibrary": "이미 라이브러리에 있음", - "@notifAlreadyInLibrary": { - "description": "Notification title when track is already in library" - }, - "collectionPlaylistNameHint": "재생목록 이름", - "extensionVerificationCopyLink": "링크 복사", - "@replayGainBatchAnalyzing": { - "description": "Progress dialog title while batch scanning ReplayGain" - }, - "setupLanguageTitle": "언어 선택", - "extensionId": "ID", - "@extensionId": { - "description": "Extension detail - unique ID" - }, - "regionCountryBR": "브라질", - "@updateNewVersionReady": { - "description": "Update subtitle" - }, - "@queueDownloadedFileMissing": { - "description": "Accessibility label when a downloaded file is missing from disk" - }, - "@lyricsMode": { - "description": "Setting - how to save lyrics" - }, - "@settingsAppearance": { - "description": "Settings section - visual customization" - }, - "@setupStorageAccessMessageAndroid11": { - "description": "Android 11+ specific explanation" - }, - "@tutorialLibraryTip3": { - "description": "Tutorial library tip 3" - }, - "@downloadAppleQqMultiPersonDisabled": { - "description": "Subtitle when multi-person lyrics is off" - }, - "libraryStorageAccessMessage": "SpotifyFLAC은 음악 라이브러리를 스캔하기 위해 저장소 접근 권한이 필요합니다. 설정에서 권한을 부여해 주세요", - "@libraryStorageAccessMessage": { - "description": "Dialog message for storage permission" - }, - "@tutorialLibraryTip1": { - "description": "Tutorial library tip 1" - }, - "dialogRemoveExtensionMessage": "이 확장 프로그램을 제거하시겠습니까? 이 작업은 되돌릴 수 없습니다", - "@dialogRemoveExtensionMessage": { - "description": "Dialog message - uninstall confirmation" - }, - "setupDownloadLocationTitle": "다운로드 경로", - "@setupDownloadLocationTitle": { - "description": "Download location dialog title" - }, - "downloadNetworkCompatibilityModeEnabled": "이전 네트워크에 대한 레거시 TLS 설정 사용", - "@downloadNetworkCompatibilityModeEnabled": { - "description": "Subtitle when network compatibility mode is on" - }, - "@audioAnalysisBitDepth": { - "description": "Bit depth metric label" - }, - "trackOptionAddToLoved": "좋아요 표시한 트랙에 추가", - "@trackOptionAddToLoved": { - "description": "Bottom sheet action label - add track to loved folder" - }, - "cacheAppDirectory": "앱 캐시 디렉토리", - "@cacheAppDirectory": { - "description": "Cache item title for app cache directory" - }, - "lyricsProviderMusixmatchDesc": "최대 규모의 가사 데이터베이스 (다국어 지원)", - "@navStore": { - "description": "Bottom navigation - Extension store tab" - }, - "extensionPostProcessing": "후처리", - "@searchTracks": { - "description": "Search filter label - tracks" - }, - "logCopied": "로그가 클립보드에 복사됨", - "@logCopied": { - "description": "Snackbar - logs copied" - }, - "@extensionHealthRequired": { - "description": "Label for a required extension service health check" - }, - "@previewPlay": { - "description": "Tooltip for the button that plays a short track preview snippet" - }, - "clickableLookingUpArtist": "아티스트를 검색하는 중...", - "@clickableLookingUpArtist": { - "description": "Snackbar shown while clickable artist metadata is being resolved" - }, - "@extensionVerificationBrowserSubtitleInApp": { - "description": "Subtitle when in-app browser is preferred for extension verification" - }, - "setupUseDefaultFolder": "기본 폴더를 사용하시겠습니까?", - "tutorialSearchHint": "붙여넣기 또는 검색...", - "@logIssueTrackNotFoundLabel": { - "description": "Diagnostic badge label when a track is unavailable" - }, - "@storageModeAppFolderSubtitle": { - "description": "Subtitle for app folder storage mode" - }, - "downloadMusixmatchLanguage": "Musixmatch 언어", - "@downloadMusixmatchLanguage": { - "description": "Setting for Musixmatch lyrics translation language" - }, - "lyricsModeExternal": "외부 .lrc 파일", - "@setupSelectFolder": { - "description": "Button to select folder" - }, - "logSearchHint": "로그를 검색하는 중...", - "@backupCreateFailed": { - "description": "Snackbar when backup creation fails" - }, - "@settingsSaveDownloadHistorySubtitle": { - "description": "Settings switch subtitle for storing completed downloads in history" - }, - "@albumFolderArtistAlbumFlat": { - "description": "Album folder option with singles directly in artist folder" - }, - "extensionHealthRequired": "필수", - "actionCancel": "취소", - "@actionCancel": { - "description": "Action button - cancel operation" - }, - "optionsEmbedMetadataSubtitleOff": "비활성화됨 (고급): 모든 메타데이터 삽입 건너뛰기", - "@optionsEmbedMetadataSubtitleOff": { - "description": "Subtitle when metadata embedding is disabled" - }, - "downloadAllowLocalNetworkDisabled": "보안을 위해 로컬/사설 주소가 차단됨", - "@downloadAllowLocalNetworkDisabled": { - "description": "Subtitle when allow local network access is off" - }, - "@extensionsDownloadPrioritySubtitle": { - "description": "Subtitle for download priority" - }, - "downloadSingleFilenameFormat": "싱글 파일 이름 형식", - "@downloadSingleFilenameFormat": { - "description": "Setting for output filename pattern for singles/EPs" - }, - "cacheSummarySubtitle": "캐시를 지워도 다운로드한 음악 파일은 삭제되지 않습니다", - "@cacheSummarySubtitle": { - "description": "Helper text for cache summary card" - }, - "libraryFilterMetadataIncorrectIsrcFormat": "잘못된 ISRC 형식", - "libraryFilterMetadataMissingTrackNumber": "트랙 번호 누락", - "@libraryFilterMetadataMissingTrackNumber": { - "description": "Filter option - items missing track number" - }, - "backupIncludeSecretsDescription": "확장 프로그램의 토큰과 API 키가 백업 파일에 함께 저장됩니다. 백업 파일은 안전하게 보관하세요. 비활성화하면 복원 후 다시 입력해야 합니다", - "@backupIncludeSecretsDescription": { - "description": "Explanation for the include-credentials toggle" - }, - "audioAnalysisChannelStats": "채널별 통계", - "@audioAnalysisChannelStats": { - "description": "Per-channel audio analysis section label" - }, - "@extensionServiceStatus": { - "description": "Extension detail section header for service status" - }, - "queueEmptySingles": "싱글 다운로드가 없음", - "@queueEmptySingles": { - "description": "Empty state title when no single track downloads exist" - }, - "@snackbarSelectedPlaylistsEmpty": { - "description": "Snackbar when selected playlists contain no tracks" - }, - "@errorRateLimited": { - "description": "Error title - too many requests" - }, - "setupDownloadInFlac": "Spotify 음악을 FLAC 형식으로 다운로드하세요", - "@setupDownloadInFlac": { - "description": "App tagline in setup" - }, - "trackRemoveFromDevice": "기기에서 제거", - "@extensionsNoDownloadProvider": { - "description": "Empty state - no download providers" - }, - "@backupCreated": { - "description": "Snackbar after a backup file is created" - }, - "cacheSummaryTitle": "캐시 요약", - "@cacheSummaryTitle": { - "description": "Heading for cache summary card" - }, - "selectionReplayGainCount": "리플레이게인 ({count})", - "@selectionReplayGainCount": { - "description": "Batch selection action button label for ReplayGain", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@setupNotificationBackgroundDescription": { - "description": "Detailed notification explanation" - }, - "safMigrationTitle": "저장소 업데이트 필요", - "snackbarMetadataSaved": "메타데이터 저장 성공", - "@snackbarMetadataSaved": { - "description": "Snackbar after successfully saving track metadata" - }, - "@backupContentsSettings": { - "description": "Backup contents row label for settings" - }, - "logClearLogsTitle": "로그 삭제", - "extensionsCustomSearch": "사용자 정의 검색", - "@extensionsCustomSearch": { - "description": "Label for custom search provider" - }, - "@downloadFrom": { - "description": "Label - download source" - }, - "cacheSizeWithFiles": "{count} 개의 파일에 {size} 사용", - "selectionShareNoFiles": "공유할 수 있는 파일을 찾을 수 없음", - "@selectionShareNoFiles": { - "description": "Snackbar when no selected files exist on disk" - }, - "snackbarAddedTracksToQueue": "다운로드 목록에 {count} 개의 트랙이 추가됨", - "downloadFilenameInsertTag": "태그를 삽입하려면 탭하세요:", - "@downloadFilenameInsertTag": { - "description": "Label above filename tag chips" - }, - "collectionRemovedFromFavoriteArtists": "''{artistName}''가 좋아하는 아티스트에서 제거됨", - "@collectionRemovedFromFavoriteArtists": { - "description": "Snackbar after removing artist from favorite artists", - "placeholders": { - "artistName": { - "type": "String" - } - } - }, - "queueDownloadSpeedStatus": "다운로드하는 중 - {speed} MB/s", - "backupRestoreConfirmButton": "복원", - "@libraryCleanupMissingFiles": { - "description": "Button to remove entries for missing files" - }, - "backupCreateFailed": "백업 생성 실패", - "notifLibraryScanFailed": "라이브러리 스캔 실패", - "@notifLibraryScanFailed": { - "description": "Notification title when library scan fails" - }, - "audioAnalysisRescan": "다시 분석", - "@trackTrackName": { - "description": "Metadata label - track title" - }, - "@setupPermissionRequired": { - "description": "Generic permission required title", - "placeholders": { - "permissionType": { - "type": "String", - "description": "Type of permission (Storage/Notification)" - } - } - }, - "@nowPlayingNoLyrics": { - "description": "Empty state when the playing file has no embedded lyrics" - }, - "libraryFilesUnit": "{count, plural, =1{파일} other{파일}}", - "@libraryFilesUnit": { - "description": "Unit label for files count during library scanning", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@extensionMetadataProvider": { - "description": "Capability - provides metadata" - }, - "@downloadFilterContributing": { - "description": "Setting to strip contributing artists from Album Artist folder name" - }, - "libraryScanSelectFolderFirst": "먼저 폴더를 선택하세요", - "@sectionDownload": { - "description": "Settings section header" - }, - "extensionHealthNotConfigured": "설정되지 않음", - "queueRetryAllFailed": "재시도 {count} 번 실패", - "folderOrganizationByPlaylistSubtitle": "각 재생목록별 별도 폴더", - "@folderOrganizationByPlaylistSubtitle": { - "description": "Subtitle for playlist folder option" - }, - "lyricsProviderExtensionDesc": "확장 프로그램 제공자", - "@libraryFilterQualityHiRes": { - "description": "Filter option - high resolution audio" - }, - "trackConvertTitle": "오디오 변환", - "@trackConvertTitle": { - "description": "Title of convert bottom sheet" - }, - "setupSkipForNow": "다음에 할래요", - "sectionDownload": "다운로드", - "downloadLossyOpus256Subtitle": "최고 음질 Opus, 트랙당 약 8MB", - "@downloadLossyOpus256Subtitle": { - "description": "Subtitle for Opus 256kbps lossy option" - }, - "@trackConvertActionLabelLossless": { - "description": "Convert button label for lossless conversion with quality cap", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "storeRequiresVersion": "v{version} 이상 필요", - "@storeRequiresVersion": { - "description": "Store compatibility badge for minimum app version", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "metadataProviderPriorityDescription": "드래그하여 메타데이터 제공자 순서를 변경하세요. 앱은 트랙을 검색하고 메타데이터를 가져올 경우에 위에서 아래로 제공자를 시도합니다", - "@notifUpdateFailed": { - "description": "Notification title when app update download fails" - }, - "extensionsInfoTip": "확장 프로그램은 새 메타데이터와 다운로드 제공자를 추가할 수 있습니다. 신뢰할 수 있는 출처에서만 확장 프로그램을 설치하세요", - "@extensionsInfoTip": { - "description": "Security warning about extensions" - }, - "@downloadAppleQqMultiPersonEnabled": { - "description": "Subtitle when multi-person lyrics is on" - }, - "libraryFilterMetadataMissingYear": "연도 누락", - "extensionsDownloadPriority": "다운로드 우선순위", - "@extensionsDownloadPriority": { - "description": "Setting - download provider order" - }, - "@downloadAllowLocalNetworkEnabled": { - "description": "Subtitle when allow local network access is on" - }, - "libraryScan": "라이브러리 스캔", - "@libraryScan": { - "description": "Button to start library scan" - }, - "editMetadataFieldLabel": "레이블", - "@editMetadataFieldLabel": { - "description": "Chip label for label field in auto-fill selector" - }, - "updateDownloadFailed": "다운로드 실패", - "@updateDownloadFailed": { - "description": "Update error title" - }, - "appearanceAmoledDarkSubtitle": "순수 검정 배경화면", - "@appearanceAmoledDarkSubtitle": { - "description": "Subtitle for AMOLED dark" - }, - "setupIcloudNotSupported": "iCloud Drive는 지원되지 않습니다. 앱의 문서 폴더를 사용해 주세요", - "trackLyricsEmbeddedSource": "내장", - "@trackLyricsEmbeddedSource": { - "description": "Lyrics source label for embedded lyrics" - }, - "@trackAlbumArtist": { - "description": "Metadata label - album artist" - }, - "extensionsInstallPartialSuccess": "{attempted} 개의 확장 프로그램 중 {installed} 개가 설치됨", - "@extensionsInstallPartialSuccess": { - "description": "Message when installing multiple extensions partially succeeds", - "placeholders": { - "installed": { - "type": "int", - "description": "Number of successfully installed extensions" - }, - "attempted": { - "type": "int", - "description": "Number of selected extensions" - } - } - }, - "@extensionSettingsCount": { - "description": "Count of settings exposed by an extension quality option", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanCancelled": "라이브러리 스캔이 취소됨", - "@notifLibraryScanCancelled": { - "description": "Notification title when library scan is cancelled by the user" - }, - "collectionPlaylistNameRequired": "재생목록 이름은 필수입니다", - "libraryCleanupMissingFiles": "누락된 파일 정리", - "storeCategoryUtility": "유틸리티", - "@storeCategoryUtility": { - "description": "Store extension category - utility" - }, - "searchSortTitle": "결과 정렬", - "@extensionVerificationBrowserExternal": { - "description": "Chip label for external browser verification mode" - }, - "audioAnalysisLufs": "LUFS", - "@setupAllowAccessToManageFiles": { - "description": "Instruction for file access permission" - }, - "extensionsErrorLoading": "확장 프로그램 불러오기 오류", - "@actionPaste": { - "description": "Generic action - paste from clipboard" - }, - "aboutFeatureRequestSubtitle": "앱의 새 기능을 제안해 주세요", - "@aboutFeatureRequestSubtitle": { - "description": "Subtitle for feature request" - }, - "@aboutTitle": { - "description": "About page title" - }, - "@downloadNeteaseIncludeTranslation": { - "description": "Setting to include translated lyrics from Netease" - }, - "@actionGo": { - "description": "Generic action button label" - }, - "regionCountryFR": "프랑스", - "trackConvertResamplerSoxr": "SoXr", - "extensionUpdated": "업데이트됨", - "@extensionUpdated": { - "description": "Extension detail - last update" - }, - "downloadLossyFormat": "손실 압축 형식", - "@downloadLossyFormat": { - "description": "Setting title to pick output format for lossy downloads" - }, - "snackbarAlreadyInLibrary": "라이브러리에 ''{trackName}''이 이미 존재함", - "@snackbarAlreadyInLibrary": { - "description": "Snackbar - track already exists in local library", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "libraryExternalPlayerSubtitle": "감상용으로 권장됩니다. 최고 음질, 갭리스 재생, EQ 및 다양한 오디오 형식을 지원합니다", - "extensionCustomUrlHandlingShareHint": "이 사이트의 링크를 SpotiFLAC Mobile로 공유하면 이 확장 프로그램이 처리합니다", - "libraryFilterQuality": "음질", - "@libraryFilterQuality": { - "description": "Filter section - audio quality" - }, - "editMetadataAutoFillDone": "온라인 메타데이터로부터 {count} 개의 {count, plural, =1{필드} other{필드}}가 채워짐", - "@editMetadataAutoFillDone": { - "description": "Snackbar confirming how many fields were auto-filled", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@discographyDownload": { - "description": "Button - download artist discography" - }, - "aboutFeatureRequest": "기능 요청", - "downloadSingleFilenameFormatDescription": "싱글 및 EP용 파일 이름 패턴입니다. 앨범 형식과 동일한 태그를 사용합니다", - "@downloadSingleFilenameFormatDescription": { - "description": "Subtitle description for single filename format setting" - }, - "queueClearAllMessage": "모든 다운로드를 지우시겠습니까?", - "dialogDisableHistoryMessage": "기존 기록이 삭제됩니다. 다운로드한 파일은 삭제되지 않습니다", - "extensionLastChecked": "마지막 확인 시간: {time}", - "@extensionLastChecked": { - "description": "Timestamp for the latest extension service health check", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "homeImportCsvTooltip": "CSV 가져오기", - "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" - }, - "trackConvertResamplerSwr": "SWR", - "@trackConvertResamplerSwr": { - "description": "Lossless conversion default FFmpeg swresample resampler option" - }, - "@downloadFolderOrganization": { - "description": "Title of the folder organization picker bottom sheet" - }, - "dialogClearHistoryTitle": "기록 지우기", - "@logClearSearch": { - "description": "Tooltip for clearing the log search field" - }, - "dialogImport": "불러오기", - "@dialogImport": { - "description": "Dialog button - import data" - }, - "@setupChangeFolderTooltip": { - "description": "Tooltip for editing the selected download folder" - }, - "notifLibraryScanErrors": "{count} 개의 오류", - "@downloadNetworkCompatibilityMode": { - "description": "Setting for legacy TLS/network handling" - }, - "@metadataSaveFailedFfmpeg": { - "description": "Snackbar error when FFmpeg fails to write metadata" - }, - "dialogUninstallExtension": "확장 프로그램을 제거하시겠습니까?", - "recentTypePlaylist": "재생목록", - "@recentTypePlaylist": { - "description": "Recent access item type - playlist" - }, - "trackDeleteConfirmMessage": "이렇게 하면 다운로드한 파일이 영구적으로 삭제되고 기록에서 제거됩니다", - "@logIssueNetworkErrorDescription": { - "description": "Diagnostic badge description for generic network errors" - }, - "appearanceThemeSystem": "시스템", - "@appearanceThemeSystem": { - "description": "Follow system theme" - }, - "albumFolderArtistAlbumSingles": "아티스트 / 앨범 + 싱글", - "@aboutTranslators": { - "description": "Section for translators" - }, - "shareSheetNotFound": "찾을 수 없음", - "@shareSheetNotFound": { - "description": "Cross-service share sheet row subtitle when a service has no match" - }, - "@tutorialDownloadInProgressSemantics": { - "description": "Accessibility label for active download state in tutorial demo" - }, - "editMetadataAutoFillNoneSelected": "자동 채우기를 위해 하나 이상의 필드를 선택하세요", - "@editMetadataAutoFillNoneSelected": { - "description": "Snackbar when user taps Fetch without selecting any fields" - }, - "@snackbarViewQueue": { - "description": "Snackbar action - view download queue" - }, - "@optionsUpdateChannelPreview": { - "description": "Include beta/preview updates" - }, - "editMetadataFieldComposer": "작곡가", - "@editMetadataFieldComposer": { - "description": "Label for composer field in the edit metadata sheet" - }, - "aboutSachinsenalDesc": "HiFi 프로젝트의 원작자이자, 무손실 음원 소스 연동 기능의 토대를 구축한 개발자입니다", - "@aboutSachinsenalDesc": { - "description": "Credit description for sachinsenal0x64" - }, - "backupTitle": "백업 & 복원", - "@libraryFilterMetadata": { - "description": "Filter section - metadata completeness" - }, - "setupStorageAccessRequired": "저장소 접근 권한 필요", - "@setupStorageAccessRequired": { - "description": "Title when storage access needed" - }, - "trackMetadataDelete": "삭제", - "@trackMetadataDelete": { - "description": "Action button - delete track" - }, - "libraryFilterMetadataMissingDiscNumber": "디스크 번호 누락", - "@libraryFilterMetadataMissingDiscNumber": { - "description": "Filter option - items missing disc number" - }, - "snackbarMetadataProviderSaved": "메타데이터 제공자 우선순위가 저장됨", - "setupPermissionRequired": "''{permissionType}'' 권한 필요", - "@selectionConvertNoConvertible": { - "description": "Snackbar when no selected tracks support conversion" - }, - "extensionHealthDegraded": "저하됨", - "regionCountryKR": "한국", - "@regionCountryKR": { - "description": "Country name for SongLink region picker" - }, - "trackLyricsNotInFile": "이 파일에서 가사를 찾을 수 없습니다", - "@trackLyricsNotInFile": { - "description": "Message when no embedded lyrics in audio file" - }, - "@downloadedAlbumTapToSelect": { - "description": "Selection hint" - }, - "downloadArtistNameFilters": "아티스트 이름 필터", - "@downloadArtistNameFilters": { - "description": "Setting title for artist folder filter options" - }, - "@libraryFilterMetadataMissingArtist": { - "description": "Filter option - items missing artist" - }, - "recentShowAllDownloads": "모든 다운로드 표시", - "@appearanceThemeLight": { - "description": "Light theme" - }, - "trackReEnrichFieldTrackInfo": "트랙 & 디스크 번호", - "@appearanceThemeDark": { - "description": "Dark theme" - }, - "extensionVerificationLinkCopied": "인증 링크가 복사됨", - "@extensionVerificationLinkCopied": { - "description": "Snackbar after copying the extension verification URL" - }, - "@extensionsHomeFeedDescription": { - "description": "Extensions page - description for home feed provider picker" - }, - "downloadAlbumArtistMetadataPrimaryOnly": "앨범 아티스트 메타데이터: 기본만", - "@downloadAlbumArtistMetadataPrimaryOnly": { - "description": "Status label when album-artist folder filtering uses primary artist only" - }, - "extensionOauthConnectHint": "Spotify에 연결을 탭하여 이 필드를 채우세요", - "setupNext": "다음", - "extensionVerificationBrowserSubtitleInApp": "인증을 앱 내 브라우저에서 먼저 실행합니다", - "libraryAutoScanDaily": "매일", - "@libraryAutoScanDaily": { - "description": "Auto scan once per day" - }, - "@audioAnalysisDescription": { - "description": "Description for audio analysis tap-to-analyze prompt" - }, - "nowPlayingUpNext": "다음 곡", - "@nowPlayingUpNext": { - "description": "Title for the playback queue sheet" - }, - "logAutoScrollOff": "자동 스크롤: OFF", - "trackConvertFailed": "변환 실패", - "@trackConvertFailed": { - "description": "Snackbar when conversion fails" - }, - "extensionsUninstall": "제거", - "safMigrationSuccess": "다운로드 폴더가 SAF 모드로 업데이트됨", - "optionsClearHistorySubtitle": "기록에서 모든 다운로드한 트랙을 제거합니다", - "@optionsClearHistorySubtitle": { - "description": "Subtitle for clear history" - }, - "trackPlayNext": "다음 곡 재생", - "extensionsNoHomeFeedExtensions": "홈 피드가 있는 확장 프로그램가 없음", - "optionsUpdateChannelStable": "안정 버전만 받기", - "@optionsUpdateChannelStable": { - "description": "Only stable updates" - }, - "@discographyDownloadAllSubtitle": { - "description": "Subtitle showing total tracks and albums", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "searchPlaylists": "재생목록", - "@searchPlaylists": { - "description": "Search result category - playlists" - }, - "downloadNetworkCompatibilityMode": "네트워크 호환 모드", - "settingsAppearance": "디자인", - "logIssueRateLimitedLabel": "사용 제한", - "@logIssueRateLimitedLabel": { - "description": "Diagnostic badge label when the service rate limits requests" - }, - "logIssueSummary": "문제 요약", - "@logIssueSummary": { - "description": "Header for log issue analysis summary" - }, - "appName": "SpotiFLAC Mobile", - "storeRepoDialogCurrent": "현재 리포지토리:", - "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" - }, - "@trackLyrics": { - "description": "Tab title - lyrics" - }, - "@backupImportButton": { - "description": "Button to pick a backup file to restore" - }, - "@setupFolderChoose": { - "description": "Button to choose folder" - }, - "storageModeAppFolderSubtitle": "기본적으로 Music/SpotiFLAC에 저장", - "@extensionsDisabled": { - "description": "Extension status - inactive" - }, - "@regionCountryAU": { - "description": "Country name for SongLink region picker" - }, - "@storeCategoryMetadata": { - "description": "Store extension category - metadata" - }, - "libraryFilterApply": "적용", - "@libraryFilterApply": { - "description": "Apply filters button" - }, - "@libraryFilterSortGenreAsc": { - "description": "Sort option - genre ascending" - }, - "setupAllowAccessToManageFiles": "다음 화면에서 '모든 파일 관리 권한 허용'을 활성화해 주세요", - "@dialogSave": { - "description": "Dialog button - save changes" - }, - "trackLyrics": "가사", - "extensionSettingNotSet": "설정되지 않음", - "@extensionSettingNotSet": { - "description": "Value shown when an extension setting has no value" - }, - "@audioAnalysisClipping": { - "description": "Clipping metric label" - }, - "downloadNeteaseIncludeTranslation": "Netease: 번역 포함", - "@albumFolderArtistAlbumSubtitle": { - "description": "Folder structure example" - }, - "@settingsDonateSubtitle": { - "description": "Subtitle for donate menu item" - }, - "cueSplitSuccess": "{count} 개의 트랙 분할 성공", - "@cueSplitSuccess": { - "description": "Snackbar after successful CUE split", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cueSplitArtist": "아티스트: {artist}", - "@cueSplitArtist": { - "description": "Artist name in CUE split sheet", - "placeholders": { - "artist": { - "type": "String" - } - } - }, - "updateSeeReleaseNotes": "자세한 내용은 릴리스 노트를 참조하세요", - "@updateSeeReleaseNotes": { - "description": "Fallback changelog text when release notes cannot be parsed" - }, - "@trackReEnrichFfmpegFailed": { - "description": "Snackbar when FFmpeg embed fails for MP3/Opus" - }, - "collectionWishlist": "위시리스트", - "@collectionWishlist": { - "description": "Custom folder for saved tracks to download later" - }, - "editMetadataAutoFillFetch": "가져오기 & 채우기", - "@extensionsHomeFeedAuto": { - "description": "Label for auto-selected search provider" - }, - "providerPriorityDescription": "드래그하여 다운로드 제공자 순서를 변경하세요. 앱은 트랙을 다운로드할 경우에 위에서 아래로 제공자를 차례로 시도합니다", - "@providerPriorityDescription": { - "description": "Provider priority page description" - }, - "queueEmptySinglesSubtitle": "싱글 트랙 다운로드는 여기에 표시됩니다", - "downloadLossyOpus128": "Opus 128kbps", - "downloadUseAlbumArtistForFolders": "폴더에 앨범 아티스트 사용", - "@downloadUseAlbumArtistForFolders": { - "description": "Setting - choose whether artist folders use Album Artist or Track Artist" - }, - "@aboutLinks": { - "description": "Section for external links" - }, - "downloadedAlbumDeleteCount": "{count} {count, plural, =1{트랙} other{트랙}} 삭제", - "updateLater": "나중에", - "@logIssueIspBlockingSuggestion": { - "description": "Diagnostic badge suggestion for ISP blocking" - }, - "actionResume": "계속", - "optionsDetailedLoggingOff": "버그 보고서 활성화", - "@searchSortDefault": { - "description": "Sort option - default API order" - }, - "@regionCountryCA": { - "description": "Country name for SongLink region picker" - }, - "@sectionStorageAccess": { - "description": "Section header for storage access settings" - }, - "downloadFilterContributing": "참여 아티스트 필터", - "downloadUseAlbumArtistForFoldersTrackSubtitle": "트랙 아티스트 태그로 이름이 지정된 폴더", - "storeSearch": "확장 프로그램 검색...", - "@storeSearch": { - "description": "Store search placeholder" - }, - "aboutTelegramChat": "텔레그램 커뮤니티", - "lyricsModeBoth": "둘 다", - "@lyricsModeBoth": { - "description": "Lyrics mode option - embed and external" - }, - "@permissionNotification": { - "description": "Notification permission type label" - }, - "libraryAutoScanSubtitle": "라이브러리에서 새 파일을 자동으로 스캔합니다", - "@libraryAutoScanSubtitle": { - "description": "Subtitle for auto scan setting" - }, - "libraryEnableLocalLibrary": "로컬 라이브러리 활성화", - "trackConvertTargetFormat": "변경될 형식", - "@trackConvertTargetFormat": { - "description": "Label for format selection" - }, - "extensionSettings": "설정", - "@editMetadataAutoFillSearching": { - "description": "Snackbar shown while searching for online metadata" - }, - "trackLyricsTimeout": "요청 시간이 초과되었습니다. 나중에 다시 시도하세요", - "settingsExtensions": "확장 프로그램", - "@settingsBackup": { - "description": "Settings menu item - backup and restore page" - }, - "librarySourceDownloaded": "다운로드됨", - "@librarySourceDownloaded": { - "description": "Badge for tracks downloaded via SpotiFLAC" - }, - "appearanceDynamicColor": "동적 색상", - "@appearanceDynamicColor": { - "description": "Material You dynamic colors" - }, - "backupImportButton": "백업 파일 선택", - "downloadAppleElrcWordSyncDisabled": "더 안전한 Apple Music 가사 (줄 단위)", - "@optionsEmbedMetadata": { - "description": "Settings toggle title for writing metadata into downloaded files" - }, - "appearanceTitle": "디자인", - "downloadNeteaseIncludeRomanizationDisabled": "로마자 표기 없음", - "@downloadNeteaseIncludeRomanizationDisabled": { - "description": "Subtitle when Netease romanization is off" - }, - "@libraryScanCancelled": { - "description": "Library scan status when a scan was cancelled" - }, - "tracksCount": "{count, plural, =1{1 개의 트랙} other{{count} 개의 트랙}}", - "@snackbarFailedToUpdateNamed": { - "description": "Snackbar when extension update fails in the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "@extensionQualityOptions": { - "description": "Capability - quality selection" - }, - "logClearSearch": "로그 지우기", - "trackSaveLyrics": "가사 (.lrc) 저장", - "@trackReEnrichSearching": { - "description": "Snackbar while searching metadata from internet for local items" - }, - "@editMetadataAutoFillNoResults": { - "description": "Snackbar when online metadata search returns no results" - }, - "notifDownloadComplete": "다운로드 완료", - "snackbarAlreadyDownloaded": "''{trackName}''은 이미 다운로드되어 있음", - "folderOrganizationByAlbumSubtitle": "각 앨범별 별도 폴더", - "storeRepoUrlHint": "https://github.com/user/repo", - "trackConvertDitherTriangularHp": "삼각형 HP", - "lyricsModeBothSubtitle": ".lrc 파일을 삽입하고 저장합니다", - "trackReEnrichFieldExtra": "장르, 레이블, 저작권", - "@trackReEnrichFieldExtra": { - "description": "Checkbox label for extra metadata in re-enrich" - }, - "sectionLyrics": "가사", - "@sectionLyrics": { - "description": "Settings section header" - }, - "extensionStrategy": "전략: {strategy}", - "@extensionStrategy": { - "description": "Track matching strategy name", - "placeholders": { - "strategy": { - "type": "String" - } - } - }, - "@downloadNativeWorker": { - "description": "Setting title for Android native download worker" - }, - "optionsArtistTagModeSplitVorbis": "FLAC/Opus용 태그 분할", - "extensionsHomeFeedUse": "{extensionName} 홈 피드 사용", - "@cacheAppDirectoryDesc": { - "description": "Description of what app cache directory contains" - }, - "cancelDownloadTitle": "다운로드를 취소하시겠습니까?", - "updateWhatsNew": "새 기능", - "updateNewVersionReady": "새 버전이 준비되었습니다", - "@extensionVerificationClose": { - "description": "Button to dismiss the extension verification help dialog" - }, - "a11ySelectTrack": "트랙 선택", - "libraryClearSubtitle": "스캔된 모든 트랙 제거", - "@libraryClearSubtitle": { - "description": "Subtitle for clear button" - }, - "@settingsDownloadNetworkSubtitle": { - "description": "Subtitle explaining network preference" - }, - "storeAnyVersion": "모든", - "@storeAnyVersion": { - "description": "Store detail value when any app version is accepted" - }, - "navStore": "리포", - "backupExportSectionDescription": "설정, 다운로드 기록, 좋아요 표시한 트랙, 위시리스트, 즐겨찾는 아티스트 및 재생목록을 하나의 파일로 저장하여 보관하거나 다른 휴대전화로 옮길 수 있습니다", - "libraryScanSettings": "스캔 설정", - "@libraryScanSettings": { - "description": "Section header for scan settings" - }, - "trackDuration": "재생시간", - "@trackDuration": { - "description": "Metadata label - track length" - }, - "extensionHealthOffline": "오프라인", - "@extensionHealthOffline": { - "description": "Extension service health status - offline" - }, - "editMetadataFieldArtist": "아티스트", - "@editMetadataFieldArtist": { - "description": "Chip label for artist field in auto-fill selector" - }, - "libraryInLibrary": "in 라이브러리", - "pressBackAgainToExit": "종료하려면 뒤로가기 버튼을 다시 탭하세요", - "@pressBackAgainToExit": { - "description": "Exit confirmation message" - }, - "setupNotificationGranted": "알림 권한이 부여되었습니다!", - "@setupNotificationGranted": { - "description": "Success message for notification permission" - }, - "settingsDonate": "개발 지원", - "snackbarFailedToUpdateNamed": "{extensionName} 업데이트 실패", - "backupContentsTitle": "백업 콘텐츠", - "updateDontRemind": "알림 안 함", - "@dialogDiscard": { - "description": "Dialog button - discard changes" - }, - "editMetadataAutoFillSearching": "온라인에서 검색하는 중...", - "discographyDownloadSelected": "선택 항목 다운로드", - "trackConvertResampler": "리샘플러", - "queueFilteringIndicator": "필터링하는 중...", - "@queueFilteringIndicator": { - "description": "Shown while filter results are being computed" - }, - "@dialogDownloadAllTitle": { - "description": "Dialog title for bulk download confirmation" - }, - "cueSplitConfirmMessage": "''{album}''을 {count} 개의 개별 FLAC 파일로 분할하시겠습니까?\n\n파일은 동일한 디렉토리에 저장됩니다", - "@downloadCreatePlaylistSourceFolderRedundant": { - "description": "Subtitle when folder organization is already set to playlist" - }, - "regionCountryCA": "캐나다", - "cacheTempDirectory": "임시 디렉토리", - "@cacheTempDirectory": { - "description": "Cache item title for temporary files directory" - }, - "libraryShowDuplicateIndicator": "중복 표시기 표시", - "@logFilterBySeverity": { - "description": "Filter dialog title" - }, - "homeSearchHintProvider": "{providerName}으로 검색...", - "@downloadNeteaseIncludeTranslationDisabled": { - "description": "Subtitle when Netease translation is off" - }, - "optionsCheckUpdates": "업데이트 확인", - "replayGainBatchAnalyzing": "리플레이게인을 분석하는 중...", - "recentTypeAlbum": "앨범", - "providerExtension": "확장 프로그램", - "@providerExtension": { - "description": "Label for extension-provided providers" - }, - "trackCoverNoSource": "사용할 수 있는 표지 출처가 없음", - "libraryFilterMetadata": "메타데이터", - "albumFolderArtistYearAlbum": "아티스트 / [연도] 앨범", - "@albumFolderArtistYearAlbum": { - "description": "Album folder option with year" - }, - "audioAnalysisClipping": "클리핑", - "@a11yOpenAlbumByArtistTrackCount": { - "description": "Accessibility label for opening an album item with track count", - "placeholders": { - "albumName": { - "type": "String" - }, - "artistName": { - "type": "String" - }, - "trackCount": { - "type": "int" - } - } - }, - "backupExtensionsRestoreFailed": "{count} 개의 {count, plural, =1{확장 프로그램} other{확장 프로그램}}을 다시 설치할 수 없습니다. 저장소에서 수동으로 설치하세요", - "@backupExtensionsRestoreFailed": { - "description": "Snackbar/hint when some extensions failed to reinstall during restore", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "channelStable": "안정", - "@channelStable": { - "description": "Update channel - stable releases" - }, - "tutorialSettingsTip3": "앱 테마 및 디자인 사용자 정의", - "setupAppDocumentsFolderSubtitle": "권장 사항 - 파일 앱을 통해 접근 가능", - "a11yPlayTrackByArtist": "''{artistName}''의 ''{trackName}'' 재생", - "@a11yPlayTrackByArtist": { - "description": "Accessibility label for playing a local library track", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "dialogRemove": "제거", - "extensionVerificationClose": "닫기", - "bulkDownloadPlaylistsButton": "{count} 개의 {count, plural, =1{재생목록} other{재생목록}} 다운로드", - "@bulkDownloadPlaylistsButton": { - "description": "Button label for bulk downloading selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "optionsAutoFallbackSubtitle": "다운로드가 실패한 경우에 다른 서비스를 이용해 보세요", - "@optionsAutoFallbackSubtitle": { - "description": "Subtitle for auto fallback" - }, - "extensionPatternsCount": "{count} 개의 패턴", - "@libraryFilterLocal": { - "description": "Filter chip - show only local library items" - }, - "errorUrlNotRecognizedMessage": "이 링크는 지원되지 않습니다. URL이 올바른지, 호환되는 확장 프로그램이 설치되어 있는지 확인하세요", - "@errorUrlNotRecognizedMessage": { - "description": "Error message - URL not recognized explanation" - }, - "@extensionVerificationBrowserSubtitleExternal": { - "description": "Subtitle when external browser is preferred for extension verification" - }, - "optionsArtistTagMode": "아티스트 태그 모드", - "libraryFilterMetadataComplete": "전체 메타데이터", - "@libraryFilterMetadataComplete": { - "description": "Filter option - items with complete metadata" - }, - "@extensionsVersion": { - "description": "Extension version display", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "@downloadNetworkAnySubtitle": { - "description": "Subtitle for any-network option in picker" - }, - "optionsReplayGainSubtitleOn": "음량 스캔 및 리플레이게인 태그 삽입 (EBU R128)", - "libraryScanning": "스캔하는 중...", - "@libraryScanning": { - "description": "Status during scan" - }, - "cacheRefresh": "새로고침", - "@actionShuffle": { - "description": "Tooltip for shuffle playback action" - }, - "optionsEmbedLyricsSubtitle": "다운로드한 트랙과 함께 동기화된 가사를 저장합니다", - "@optionsEmbedLyricsSubtitle": { - "description": "Subtitle for embed lyrics" - }, - "queueEmptyAlbumsSubtitle": "앨범에서 여러 트랙을 다운로드하면 여기에 표시됩니다", - "extensionEnterValue": "값을 입력하세요", - "@settingsDownloadNetworkAny": { - "description": "Network option - use any connection" - }, - "collectionLoved": "좋아요 표시한 트랙", - "@collectionLoved": { - "description": "Custom folder for favorite tracks" - }, - "storeAddRepoTitle": "확장 프로그램 리포지토리 추가", - "@storeAddRepoTitle": { - "description": "Store setup screen - heading when no repo is configured" - }, - "collectionNoPlaylistsYet": "아직 재생목록이 없음", - "@collectionNoPlaylistsYet": { - "description": "Empty state title when user has no playlists" - }, - "libraryCleanupMissingFilesSubtitle": "더 이상 존재하지 않는 파일에 대한 항목을 제거합니다", - "@libraryCleanupMissingFilesSubtitle": { - "description": "Subtitle for cleanup button" - }, - "folderOrganizationByArtist": "아티스트별", - "@folderOrganizationByArtist": { - "description": "Folder option - artist folders" - }, - "aboutTranslators": "번역에 도움주신 분들", - "notifAlreadyInLibraryCount": "이미 라이브러리에 있음 ({completed}/{total})", - "editMetadataFieldTitle": "제목", - "@editMetadataFieldTitle": { - "description": "Chip label for title field in auto-fill selector" - }, - "downloadFilenameDescription": "''{artist}'', ''{title}'', ''{album}'', ''{track}'', ''{year}'', ''{date}'', ''{disc}''를 자리표시자로 사용하세요", - "@downloadFilenameDescription": { - "description": "Description shown in filename format editor" - }, - "@notifDownloadsFinishedBody": { - "description": "Notification body when queue finishes with failures", - "placeholders": { - "completed": { - "type": "int" - }, - "failed": { - "type": "int" - } - } - }, - "@libraryFolderNotExist": { - "description": "Error when folder doesn't exist" - }, - "@playlistsCount": { - "description": "Playlist count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@loadingSharedLink": { - "description": "Status when opening shared URL" - }, - "extensionServiceHealth": "서비스 상태", - "@extensionServiceHealth": { - "description": "Extension capability label for service health checks" - }, - "@collectionDeletePlaylistsMessage": { - "description": "Confirmation message for deleting selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "setupStorageDescription": "SpotiFLAC은 다운로드한 음악 파일을 저장하기 위해 저장소 접근 권한이 필요합니다", - "tutorialReadyMessage": "모든 준비가 완료되었습니다! 지금 바로 좋아하는 음악을 다운로드하세요", - "tutorialLibraryTip3": "더 나은 탐색을 위해 리스트 보기와 그리드 보기 사이를 전환하세요", - "selectionDeletePlaylistsCount": "{count} {count, plural, =1{재생목록} other{재생목록}} 삭제", - "appearanceThemeLight": "밝은", - "queueEmptyHistorySubtitle": "다운로드한 트랙이 여기에 표시됩니다", - "@queueEmptyHistorySubtitle": { - "description": "Empty state subtitle for download history" - }, - "backupRestoreFailed": "백업 복원 실패", - "@backupRestoreFailed": { - "description": "Snackbar when restore fails" - }, - "queueFlacQueuedWithSkipped": "다운로드 목록에 {addedCount} 개의 트랙을 추가하고, {skippedCount} 개의 트랙을 건너뜀", - "@queueFlacQueuedWithSkipped": { - "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", - "placeholders": { - "addedCount": { - "type": "int" - }, - "skippedCount": { - "type": "int" - } - } - }, - "@trackReplayGain": { - "description": "Three-dot menu option to scan loudness and write ReplayGain tags" - }, - "@downloadedAlbumDownloadedCount": { - "description": "Downloaded tracks count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "setupFolderChoose": "다운로드 폴더를 선택하세요", - "dialogDownloadAllTitle": "모두 다운로드", - "providerPriorityInfo": "첫 ​​번째 제공자에서 트랙을 사용할 수 없는 경우에 앱은 자동으로 다음 제공자를 시도합니다", - "@providerPriorityInfo": { - "description": "Info tip about fallback behavior" - }, - "@dialogDiscardChanges": { - "description": "Dialog title - unsaved changes warning" - }, - "discographyNoAlbums": "사용 가능한 앨범이 없음", - "downloadAppleQqMultiPersonDisabled": "스피커 레이블이 없는 표준 가사", - "cacheNoData": "캐시된 데이터가 없음", - "@cacheNoData": { - "description": "Label when cache category has no data" - }, - "tutorialStartDownloadSemantics": "다운로드 시작", - "@tutorialStartDownloadSemantics": { - "description": "Accessibility label for idle download button in tutorial demo" - }, - "logIssueIspBlockingSuggestion": "VPN을 사용하거나 DNS를 1.1.1.1 또는 8.8.8.8로 변경해 보세요", - "aboutTitle": "정보", - "@cueSplitButton": { - "description": "Button text to start CUE splitting" - }, - "appearanceHistoryView": "기록 정렬 방식", - "audioAnalysisSampleRate": "샘플링 레이트", - "@settingsCache": { - "description": "Settings menu item - cache management" - }, - "lyricsProvidersInfoText": "확장 프로그램 가사 제공자는 내장 가사 제공자보다 먼저 실행됩니다. 하나 이상의 제공자가 활성화되어 있어야 합니다", - "cacheTrackLookup": "트랙 조회 캐시", - "extensionsHomeFeedOffSubtitle": "메인 화면에 홈 피드를 표시하지 않습니다", - "@downloadUsePrimaryArtistOnly": { - "description": "Setting - strip featured artists from folder name" - }, - "@regionCountryIN": { - "description": "Country name for SongLink region picker" - }, - "@libraryFilterQualityLossy": { - "description": "Filter option - lossy compressed audio" - }, - "extensionRefreshStatus": "상태 새로고침", - "notifAllDownloadsComplete": "모든 다운로드 완료", - "downloadNeteaseIncludeRomanizationEnabled": "로마자 표기 포함", - "editMetadataFieldDateHint": "YYYY-MM-DD 또는 YYYY", - "@editMetadataFieldDateHint": { - "description": "Hint text for the edit metadata date field" - }, - "trackMetadataShare": "공유", - "@trackMetadataShare": { - "description": "Action button - share track" - }, - "discographyDownloadAllSubtitle": "{albumCount} 개의 릴리스에서 {count} 개의 트랙", - "settingsDonateSubtitle": "개발자에게 커피 한 잔 사주세요", - "libraryFilterDownloaded": "다운로드됨", - "downloadNetworkAnySubtitle": "Wi-Fi 또는 모바일 네트워크 사용", - "@cueSplitNoAudioFile": { - "description": "Error when CUE audio file is missing" - }, - "notifLibraryScanStopped": "스캔이 완료되기 전에 중단되었습니다", - "@settingsMetadata": { - "description": "Settings menu item - metadata settings" - }, - "snackbarFailedToInstallNamed": "{extensionName} 설치 실패", - "trackCopyLyrics": "가사 복사", - "@trackCopyLyrics": { - "description": "Action - copy lyrics to clipboard" - }, - "regionCountryAU": "호주", - "downloadAlbumFolderStructure": "앨범 폴더 구조", - "downloadMusixmatchAuto": "자동", - "actionDismiss": "닫기", - "storeFilterAll": "모두", - "extensionsDisabled": "비활성화됨", - "@logClearLogs": { - "description": "Clear button tooltip" - }, - "dialogDownloadAllMessage": "{count} 개의 트랙을 다운로드하시겠습니까?", - "@optionsEmbedLyrics": { - "description": "Embed lyrics in audio files" - }, - "tutorialLibraryTitle": "내 라이브러리", - "optionsCheckUpdatesSubtitle": "새 버전이 출시되면 알림", - "@optionsCheckUpdatesSubtitle": { - "description": "Subtitle for update check" - }, - "collectionPlaylist": "재생목록", - "@collectionPlaylist": { - "description": "Single playlist label" - }, - "dateMonthsAgo": "{count} 달 전", - "@dateMonthsAgo": { - "description": "Relative date - months ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@extensionRemoveButton": { - "description": "Button to uninstall extension" - }, - "collectionPlaylistRenamed": "재생목록 이름 변경 완료", - "collectionCreatePlaylist": "재생목록 생성", - "homeGoToAlbum": "앨범으로 이동", - "@homeGoToAlbum": { - "description": "Context menu item to navigate to the album page" - }, - "folderOrganizationByArtistSubtitle": "각 아티스트별 별도 폴더", - "@optionsClearHistory": { - "description": "Delete all download history" - }, - "@searchAlbums": { - "description": "Search result category - albums" - }, - "@sectionDebug": { - "description": "Settings section header" - }, - "extensionsVersion": "버전 {version}", - "@navHome": { - "description": "Bottom navigation - Home tab" - }, - "@editMetadataFieldDate": { - "description": "Chip label for date field in auto-fill selector" - }, - "downloadUsePrimaryArtistOnly": "폴더에 기본 아티스트만 사용", - "tutorialExtensionsTip2": "새 다운로드 제공자 또는 검색 출처를 추가하세요", - "@setupStorageGranted": { - "description": "Success message for storage permission" - }, - "tutorialWelcomeTitle": "SpotiFLAC에 오신 것을 환영합니다!", - "a11ySelectAlbum": "앨범 ''{albumName}'' 선택", - "@a11ySelectAlbum": { - "description": "Accessibility label for selecting an album", - "placeholders": { - "albumName": { - "type": "String" - } - } - }, - "aboutMobileSource": "모바일 소스 코드", - "@aboutMobileSource": { - "description": "Link to mobile GitHub repo" - }, - "@extensionCustomUrlHandling": { - "description": "Extension detail section title for custom URL handling" - }, - "@downloadMusixmatchLanguageAuto": { - "description": "Subtitle when no language is set" - }, - "@cancelDownloadKeep": { - "description": "Dialog button - keep the active download (do not cancel)" - }, - "libraryFilterSource": "출처", - "@libraryFilterSource": { - "description": "Filter section - source type" - }, - "sectionStorageAccess": "저장소 접근", - "logFilterBySeverity": "심각성에 따라 로그 분류", - "libraryFolderNotExist": "선택한 폴더가 존재하지 않음", - "optionsEmbedMetadataSubtitleOn": "메타데이터, 표지 이미지 및 내장 가사를 파일에 기록", - "albumFolderArtistAlbum": "아티스트 / 앨범", - "@albumFolderArtistAlbum": { - "description": "Album folder option" - }, - "allFilesAccessDeniedMessage": "권한이 거부되었습니다. 시스템 설정에서 '모든 파일 접근'를 수동으로 활성화하세요", - "@allFilesAccessDeniedMessage": { - "description": "Message when permission is permanently denied" - }, - "editMetadataSelectEmpty": "비어 있음만", - "settingsLocalLibrarySubtitle": "음악 스캔 & 중복 감지", - "@settingsAutoExportFailed": { - "description": "Setting toggle for auto-export" - }, - "cacheCleanupUnusedSubtitle": "불필요한 다운로드 기록 및 누락된 라이브러리 항목을 제거합니다", - "@tutorialSettingsTitle": { - "description": "Tutorial settings page title" - }, - "libraryFilterMetadataMissingGenre": "장르 누락", - "@appearanceSelectAccentColor": { - "description": "Accessibility label for picking an accent color", - "placeholders": { - "hex": { - "type": "String" - } - } - }, - "setupFolderDescription": "다운로드한 음악 파일이 저장될 폴더를 선택하세요", - "extensionDetailsTags": "태그", - "unknownArtist": "알 수 없는 아티스트", - "trackFetchOnlineLyrics": "온라인에서 가져오기", - "snackbarNoActionDefined": "이 버튼에 대해 정의된 작업이 없음", - "@snackbarNoActionDefined": { - "description": "Snackbar when an extension button has no action configured" - }, - "downloadAllCount": "모두 다운로드 ({count})", - "@downloadAllCount": { - "description": "Download all button with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumDiscHeader": "디스크 {discNumber}", - "@backupInvalidFile": { - "description": "Snackbar when the chosen file is not a valid backup" - }, - "@extensionHooksAvailable": { - "description": "Post-processing hooks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@logIssueTrackNotFoundSuggestion": { - "description": "Diagnostic badge suggestion when a track is unavailable" - }, - "@snackbarFileNotFound": { - "description": "Snackbar - file doesn't exist" - }, - "extensionHealthOnline": "온라인", - "@extensionHealthOnline": { - "description": "Extension service health status - online" - }, - "settingsSaveDownloadHistorySubtitle": "완료된 다운로드를 기록 및 라이브러리 보기에 유지합니다", - "trackOptionRemoveFromWishlist": "위시리스트에서 제거", - "extensionsFallbackTitle": "대체 확장 프로그램", - "@extensionsFallbackTitle": { - "description": "Setting and page title for choosing which download extensions can be used during fallback" - }, - "metadataSaveFailedFfmpeg": "FFmpeg를 통해 메타데이터 저장 실패", - "@albumFolderAlbumOnly": { - "description": "Album folder option" - }, - "@albumFolderYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "downloadedAlbumDeleteSelected": "선택 항목 삭제", - "selectionSelectPlaylistsToDelete": "삭제할 재생 목록 선택", - "@selectionSelectPlaylistsToDelete": { - "description": "Hint shown when no playlists are selected for deletion" - }, - "storeAddRepoDescription": "확장 프로그램을 찾아보고 설치하려면 registry.json 파일이 포함된 GitHub 리포지토리 URL을 입력하세요", - "appearanceThemeDark": "어두운", - "downloadedAlbumTapToSelect": "트랙을 탭하여 선택하세요", - "@collectionAddedToFavoriteArtists": { - "description": "Snackbar after adding artist to favorite artists", - "placeholders": { - "artistName": { - "type": "String" - } - } - }, - "@backupRestored": { - "description": "Snackbar after a successful restore" - }, - "nowPlayingLibraryEmpty": "라이브러리가 비어 있음", - "@nowPlayingLibraryEmpty": { - "description": "Snackbar when shuffle library is requested but library has no tracks" - }, - "editMetadataAutoFillNoResults": "온라인에서 일치하는 메타데이터를 찾을 수 없음", - "updateDownloading": "다운로드하는 중...", - "trackLyricsSource": "출처: {source}", - "logFilterLevel": "레벨", - "logNoLogsYet": "아직 로그 없음", - "cacheSizeOnly": "{size}", - "@cacheSizeOnly": { - "description": "Cache size only", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "trackOpenInService": "{serviceName}에서 열기", - "@trackOpenInService": { - "description": "Button label to open a track in a named music service", - "placeholders": { - "serviceName": { - "type": "String" - } - } - }, - "@cacheLibraryCoverDesc": { - "description": "Description of what library cover cache contains" - }, - "libraryClearConfirmMessage": "이렇게 하면 라이브러리에서 스캔된 모든 트랙이 제거됩니다. 실제 음악 파일은 삭제되지 않습니다", - "@dialogImportPlaylistMessage": { - "description": "Dialog message - import playlist confirmation", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionsHomeFeedAuto": "자동", - "searchEmptyResultSubtitle": "다른 키워드를 검색해 보세요", - "@searchEmptyResultSubtitle": { - "description": "Subtitle shown under the empty search result state on the home screen" - }, - "dateToday": "오늘", - "a11yOpenItem": "{itemType} {name} 열기", - "@a11yOpenItem": { - "description": "Accessibility label for opening a generic item", - "placeholders": { - "itemType": { - "type": "String" - }, - "name": { - "type": "String" - } - } - }, - "audioAnalysisBitDepth": "비트 심도", - "editMetadataFieldTrackTotal": "전체 트랙 수", - "@editMetadataFieldTrackTotal": { - "description": "Label for total tracks field in the edit metadata sheet" - }, - "@editMetadataFieldDiscTotal": { - "description": "Label for total discs field in the edit metadata sheet" - }, - "replayGainBatchConfirmMessage": "음량을 분석하고 {count} 개의 트랙에 리플레이게인 태그를 추가하시겠습니까?", - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "앨범 아티스트 태그로 이름이 지정된 폴더", - "@notifDownloadingUpdate": { - "description": "Notification title while downloading an app update", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "@csvImportTracks": { - "description": "Label shown in quality picker for CSV import", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackEditMetadata": "메타데이터 편집", - "discographyDownloadAll": "모두 다운로드", - "@discographyDownloadAll": { - "description": "Option - download entire discography" - }, - "@editMetadataFieldAlbum": { - "description": "Chip label for album field in auto-fill selector" - }, - "albumFolderArtistAlbumSubtitle": "앨범/아티스트 이름/앨범 이름/", - "extensionHealthServiceUnknown": "서비스 상태 알 수 없음", - "navHome": "홈", - "queueDownloadStarting": "시작하는 중...", - "@dialogRemoveExtension": { - "description": "Dialog title - uninstall extension" - }, - "notifLibraryScanProgressNoTotal": "{scanned} 게의 파일이 스캔됨 • {percentage}%", - "@appearanceAmoledDark": { - "description": "Theme option - pure black" - }, - "qualityHiResFlac": "Hi-Res FLAC", - "selectionSelected": "{count} 개 선택됨", - "extensionDetailsInformation": "정보", - "@extensionDetailsInformation": { - "description": "Section title for extension metadata information" - }, - "discographyDownload": "디스코그래피 다운로드", - "editMetadataFieldCopyright": "저작권", - "@setupOpenSettings": { - "description": "Button to open system settings" - }, - "libraryFilterSort": "정렬", - "cacheLibraryCoverDesc": "로컬 음악 파일에서 표지 이미지를 추출하였습니다. 다음 스캔 시 다시 추출합니다", - "dialogRemoveExtension": "확장 프로그램 제거", - "backupExportSectionTitle": "백업 생성", - "downloadEmbedLyricsDisabled": "먼저 메타데이터 삽입을 활성화하세요", - "openInOtherServices": "다른 서비스에서 열기", - "actionSelectAll": "모두 선택", - "settingsDownloadNetworkSubtitle": "다운로드에 사용할 네트워크를 선택하세요. Wi-Fi 전용으로 설정하면 모바일 데이터 사용 시 다운로드가 일시 중지됩니다", - "downloadFolderOrganization": "폴더 분류 형식", - "tutorialWelcomeTip2": "설치된 다운로드 확장 프로그램에서 FLAC 음질 오디오를 받으세요", - "@tutorialWelcomeTip2": { - "description": "Tutorial welcome tip 2" - }, - "selectionAllSelected": "모든 트랙 선택됨", - "@selectionAllSelected": { - "description": "Status - all items selected" - }, - "settingsLogsSubtitle": "디버깅을 위한 앱 로그 보기", - "albumFolderYearAlbumSubtitle": "앨범/[2005] 앨범 이름/", - "cancelDownloadKeep": "유지", - "optionsDetailedLoggingOn": "상세한 로그가 기록되고 있습니다", - "safMigrationMessage2": "새 저장소 시스템으로 전환하려면 다운로드 폴더를 다시 선택하세요", - "@storeChangeRepoTooltip": { - "description": "Tooltip for the change-repository icon button in the app bar" - }, - "regionCountryJP": "일본", - "notifUpdateFailed": "업데이트 실패", - "downloadCreatePlaylistSourceFolderRedundant": "폴더 구성 설정에 의해 처리됨", - "@trackLyricsSaved": { - "description": "Snackbar after lyrics saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "downloadLocationSubtitle": "다운로드한 트랙을 저장할 위치를 선택하세요", - "trackConvertActionLabelLossless": "{sourceFormat} → {targetFormat} ({quality})", - "lyricsProvidersDisabledSection": "비활성화됨 ({count})", - "@dateDaysAgo": { - "description": "Relative date - days ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "librarySourceLocal": "로컬", - "backupContentsExtensions": "{count, plural, =1{1 개의 확장 프로그램} other{{count} 개의 확장 프로그램}}", - "sectionService": "서비스", - "lyricsProviderQqMusicDesc": "QQ Music (중국 노래에 적합, 프록시 경유)", - "@lyricsProviderQqMusicDesc": { - "description": "Description for QQ Music provider" - }, - "cacheCleanupUnusedDesc": "누락된 파일에 대한 불필요한 다운로드 기록 및 라이브러리 항목을 제거합니다", - "selectionTapPlaylistsToSelect": "선택할 재생목록을 탭하세요", - "notifUpdateFailedBody": "업데이트를 다운로드할 수 없습니다. 나중에 다시 시도하세요", - "downloadNeteaseIncludeTranslationDisabled": "원본 가사만", - "artistPopular": "인기", - "extensionRemoveButton": "확장 프로그램 제거", - "allFilesAccessEnabledSubtitle": "모든 폴더에 쓰기 가능", - "@allFilesAccessEnabledSubtitle": { - "description": "Subtitle when all files access is enabled" - }, - "extensionsSearchProvider": "검색 제공자", - "tutorialWelcomeDesc": "좋아하는 음악을 무손실 음질로 다운로드하는 방법을 알아보겠습니다. 이 간단한 튜토리얼은 기본 사항을 보여줍니다", - "selectionBatchConvertConfirmTitle": "일괄 변환", - "extensionMetadataProvider": "메타데이터 제공자", - "queueDownloadedFileMissing": "다운로드한 파일이 없음", - "logClearLogs": "로그 삭제", - "@downloadAppleQqMultiPerson": { - "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" - }, - "tutorialWelcomeTip1": "Spotify, Deezer에서 음악을 다운로드하거나 지원되는 URL을 붙여넣으세요", - "@tutorialWelcomeTip1": { - "description": "Tutorial welcome tip 1" - }, - "logIssueRateLimitedSuggestion": "몇 분 기다린 후에 다시 시도하세요", - "downloadAllowLocalNetworkEnabled": "로컬/사설 주소에 대한 요청이 허용됨 (로컬 프록시 또는 사용자 지정 DNS용)", - "@regionCountryUS": { - "description": "Country name for SongLink region picker" - }, - "trackArtist": "아티스트", - "extensionCustomUrlHandling": "사용자 정의 URL 처리", - "appearanceDynamicColorSubtitle": "배경 화면을 참고하여 강조 색상이 지정됩니다", - "@appearanceDynamicColorSubtitle": { - "description": "Subtitle for dynamic color" - }, - "searchSortDefault": "기본값", - "@downloadFallbackExtensions": { - "description": "Settings item for configuring fallback extension providers" - }, - "albumFolderStructureDescription": "앨범 폴더 구조를 선택하세요", - "@albumFolderStructureDescription": { - "description": "Album folder structure picker description" - }, - "libraryBuiltInPreviewPlayerSubtitle": "SpotiFLAC Mobile에서 빠른 로컬 미리듣기 전용이며, 일반적인 음악 감상에는 권장되지 않습니다", - "@libraryBuiltInPreviewPlayerSubtitle": { - "description": "Subtitle for built-in preview player option" - }, - "storageModeAppFolder": "앱 폴더 (추천)", - "@actionPause": { - "description": "Action button - pause download" - }, - "actionPaste": "붙여넣기", - "extensionSettingsCount": "{count} 개의 {count, plural, =1{설정} other{설정}}", - "downloadNativeWorker": "기본 다운로드 워커", - "releaseTypeEp": "EP", - "@releaseTypeEp": { - "description": "Badge label for EP releases" - }, - "snackbarExtensionInstalledEnable": "''{extensionName}''이 설치됨. '설정 > 확장 프로그램'에서 활성화하세요", - "cacheRefreshStats": "통계 새로고침", - "collectionPlaylistChangeCover": "표지 이미지 변경", - "@collectionPlaylistChangeCover": { - "description": "Bottom sheet action to pick a custom cover image for a playlist" - }, - "optionsClearHistory": "다운로드 기록 삭제", - "trackGenre": "장르", - "snackbarSelectedPlaylistsEmpty": "선택한 재생목록에 트랙이 없습니다", - "collectionAddedTracksToPlaylist": "''{playlistName}''에 {count} 개의 {count, plural, =1{트랙} other{트랙}}이 추가됨", - "downloadNeteaseIncludeRomanization": "Netease: 로마자 표기 포함", - "libraryFilterMetadataMissingArtist": "아티스트 누락", - "extensionsNoCustomSearch": "사용자 정의 검색이 있는 확장 프로그램이 없음", - "@extensionsTitle": { - "description": "Extensions page title" - }, - "extensionDownloadProvider": "다운로드 제공자", - "@extensionDownloadProvider": { - "description": "Capability - provides downloads" - }, - "lyricsMode": "가사 설정", - "aboutReportIssueSubtitle": "발생하는 모든 문제를 신고해 주세요", - "@downloadSeparateSinglesFolder": { - "description": "Setting - separate folder for singles" - }, - "appearanceAmoledDark": "아몰레드 블랙", - "logIssueNetworkErrorDescription": "연결 문제가 감지됨", - "folderOrganizationByArtistAlbumSubtitle": "아티스트 및 앨범용 중첩 폴더", - "@libraryForceFullScanSubtitle": { - "description": "Subtitle for force full scan button" - }, - "setupGrantPermission": "권한을 부여해 주세요", - "lyricsProvidersDescription": "가사 출처를 활성화, 비활성화 및 재정렬합니다. 가사가 발견될 때까지 위에서 아래로 제공자를 시도합니다", - "dateDaysAgo": "{count} 일 전", - "extensionsHomeFeedDescription": "메인 화면에 홈 피드를 제공하는 확장 프로그램을 선택하세요", - "downloadLossyMp3Subtitle": "최상의 호환성, 트랙당 약 10MB", - "@downloadLossyMp3Subtitle": { - "description": "Subtitle for MP3 320kbps lossy option" - }, - "nowPlayingDetails": "자세히", - "collectionWishlistEmptyTitle": "위시리스트가 비어 있음", - "downloadAppleQqMultiPersonEnabled": "듀엣 및 그룹 트랙이 포함된 스피커 레이블", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "@snackbarExtensionUpdatedVersion": { - "description": "Snackbar after updating an extension from the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - }, - "version": { - "type": "String" - } - } - }, - "extensionHealthServiceDegraded": "서비스 저하됨", - "selectionConvertNoConvertible": "선택된 변환할 수 있는 트랙이 없음", - "setupStorageGranted": "저장소 접근 권한이 부여되었습니다!", - "downloadAllowLocalNetwork": "로컬 네트워크 접근 허용", - "nowPlayingNoLyrics": "이 파일에는 가사가 없음", - "selectionDeleteTracksCount": "{count} {count, plural, =1{트랙} other{트랙}} 삭제", - "@selectionDeleteTracksCount": { - "description": "Button label for deleting selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@libraryForceFullScan": { - "description": "Button to force a complete rescan of library" - }, - "notifLibraryScanExcluded": "{count} 개가 제외됨", - "@aboutPaxsenixSubtitle": { - "description": "Subtitle for Paxsenix special thanks entry on the about page" - }, - "setupChangeFolderTooltip": "폴더 변경", - "logIssueIspBlockingDescription": "ISP에서 다운로드 서비스 접속을 차단했을 수 있습니다", - "@logIssueIspBlockingDescription": { - "description": "Diagnostic badge description for ISP blocking" - }, - "libraryClear": "라이브러리 정리", - "collectionRemoveFromPlaylist": "재생목록에서 제거", - "@collectionRemoveFromPlaylist": { - "description": "Tooltip for removing track from playlist" - }, - "backupIncludeSecrets": "확장 프로그램 자격 증명 포함", - "notifDownloadsFinishedBody": "{completed, plural, =1{1 개의 트랙 다운로드 성공} other{{completed} 개의 트랙 다운로드 성공}}, {failed, plural, =1{1 개 실패} other{{failed} 개 실패}}", - "storeCategoryMetadata": "메타데이터", - "@trackLyricsEmbedded": { - "description": "Snackbar - lyrics saved to file" - }, - "editMetadataFieldDiscTotal": "전체 디스크 수", - "tutorialLibraryTip1": "라이브러리 탭에서 다운로드 진행 상황과 다운로드 목록을 확인하세요", - "playlistsCount": "{count, plural, =1{1 개의 재생목록} other{{count} 개의 재생목록}}", - "downloadCreatePlaylistSourceFolderDisabled": "모든 트랙을 다운로드 폴더에 직접 저장합니다", - "@downloadFallbackExtensionsSubtitle": { - "description": "Subtitle for fallback extensions item" - }, - "libraryFilterLocal": "로컬", - "tutorialDownloadInProgressSemantics": "다운로드를 진행하는 중", - "searchSortDurationLong": "재생시간 (긴순)", - "@appearanceLanguage": { - "description": "Language setting title" - }, - "libraryAbout": "로컬 저장소에 대한 정보", - "@libraryAbout": { - "description": "Section header for about info" - }, - "cueSplitNoAudioFile": "이 CUE 시트에 대한 오디오 파일을 찾을 수 없습니다", - "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} 다운로드 완료. 설치하려면 탭하세요", - "appearanceSelectAccentColor": "강조 색상 {hex} 선택", - "@homeAlbumInfoUnavailable": { - "description": "Snackbar when album info cannot be loaded" - }, - "trackReplayGain": "리플레이게인 다시 스캔", - "downloadSeparateSinglesFolder": "싱글 폴더 별도 다운로드", - "trackAlbumArtist": "앨범 아티스트", - "qualityFlacLossless": "FLAC 무손실", - "@extensionVerificationHelpMessageWaiting": { - "description": "Dialog message when verification may need manual browser help" - }, - "tutorialSettingsTitle": "사용자 환경 맞춤 설정", - "extensionActionFailed": "작업 실패", - "@storeEmptyNoResults": { - "description": "Message when search/filter returns no results" - }, - "downloadAppleQqMultiPerson": "Apple / QQ: 다인용 가사", - "downloadFallbackExtensionsSubtitle": "대체 확장 프로그램으로 사용할 확장 프로그램을 선택하세요", - "storeExtensionsCount": "{count} 개의 {count, plural, =1{확장 프로그램} other{확장 프로그램}}", - "trackCoverNoEmbeddedArt": "내장된 표지 이미지가 없음", - "@trackCoverNoEmbeddedArt": { - "description": "Message shown when a track file has no embedded cover art" - }, - "snackbarExtensionUpdatedVersion": "''{extensionName}''이 v{version}으로 업데이트됨", - "setupStorageAccessMessageAndroid11": "Android 11 이상 버전에서는 선택한 다운로드 폴더에 파일을 저장하려면 '모든 파일 접근' 권한이 필요합니다", - "notifDownloadsFinished": "다운로드 완료 ({completed} 개 완료, {failed} 개 실패)", - "notifLibraryScanProgressWithTotal": "{scanned}/{total} 개의 파일 • {percentage}%", - "optionsPrimaryProvider": "기본 제공자", - "@optionsPrimaryProvider": { - "description": "Main search provider setting" - }, - "logIssueTrackNotFoundSuggestion": "트랙이 무손실 음질로 제공되지 않을 수 있습니다", - "collectionAddedToLoved": "''{trackName}''이 '좋아요 표시한 트랙'에 추가됨", - "albumFolderArtistAlbumFlat": "아티스트 / 앨범 (싱글 플랫)", - "homeAlbumInfoUnavailable": "앨범 정보를 사용할 수 없음", - "settingsLyrics": "가사", - "extensionVerificationBrowserExternal": "외부", - "regionCountryIN": "인도", - "extensionHealthUnknown": "알 수 없음", - "backupContentsWishlist": "{count} 개의 위시리스트 {count, plural, =1{트랙} other{트랙}}", - "settingsAutoExportFailed": "실패한 다운로드 자동 내보내기", - "logFilterSection": "필터", - "dialogDiscardChanges": "변경 사항 폐기", - "@qualityHiResFlacSubtitle": { - "description": "Technical spec for hi-res" - }, - "searchTracks": "트랙", - "searchAlbums": "앨범", - "trackConvertFormat": "형식 변환", - "metadataProviderPriorityTitle": "메타데이터 우선순위", - "libraryFolderHint": "탭하여 폴더를 선택하세요", - "downloadedAlbumDeleteMessage": "앨범에서 {count} 개의 {count, plural, =1{트랙} other{트랙}}을 삭제하시겠습니까?\n\n저장소에서도 파일이 삭제됩니다", - "@downloadedAlbumDeleteMessage": { - "description": "Delete confirmation with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackAlbum": "앨범", - "updateAvailable": "업데이트 사용 가능", - "optionsEmbedLyrics": "가사 삽입", - "trackReEnrichProgress": "메타데이터를 다시 구성하는 중...", - "@trackReEnrichProgress": { - "description": "Snackbar while re-enriching metadata" - }, - "audioAnalysisPeak": "최대 피크", - "@audioAnalysisPeak": { - "description": "Peak amplitude metric label" - }, - "optionsExtensionStoreSubtitle": "하단바에서 리포 탭 표시", - "settingsTitle": "설정", - "@settingsAbout": { - "description": "Settings section - app info" - }, - "cacheExploreFeed": "탐색 피드 캐시", - "@dialogDownloadPlaylistsMessage": { - "description": "Dialog message for bulk playlist download confirmation", - "placeholders": { - "trackCount": { - "type": "int" - }, - "playlistCount": { - "type": "int" - } - } - }, - "downloadedAlbumSelectedCount": "{count} 개 선택됨", - "downloadAskQualitySubtitle": "다운로드를 할 때마다 음질을 선택하도록 합니다", - "filenameShowAdvancedTags": "고급 태그 표시", - "@filenameShowAdvancedTags": { - "description": "Toggle label for showing advanced filename tags" - }, - "@editMetadataFieldComment": { - "description": "Label for comment field in the edit metadata sheet" - }, - "downloadFallbackExtensions": "대체 확장 프로그램", - "downloadAlbumArtistMetadataFull": "앨범 아티스트 메타데이터: 전체", - "cacheLibraryCover": "라이브러리 표지 캐시", - "actionShuffle": "셔플", - "backupCreated": "백업 생성 완료", - "downloadLossyAacSubtitle": "최상의 모바일 호환성, M4A 컨테이너", - "actionCreate": "생성", - "snackbarAddedToQueueGeneric": "현재 다운로드 목록에 추가됨", - "downloadedAlbumDownloadedCount": "{count} 개 다운로드됨", - "snackbarLoadingCueSheet": "CUE 시트를 불러오는 중...", - "@trackCoverClearSelected": { - "description": "Tooltip for clearing the newly selected cover art" - }, - "aboutOriginalCreator": "SpotiFLAC 오리지널 개발자", - "a11yTrackByArtist": "''{artistName}''의 ''{trackName}''", - "audioAnalysisDynamicRange": "다이나믹 레인지", - "homeChangeSearchProviderTooltip": "검색 제공자 변경", - "loadingSharedLink": "공유된 링크를 불러오는 중...", - "lyricsModeEmbedSubtitle": "FLAC 메타데이터 내에 저장됩니다", - "setupNotificationBackgroundDescription": "알림으로 다운로드 진행 상황을 확인하세요. 앱이 백그라운드에서 실행 중일 때 다운로드 상태와 완료 여부를 확인할 수 있습니다", - "snackbarViewQueue": "다운로드 목록 보기", - "@audioAnalysisDuration": { - "description": "Duration metric label" - }, - "downloadSeparateSinglesDisabled": "싱글과 앨범을 같은 폴더에 저장합니다", - "backupRestored": "백업 복원 성공", - "trackConvertConfirmMessageLosslessCapped": "{sourceFormat}에서 {targetFormat}({quality})으로 변환하시겠습니까?\n\n출력은 무손실 코덱을 유지하지만 비트 심도/샘플 속도가 제한됩니다. 변환 후 원본 파일이 삭제됩니다", - "@trackConvertConfirmMessageLosslessCapped": { - "description": "Confirmation dialog message for capped lossless conversion of a single file", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "discographySelectAlbumsSubtitle": "특정 앨범 또는 싱글을 선택하세요", - "@discographySelectAlbumsSubtitle": { - "description": "Subtitle for select albums option" - }, - "backupImportSectionDescription": "데이터를 복원할 백업 파일을 선택하세요. 이 작업을 수행하면 현재 기기에 저장된 설정, 기록 및 라이브러리가 백업 파일의 내용으로 대체됩니다", - "errorUrlFetchFailed": "이 링크에서 콘텐츠를 불러오는 데 실패하였습니다. 다시 시도해 주세요", - "lyricsProviderLyricsPlusDesc": "단어별 노래방 가사 (Apple/Musixmatch/Spotify/QQ, 프록시 이용)", - "dialogSave": "저장", - "trackReEnrichSearching": "온라인에서 메타데이터를 검색하는 중...", - "regionCountryUS": "미국", - "audioAnalysisDescription": "스펙트럼 분석으로 무손실 음질을 확인합니다", - "downloadFilenameFormat": "파일 이름 형식", - "cueSplitTitle": "CUE 시트 분할", - "settingsAppSubtitle": "업데이트, 데이터, 확장프로그램 리포, 디버그", - "@settingsAppSubtitle": { - "description": "Subtitle for app settings" - }, - "@setupPermissionRequiredMessage": { - "description": "Generic permission required message", - "placeholders": { - "permissionType": { - "type": "String" - } - } - }, - "errorMissingExtensionSource": "''{item}''을 불러올 수 없음: 확장 소스가 누락됨", - "albumFolderAlbumOnlySubtitle": "앨범/앨범 이름/", - "logIssueTrackNotFoundLabel": "트랙을 찾을 수 없음", - "extensionVerificationHelpTitleManual": "수동으로 인증 열기", - "dialogDiscard": "폐기", - "storageModeSaf": "사용자 정의 폴더 (SAF)", - "errorRateLimited": "사용 제한됨", - "downloadSelectQuality": "음질 선택", - "dialogDownloadPlaylistsMessage": "{playlistCount} 개의 {playlistCount, plural, =1{재생목록} other{재생록록}}에서 {trackCount} 개의 {trackCount, plural, =1{트랙} other{트랙}}을 다운로드하시겠습니까?", - "collectionFoldersTitle": "내 폴더", - "progressFetchingMetadata": "메타데이터를 가져오는 중... {current}/{total}", - "settingsDownloadNetworkAny": "WiFi + 모바일 네트워크", - "audioAnalysisDuration": "재생시간", - "audioAnalysisAnalyzing": "오디오를 분석하는 중...", - "extensionVerificationHelpMessageWaiting": "브라우저가 열리지 않았거나 인증을 완료한 후에도 SpotiFLAC Mobile로 돌아오지 않았다면, 아래 링크를 다시 열거나 직접 복사하세요", - "editMetadataFieldDiscNum": "디스크 #", - "@editMetadataFieldDiscNum": { - "description": "Chip label for disc number field in auto-fill selector" - }, - "@noTracksFoundForAlbum": { - "description": "Empty state message when an album has no tracks" - }, - "previewPlay": "미리듣기 재생", - "setupPermissionRequiredMessage": "최상의 사용 경험을 위해 ''{permissionType}'' 권한이 필요합니다. 설정에서 나중에 변경할 수 있습니다", - "aboutVersion": "버전", - "qualityHiResFlacSubtitle": "24-bit / 최대 96kHz", - "audioAnalysisSamples": "샘플", - "libraryFilterQualityHiRes": "Hi-Res (24bit)", - "sectionMetadataProviders": "제공자", - "@sectionMetadataProviders": { - "description": "Settings section header for metadata providers" - }, - "trackCopyright": "저작권", - "libraryForceFullScanSubtitle": "캐시를 무시하고 모든 파일을 다시 스캔합니다", - "trackCopiedToClipboard": "클립보드에 복사됨", - "optionsEmbedMetadata": "메타데이터 삽입", - "collectionAddedTracksToPlaylistWithExisting": "''{playlistName}''에 {count} 개의 {count, plural, =1{트랙} other{트랙}}이 추가됨 ({alreadyCount} 개의 트랙은 이미 재생목록에 있음)", - "@collectionAddedTracksToPlaylistWithExisting": { - "description": "Snackbar after adding multiple tracks to a playlist when some were already present", - "placeholders": { - "count": { - "type": "int" - }, - "playlistName": { - "type": "String" - }, - "alreadyCount": { - "type": "int" - } - } - }, - "storeCategoryIntegration": "연동", - "storeClearFilters": "필터 지우기", - "navSettings": "설정", - "@homeRecent": { - "description": "Section header for recent searches" - }, - "sectionApp": "앱", - "@sectionLanguage": { - "description": "Settings section header for language" - }, - "downloadFilterContributingDisabled": "전체 앨범 아티스트 문자열 사용", - "albumFolderArtistAlbumSinglesSubtitle": "아티스트/앨범/ 및 아티스트/싱글/", - "collectionDeletePlaylistsMessage": "{count} 개의 {count, plural, =1{재생목록} other{재생목록}}을 삭제하시겠습니까?", - "lyricsProvidersSaved": "가사 제공자 우선순위가 저장됨", - "@trackReplayGainFailed": { - "description": "Snackbar message when ReplayGain scan/write fails" - }, - "trackTrackName": "트랙 이름", - "homeRecent": "최근 기록", - "recentEmpty": "최근 항목이 없음", - "cacheClearAll": "모든 캐시 지우기", - "trackReEnrichFieldReleaseInfo": "데이터 & ISRC", - "regionCountryMX": "멕시코", - "a11yOpenAlbumByArtistTrackCount": "''{artistName}''의 앨범 ''{albumName}'' 열기 ({trackCount} 번째 곡)", - "editMetadataFieldAlbum": "앨범", - "settingsAbout": "정보", - "libraryFilterTitle": "필터", - "cleanupOrphanedDownloadsResult": "기록에서 {count} 개의 불필요한 항목이 제거됨", - "extensionHooksAvailable": "{count} 개의 후크 사용 가능", - "backupContentsSettings": "앱 설정", - "trackLyricsEmbedded": "가사 삽입 성공", - "optionsUpdateChannelPreview": "베타 버전을 받기", - "collectionAddedToFavoriteArtists": "''{artistName}''가 좋아하는 아티스트에 추가됨", - "libraryForceFullScan": "전제 스캔 강제 실행", - "snackbarProviderPrioritySaved": "제공자 우선순위가 저장됨", - "collectionFavoriteArtistsEmptySubtitle": "아티스트 페이지에서 하트를 탭하여 여기에 추가하세요", - "libraryBuiltInPlayerInfo": "내장 플레이어는 로컬 트랙을 빠르게 미리듣기 위한 도구입니다. 실제 음악 감상은 외부 음악 플레이어를 이용하는 것을 권장합니다", - "extensionServiceStatus": "서비스 상태", - "dateWeeksAgo": "{count} 주 전", - "historyFilterSingles": "싱글", - "tutorialSettingsTip2": "기본 오디오 음질 및 형식 설정", - "trackLyricsSaved": "가사가 ''{fileName}''에 저장됨", - "cacheClearAllConfirmTitle": "모든 캐시를 지우시겠습니까?", - "noTracksFoundForAlbum": "이 앨범에서 트랙을 찾을 수 없음", - "sectionLanguage": "언어", - "@logIssueTrackNotFoundDescription": { - "description": "Diagnostic badge description when a track is unavailable" - }, - "setupSelectFolder": "폴더 선택", - "dateYesterday": "어제", - "collectionAddToPlaylist": "재생목록에 추가", - "snackbarUnsupportedAudioFormat": "지원되지 않는 오디오 형식", - "libraryScanCancelled": "스캔이 취소됨", - "appearanceLanguage": "앱 언어", - "extensionsTitle": "확장 프로그램", - "dialogImportPlaylistMessage": "CSV 파일에서 {count} 개의 트랙을 찾았습니다. 다운로드 목록에 추가하시겠습니까?", - "permissionNotification": "알림", - "notifUpdateReady": "업데이트 준비 완료", - "lyricsModeDescription": "다운로드한 파일에 가사를 저장하는 방법을 선택하세요", - "downloadFrom": "다운로드 출처", - "collectionWishlistEmptySubtitle": "나중에 다운로드할 트랙을 저장하려면 트랙에서 +를 탭하세요", - "cueSplitSplitting": "CUE 시트를 분할하는 중... ({current}/{total})", - "optionsMaxQualityCover": "고품질 표지 이미지", - "trackOptionAddToWishlist": "위시리스트에 추가", - "settingsBackup": "백업 & 복원", - "aboutPaxsenixSubtitle": "Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou 및 Genius용 가사 프록시", - "notifDownloadCompleteCount": "다운로드 완료 ({completed}/{total})", - "extensionsNoDownloadProvider": "다운로드 제공자가 있는 확장 프로그램가 없음", - "libraryFilterSortGenreAsc": "장르 (오름차순)", - "trackReplayGainFailed": "리플레이게인 태그 추가 실패", - "collectionPlaylistRemoveCover": "표지 이미지 제거", - "storeEmptyNoResults": "확장 프로그램을 찾을 수 없음", - "logIssueTrackNotFoundDescription": "일부 트랙은 다운로드 서비스에서 찾을 수 없습니다", - "editMetadataFieldComment": "주석", - "settingsMetadata": "메타데이터", - "settingsCache": "저장소 & 캐시", - "providerPriorityFallbackExtensionsHint": "다운로드 공급자 기능이 활성화된 확장 프로그램만 여기에 나열됩니다", - "libraryFilterAll": "모두", - "notifDownloadingUpdate": "SpotiFLAC Mobile v{version}을 다운로드하는 중", - "extensionsProviderPrioritySection": "제공자 우선순위", - "storeChangeRepoTooltip": "리포지토리 변경", - "snackbarFailedToInstall": "확장 프로그램 설치 실패", - "libraryScanSubtitle": "오디오 파일 스캔", - "snackbarExtensionInstalled": "''{extensionName}''이 설치됨", - "setupOpenSettings": "설정 열기", - "extensionsInstalledSection": "설치된 확장 프로그램", - "aboutLinks": "링크", - "trackCoverClearSelected": "선택된 표지 지우기", - "libraryAutoScanWeekly": "주간", - "downloadMusixmatchLanguageAuto": "자동 (원본 언어)", - "optionsDefaultSearchTab": "기본 검색 탭", - "downloadPrimaryArtistOnlyOn": "기본 아티스트만: ON", - "folderOrganizationDescription": "다운로드한 파일을 폴더로 정리", - "@folderOrganizationDescription": { - "description": "Folder organization sheet description" - }, - "lyricsModeEmbed": "파일에 포함", - "trackReEnrichFfmpegFailed": "FFmpeg 메타데이터 삽입 실패", - "@extensionsSearchProviderDescription": { - "description": "Search provider setting description" - }, - "libraryFilterQualityLossy": "손실 압축", - "actionPause": "일시 중지", - "csvImportTracks": "CSV 파일의 트랙: {count}", - "actionGo": "이동", - "sectionDebug": "디버그", - "editMetadataFieldDate": "날짜", - "timeHoursAgo": "{count, plural, =1{1 시간 전} other{{count} 시간 전}}", - "sectionPerformance": "성능", - "extensionsDownloadPrioritySubtitle": "다운로드 서비스 순서를 설정하세요", - "cacheAppDirectoryDesc": "HTTP 응답, WebView 데이터 및 기타 임시 앱 데이터", - "sectionData": "데이터", - "notifFinalizingTrack": "''{trackName}''를 마무리하는 중", - "snackbarFileNotFound": "파일을 찾을 수 없음", - "extensionQualityOptions": "음질 옵션", - "extensionVerificationBrowserSubtitleExternal": "인증을 기본 브라우저에서 먼저 실행합니다", - "backupInvalidFile": "이 파일은 유효한 SpotiFLAC 백업이 아닙니다", - "storeRepoDialogTitle": "확장 프로그램 리포지토리", - "extensionsSearchProviderDescription": "트랙 검색에 사용할 서비스를 선택하세요", - "albumFolderAlbumOnly": "앨범만", - "nowPlayingOpenInExternalPlayer": "외부 플레이어에서 열기", - "cueSplitButton": "트랙으로 분할" -} diff --git a/lib/l10n/arb/app_nl.arb b/lib/l10n/arb/app_nl.arb deleted file mode 100644 index c9ce95a9..00000000 --- a/lib/l10n/arb/app_nl.arb +++ /dev/null @@ -1,5887 +0,0 @@ -{ - "@@locale": "nl", - "@@last_modified": "2026-04-28", - "appName": "SpotiFLAC Mobile", - "@appName": { - "description": "App name - DO NOT TRANSLATE" - }, - "navHome": "Home", - "@navHome": { - "description": "Bottom navigation - Home tab" - }, - "navLibrary": "Library", - "@navLibrary": { - "description": "Bottom navigation - Library tab" - }, - "navSettings": "Settings", - "@navSettings": { - "description": "Bottom navigation - Settings tab" - }, - "navStore": "Repo", - "@navStore": { - "description": "Bottom navigation - Extension store tab" - }, - "homeTitle": "Home", - "@homeTitle": { - "description": "Home screen title" - }, - "homeSubtitle": "Paste a supported URL or search by name", - "@homeSubtitle": { - "description": "Subtitle shown below search box" - }, - "homeEmptyTitle": "No search providers yet", - "@homeEmptyTitle": { - "description": "Title shown on home when no providers are available yet" - }, - "homeEmptySubtitle": "Install an extension to continue.", - "@homeEmptySubtitle": { - "description": "Subtitle shown on home when no providers are available yet" - }, - "homeSupports": "Supports: Track, Album, Playlist, Artist URLs", - "@homeSupports": { - "description": "Info text about supported URL types" - }, - "homeRecent": "Recent", - "@homeRecent": { - "description": "Section header for recent searches" - }, - "historyFilterAll": "All", - "@historyFilterAll": { - "description": "Filter chip - show all items" - }, - "historyFilterAlbums": "Albums", - "@historyFilterAlbums": { - "description": "Filter chip - show albums only" - }, - "historyFilterSingles": "Singles", - "@historyFilterSingles": { - "description": "Filter chip - show singles only" - }, - "historySearchHint": "Search history...", - "@historySearchHint": { - "description": "Search bar placeholder in history" - }, - "settingsTitle": "Settings", - "@settingsTitle": { - "description": "Settings screen title" - }, - "settingsDownload": "Download", - "@settingsDownload": { - "description": "Settings section - download options" - }, - "settingsAppearance": "Appearance", - "@settingsAppearance": { - "description": "Settings section - visual customization" - }, - "settingsExtensions": "Extensions", - "@settingsExtensions": { - "description": "Settings section - extension management" - }, - "settingsAbout": "About", - "@settingsAbout": { - "description": "Settings section - app info" - }, - "downloadTitle": "Download", - "@downloadTitle": { - "description": "Download settings page title" - }, - "downloadAskQualitySubtitle": "Show quality picker for each download", - "@downloadAskQualitySubtitle": { - "description": "Subtitle for ask quality toggle" - }, - "downloadFilenameFormat": "Filename Format", - "@downloadFilenameFormat": { - "description": "Setting for output filename pattern" - }, - "downloadSingleFilenameFormat": "Single Filename Format", - "@downloadSingleFilenameFormat": { - "description": "Setting for output filename pattern for singles/EPs" - }, - "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", - "@downloadSingleFilenameFormatDescription": { - "description": "Subtitle description for single filename format setting" - }, - "downloadFolderOrganization": "Folder Organization", - "@downloadFolderOrganization": { - "description": "Title of the folder organization picker bottom sheet" - }, - "appearanceTitle": "Appearance", - "@appearanceTitle": { - "description": "Appearance settings page title" - }, - "appearanceThemeSystem": "System", - "@appearanceThemeSystem": { - "description": "Follow system theme" - }, - "appearanceThemeLight": "Light", - "@appearanceThemeLight": { - "description": "Light theme" - }, - "appearanceThemeDark": "Dark", - "@appearanceThemeDark": { - "description": "Dark theme" - }, - "appearanceDynamicColor": "Dynamic Color", - "@appearanceDynamicColor": { - "description": "Material You dynamic colors" - }, - "appearanceDynamicColorSubtitle": "Use colors from your wallpaper", - "@appearanceDynamicColorSubtitle": { - "description": "Subtitle for dynamic color" - }, - "appearanceHistoryView": "History View", - "@appearanceHistoryView": { - "description": "Layout style for history" - }, - "appearanceHistoryViewList": "List", - "@appearanceHistoryViewList": { - "description": "List layout option" - }, - "appearanceHistoryViewGrid": "Grid", - "@appearanceHistoryViewGrid": { - "description": "Grid layout option" - }, - "optionsPrimaryProvider": "Primary Provider", - "@optionsPrimaryProvider": { - "description": "Main search provider setting" - }, - "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", - "@optionsPrimaryProviderSubtitle": { - "description": "Subtitle for primary provider" - }, - "optionsUsingExtension": "Using extension: {extensionName}", - "@optionsUsingExtension": { - "description": "Shows active extension name", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "optionsDefaultSearchTab": "Default Search Tab", - "@optionsDefaultSearchTab": { - "description": "Title for the preferred default search tab setting" - }, - "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", - "@optionsDefaultSearchTabSubtitle": { - "description": "Subtitle for the preferred default search tab setting" - }, - "optionsAutoFallback": "Auto Fallback", - "@optionsAutoFallback": { - "description": "Auto-retry with other services" - }, - "optionsAutoFallbackSubtitle": "Try other services if download fails", - "@optionsAutoFallbackSubtitle": { - "description": "Subtitle for auto fallback" - }, - "optionsEmbedLyrics": "Embed Lyrics", - "@optionsEmbedLyrics": { - "description": "Embed lyrics in audio files" - }, - "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", - "@optionsEmbedLyricsSubtitle": { - "description": "Subtitle for embed lyrics" - }, - "optionsMaxQualityCover": "Max Quality Cover", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "Download highest resolution cover art", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, - "optionsReplayGain": "ReplayGain", - "@optionsReplayGain": { - "description": "Title for ReplayGain setting toggle" - }, - "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", - "@optionsReplayGainSubtitleOn": { - "description": "Subtitle when ReplayGain is enabled" - }, - "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", - "@optionsReplayGainSubtitleOff": { - "description": "Subtitle when ReplayGain is disabled" - }, - "trackReplayGain": "Rescan ReplayGain", - "@trackReplayGain": { - "description": "Three-dot menu option to scan loudness and write ReplayGain tags" - }, - "trackReplayGainScanning": "Analyzing loudness...", - "@trackReplayGainScanning": { - "description": "Snackbar/progress message while scanning ReplayGain for a single track" - }, - "trackReplayGainSuccess": "ReplayGain tags added", - "@trackReplayGainSuccess": { - "description": "Snackbar message after ReplayGain tags written for a single track" - }, - "trackReplayGainFailed": "Failed to add ReplayGain tags", - "@trackReplayGainFailed": { - "description": "Snackbar message when ReplayGain scan/write fails" - }, - "selectionReplayGainCount": "ReplayGain ({count})", - "@selectionReplayGainCount": { - "description": "Batch selection action button label for ReplayGain", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "replayGainBatchConfirmTitle": "Add ReplayGain", - "@replayGainBatchConfirmTitle": { - "description": "Title of the batch ReplayGain confirmation dialog" - }, - "replayGainBatchConfirmMessage": "Analyze loudness and write ReplayGain tags to {count} track(s)?", - "@replayGainBatchConfirmMessage": { - "description": "Message of the batch ReplayGain confirmation dialog", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "replayGainBatchAnalyzing": "Analyzing ReplayGain...", - "@replayGainBatchAnalyzing": { - "description": "Progress dialog title while batch scanning ReplayGain" - }, - "replayGainBatchSuccess": "ReplayGain added to {success} of {total} tracks", - "@replayGainBatchSuccess": { - "description": "Snackbar after batch ReplayGain completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "optionsArtistTagMode": "Artist Tag Mode", - "@optionsArtistTagMode": { - "description": "Setting title for how artist metadata is written into files" - }, - "optionsArtistTagModeDescription": "Choose how multiple artists are written into embedded tags.", - "@optionsArtistTagModeDescription": { - "description": "Bottom-sheet description for artist tag mode setting" - }, - "optionsArtistTagModeJoined": "Single joined value", - "@optionsArtistTagModeJoined": { - "description": "Artist tag mode option that joins multiple artists into one value" - }, - "optionsArtistTagModeJoinedSubtitle": "Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.", - "@optionsArtistTagModeJoinedSubtitle": { - "description": "Subtitle for joined artist tag mode" - }, - "optionsArtistTagModeSplitVorbis": "Split tags for FLAC/Opus", - "@optionsArtistTagModeSplitVorbis": { - "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" - }, - "optionsArtistTagModeSplitVorbisSubtitle": "Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.", - "@optionsArtistTagModeSplitVorbisSubtitle": { - "description": "Subtitle for split Vorbis artist tag mode" - }, - "optionsExtensionStore": "Extension Repo", - "@optionsExtensionStore": { - "description": "Show/hide store tab" - }, - "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", - "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" - }, - "optionsCheckUpdates": "Check for Updates", - "@optionsCheckUpdates": { - "description": "Auto update check toggle" - }, - "optionsCheckUpdatesSubtitle": "Notify when new version is available", - "@optionsCheckUpdatesSubtitle": { - "description": "Subtitle for update check" - }, - "optionsUpdateChannel": "Update Channel", - "@optionsUpdateChannel": { - "description": "Stable vs preview releases" - }, - "optionsUpdateChannelStable": "Stable releases only", - "@optionsUpdateChannelStable": { - "description": "Only stable updates" - }, - "optionsUpdateChannelPreview": "Get preview releases", - "@optionsUpdateChannelPreview": { - "description": "Include beta/preview updates" - }, - "optionsUpdateChannelWarning": "Preview may contain bugs or incomplete features", - "@optionsUpdateChannelWarning": { - "description": "Warning about preview channel" - }, - "optionsClearHistory": "Clear Download History", - "@optionsClearHistory": { - "description": "Delete all download history" - }, - "optionsClearHistorySubtitle": "Remove all downloaded tracks from history", - "@optionsClearHistorySubtitle": { - "description": "Subtitle for clear history" - }, - "optionsDetailedLogging": "Detailed Logging", - "@optionsDetailedLogging": { - "description": "Enable verbose logs for debugging" - }, - "optionsDetailedLoggingOn": "Detailed logs are being recorded", - "@optionsDetailedLoggingOn": { - "description": "Status when logging enabled" - }, - "optionsDetailedLoggingOff": "Enable for bug reports", - "@optionsDetailedLoggingOff": { - "description": "Status when logging disabled" - }, - "extensionsTitle": "Extensions", - "@extensionsTitle": { - "description": "Extensions page title" - }, - "extensionsDisabled": "Disabled", - "@extensionsDisabled": { - "description": "Extension status - inactive" - }, - "extensionsVersion": "Version {version}", - "@extensionsVersion": { - "description": "Extension version display", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "extensionsUninstall": "Uninstall", - "@extensionsUninstall": { - "description": "Uninstall extension button" - }, - "storeTitle": "Extension Repo", - "@storeTitle": { - "description": "Store screen title" - }, - "storeSearch": "Search extensions...", - "@storeSearch": { - "description": "Store search placeholder" - }, - "storeInstall": "Install", - "@storeInstall": { - "description": "Install extension button" - }, - "storeInstalled": "Installed", - "@storeInstalled": { - "description": "Already installed badge" - }, - "storeUpdate": "Update", - "@storeUpdate": { - "description": "Update available button" - }, - "aboutTitle": "About", - "@aboutTitle": { - "description": "About page title" - }, - "aboutContributors": "Contributors", - "@aboutContributors": { - "description": "Section for contributors" - }, - "aboutMobileDeveloper": "Mobile version developer", - "@aboutMobileDeveloper": { - "description": "Role description for mobile dev" - }, - "aboutOriginalCreator": "Creator of the original SpotiFLAC", - "@aboutOriginalCreator": { - "description": "Role description for original creator" - }, - "aboutLogoArtist": "The talented artist who created our beautiful app logo!", - "@aboutLogoArtist": { - "description": "Role description for logo artist" - }, - "aboutTranslators": "Translators", - "@aboutTranslators": { - "description": "Section for translators" - }, - "aboutSpecialThanks": "Special Thanks", - "@aboutSpecialThanks": { - "description": "Section for special thanks" - }, - "aboutLinks": "Links", - "@aboutLinks": { - "description": "Section for external links" - }, - "aboutMobileSource": "Mobile source code", - "@aboutMobileSource": { - "description": "Link to mobile GitHub repo" - }, - "aboutPCSource": "PC source code", - "@aboutPCSource": { - "description": "Link to PC GitHub repo" - }, - "aboutKeepAndroidOpen": "Keep Android Open", - "@aboutKeepAndroidOpen": { - "description": "Link to Keep Android Open campaign website" - }, - "aboutReportIssue": "Report an issue", - "@aboutReportIssue": { - "description": "Link to report bugs" - }, - "aboutReportIssueSubtitle": "Report any problems you encounter", - "@aboutReportIssueSubtitle": { - "description": "Subtitle for report issue" - }, - "aboutFeatureRequest": "Feature request", - "@aboutFeatureRequest": { - "description": "Link to suggest features" - }, - "aboutFeatureRequestSubtitle": "Suggest new features for the app", - "@aboutFeatureRequestSubtitle": { - "description": "Subtitle for feature request" - }, - "aboutTelegramChannel": "Telegram Channel", - "@aboutTelegramChannel": { - "description": "Link to Telegram channel" - }, - "aboutTelegramChannelSubtitle": "Announcements and updates", - "@aboutTelegramChannelSubtitle": { - "description": "Subtitle for Telegram channel" - }, - "aboutTelegramChat": "Telegram Community", - "@aboutTelegramChat": { - "description": "Link to Telegram chat group" - }, - "aboutTelegramChatSubtitle": "Chat with other users", - "@aboutTelegramChatSubtitle": { - "description": "Subtitle for Telegram chat" - }, - "aboutSocial": "Social", - "@aboutSocial": { - "description": "Section for social links" - }, - "aboutApp": "App", - "@aboutApp": { - "description": "Section for app info" - }, - "aboutVersion": "Version", - "@aboutVersion": { - "description": "Version info label" - }, - "aboutBinimumDesc": "The creator of QQDL & HiFi API. This project helped shape lossless download support.", - "@aboutBinimumDesc": { - "description": "Credit description for binimum" - }, - "aboutSachinsenalDesc": "The original HiFi project creator. A foundation for lossless-source integration.", - "@aboutSachinsenalDesc": { - "description": "Credit description for sachinsenal0x64" - }, - "aboutSjdonadoDesc": "Creator of I Don't Have Spotify (IDHS). The fallback link resolver that saves the day!", - "@aboutSjdonadoDesc": { - "description": "Credit description for sjdonado" - }, - "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", - "@aboutAppDescription": { - "description": "App description in header card" - }, - "artistAlbums": "Albums", - "@artistAlbums": { - "description": "Section header for artist albums" - }, - "artistSingles": "Singles & EPs", - "@artistSingles": { - "description": "Section header for singles/EPs" - }, - "artistCompilations": "Compilations", - "@artistCompilations": { - "description": "Section header for compilations" - }, - "artistPopular": "Popular", - "@artistPopular": { - "description": "Section header for popular/top tracks" - }, - "artistMonthlyListeners": "{count} monthly listeners", - "@artistMonthlyListeners": { - "description": "Monthly listener count display", - "placeholders": { - "count": { - "type": "String", - "description": "Formatted listener count" - } - } - }, - "trackMetadataService": "Service", - "@trackMetadataService": { - "description": "Metadata field - download service used" - }, - "trackMetadataPlay": "Play", - "@trackMetadataPlay": { - "description": "Action button - play track" - }, - "trackMetadataShare": "Share", - "@trackMetadataShare": { - "description": "Action button - share track" - }, - "trackMetadataDelete": "Delete", - "@trackMetadataDelete": { - "description": "Action button - delete track" - }, - "setupGrantPermission": "Grant Permission", - "@setupGrantPermission": { - "description": "Button to request permission" - }, - "setupSkip": "Skip for now", - "@setupSkip": { - "description": "Skip current step button" - }, - "setupStorageAccessRequired": "Storage Access Required", - "@setupStorageAccessRequired": { - "description": "Title when storage access needed" - }, - "setupStorageAccessMessageAndroid11": "Android 11+ requires \"All files access\" permission to save files to your chosen download folder.", - "@setupStorageAccessMessageAndroid11": { - "description": "Android 11+ specific explanation" - }, - "setupOpenSettings": "Open Settings", - "@setupOpenSettings": { - "description": "Button to open system settings" - }, - "setupPermissionDeniedMessage": "Permission denied. Please grant all permissions to continue.", - "@setupPermissionDeniedMessage": { - "description": "Error when permission denied" - }, - "setupPermissionRequired": "{permissionType} Permission Required", - "@setupPermissionRequired": { - "description": "Generic permission required title", - "placeholders": { - "permissionType": { - "type": "String", - "description": "Type of permission (Storage/Notification)" - } - } - }, - "setupPermissionRequiredMessage": "{permissionType} permission is required for the best experience. You can change this later in Settings.", - "@setupPermissionRequiredMessage": { - "description": "Generic permission required message", - "placeholders": { - "permissionType": { - "type": "String" - } - } - }, - "setupUseDefaultFolder": "Use Default Folder?", - "@setupUseDefaultFolder": { - "description": "Dialog title for default folder" - }, - "setupNoFolderSelected": "No folder selected. Would you like to use the default Music folder?", - "@setupNoFolderSelected": { - "description": "Prompt when no folder selected" - }, - "setupUseDefault": "Use Default", - "@setupUseDefault": { - "description": "Button to use default folder" - }, - "setupDownloadLocationTitle": "Download Location", - "@setupDownloadLocationTitle": { - "description": "Download location dialog title" - }, - "setupDownloadLocationIosMessage": "On iOS, downloads are saved to the app's Documents folder. You can access them via the Files app.", - "@setupDownloadLocationIosMessage": { - "description": "iOS-specific folder info" - }, - "setupAppDocumentsFolder": "App Documents Folder", - "@setupAppDocumentsFolder": { - "description": "iOS documents folder option" - }, - "setupAppDocumentsFolderSubtitle": "Recommended - accessible via Files app", - "@setupAppDocumentsFolderSubtitle": { - "description": "Subtitle for documents folder" - }, - "setupChooseFromFiles": "Choose from Files", - "@setupChooseFromFiles": { - "description": "iOS file picker option" - }, - "setupChooseFromFilesSubtitle": "Select iCloud or other location", - "@setupChooseFromFilesSubtitle": { - "description": "Subtitle for file picker" - }, - "setupIosEmptyFolderWarning": "iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.", - "@setupIosEmptyFolderWarning": { - "description": "iOS folder selection warning" - }, - "setupIcloudNotSupported": "iCloud Drive is not supported. Please use the app Documents folder.", - "@setupIcloudNotSupported": { - "description": "Error when user selects iCloud Drive on iOS" - }, - "setupDownloadInFlac": "Download Spotify tracks in FLAC", - "@setupDownloadInFlac": { - "description": "App tagline in setup" - }, - "setupStorageGranted": "Storage Permission Granted!", - "@setupStorageGranted": { - "description": "Success message for storage permission" - }, - "setupStorageRequired": "Storage Permission Required", - "@setupStorageRequired": { - "description": "Title when storage permission needed" - }, - "setupStorageDescription": "SpotiFLAC needs storage permission to save your downloaded music files.", - "@setupStorageDescription": { - "description": "Explanation for storage permission" - }, - "setupNotificationGranted": "Notification Permission Granted!", - "@setupNotificationGranted": { - "description": "Success message for notification permission" - }, - "setupNotificationEnable": "Enable Notifications", - "@setupNotificationEnable": { - "description": "Button to enable notifications" - }, - "setupFolderChoose": "Choose Download Folder", - "@setupFolderChoose": { - "description": "Button to choose folder" - }, - "setupFolderDescription": "Select a folder where your downloaded music will be saved.", - "@setupFolderDescription": { - "description": "Explanation for folder selection" - }, - "setupSelectFolder": "Select Folder", - "@setupSelectFolder": { - "description": "Button to select folder" - }, - "setupEnableNotifications": "Enable Notifications", - "@setupEnableNotifications": { - "description": "Button to enable notifications" - }, - "setupNotificationBackgroundDescription": "Get notified about download progress and completion. This helps you track downloads when the app is in background.", - "@setupNotificationBackgroundDescription": { - "description": "Detailed notification explanation" - }, - "setupSkipForNow": "Skip for now", - "@setupSkipForNow": { - "description": "Skip button text" - }, - "setupNext": "Next", - "@setupNext": { - "description": "Next button text" - }, - "setupGetStarted": "Get Started", - "@setupGetStarted": { - "description": "Final setup button" - }, - "setupAllowAccessToManageFiles": "Please enable \"Allow access to manage all files\" in the next screen.", - "@setupAllowAccessToManageFiles": { - "description": "Instruction for file access permission" - }, - "setupLanguageTitle": "Choose Language", - "@setupLanguageTitle": { - "description": "Title for the language selection step in setup" - }, - "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", - "@setupLanguageDescription": { - "description": "Description for the language selection step in setup" - }, - "setupLanguageSystemDefault": "System Default", - "@setupLanguageSystemDefault": { - "description": "Option to use the system language" - }, - "dialogCancel": "Cancel", - "@dialogCancel": { - "description": "Dialog button - cancel action" - }, - "dialogSave": "Save", - "@dialogSave": { - "description": "Dialog button - save changes" - }, - "dialogDelete": "Delete", - "@dialogDelete": { - "description": "Dialog button - delete item" - }, - "dialogRetry": "Retry", - "@dialogRetry": { - "description": "Dialog button - retry action" - }, - "dialogClear": "Clear", - "@dialogClear": { - "description": "Dialog button - clear items" - }, - "dialogDone": "Done", - "@dialogDone": { - "description": "Dialog button - action completed" - }, - "dialogImport": "Import", - "@dialogImport": { - "description": "Dialog button - import data" - }, - "dialogDownload": "Download", - "@dialogDownload": { - "description": "Confirm button in Download All dialog" - }, - "previewPlay": "Play preview", - "@previewPlay": { - "description": "Tooltip for the button that plays a short track preview snippet" - }, - "previewStop": "Stop preview", - "@previewStop": { - "description": "Tooltip for the button that stops the playing track preview snippet" - }, - "previewUnavailable": "Preview unavailable", - "@previewUnavailable": { - "description": "Snackbar shown when a track preview snippet cannot be played" - }, - "dialogDiscard": "Discard", - "@dialogDiscard": { - "description": "Dialog button - discard changes" - }, - "dialogRemove": "Remove", - "@dialogRemove": { - "description": "Dialog button - remove item" - }, - "dialogUninstall": "Uninstall", - "@dialogUninstall": { - "description": "Dialog button - uninstall extension" - }, - "dialogDiscardChanges": "Discard Changes?", - "@dialogDiscardChanges": { - "description": "Dialog title - unsaved changes warning" - }, - "dialogUnsavedChanges": "You have unsaved changes. Do you want to discard them?", - "@dialogUnsavedChanges": { - "description": "Dialog message - unsaved changes" - }, - "dialogClearAll": "Clear All", - "@dialogClearAll": { - "description": "Dialog title - clear all items" - }, - "dialogRemoveExtension": "Remove Extension", - "@dialogRemoveExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogRemoveExtensionMessage": "Are you sure you want to remove this extension? This cannot be undone.", - "@dialogRemoveExtensionMessage": { - "description": "Dialog message - uninstall confirmation" - }, - "dialogUninstallExtension": "Uninstall Extension?", - "@dialogUninstallExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogUninstallExtensionMessage": "Are you sure you want to remove {extensionName}?", - "@dialogUninstallExtensionMessage": { - "description": "Dialog message - uninstall specific extension", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "dialogClearHistoryTitle": "Clear History", - "@dialogClearHistoryTitle": { - "description": "Dialog title - clear download history" - }, - "dialogClearHistoryMessage": "Are you sure you want to clear all download history? This cannot be undone.", - "@dialogClearHistoryMessage": { - "description": "Dialog message - clear history confirmation" - }, - "dialogDeleteSelectedTitle": "Delete Selected", - "@dialogDeleteSelectedTitle": { - "description": "Dialog title - delete selected items" - }, - "dialogDeleteSelectedMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from history?\n\nThis will also delete the files from storage.", - "@dialogDeleteSelectedMessage": { - "description": "Dialog message - delete selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogImportPlaylistTitle": "Import Playlist", - "@dialogImportPlaylistTitle": { - "description": "Dialog title - import CSV playlist" - }, - "dialogImportPlaylistMessage": "Found {count} tracks in CSV. Add them to download queue?", - "csvImportTracks": "{count} tracks from CSV", - "@csvImportTracks": { - "description": "Label shown in quality picker for CSV import", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@dialogImportPlaylistMessage": { - "description": "Dialog message - import playlist confirmation", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedToQueue": "Added \"{trackName}\" to queue", - "@snackbarAddedToQueue": { - "description": "Snackbar - track added to download queue", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAddedTracksToQueue": "Added {count} tracks to queue", - "@snackbarAddedTracksToQueue": { - "description": "Snackbar - multiple tracks added to queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAlreadyDownloaded": "\"{trackName}\" already downloaded", - "@snackbarAlreadyDownloaded": { - "description": "Snackbar - track already exists", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAlreadyInLibrary": "\"{trackName}\" already exists in your library", - "@snackbarAlreadyInLibrary": { - "description": "Snackbar - track already exists in local library", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarHistoryCleared": "History cleared", - "@snackbarHistoryCleared": { - "description": "Snackbar - history deleted" - }, - "snackbarDeletedTracks": "Deleted {count} {count, plural, =1{track} other{tracks}}", - "@snackbarDeletedTracks": { - "description": "Snackbar - tracks deleted", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarCannotOpenFile": "Cannot open file: {error}", - "@snackbarCannotOpenFile": { - "description": "Snackbar - file open error", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "snackbarViewQueue": "View Queue", - "@snackbarViewQueue": { - "description": "Snackbar action - view download queue" - }, - "snackbarUrlCopied": "{platform} URL copied to clipboard", - "@snackbarUrlCopied": { - "description": "Snackbar - URL copied", - "placeholders": { - "platform": { - "type": "String", - "description": "Platform name (Spotify/Deezer)" - } - } - }, - "snackbarFileNotFound": "File not found", - "@snackbarFileNotFound": { - "description": "Snackbar - file doesn't exist" - }, - "snackbarSelectExtFile": "Please select a .spotiflac-ext file", - "@snackbarSelectExtFile": { - "description": "Snackbar - wrong file type selected" - }, - "snackbarProviderPrioritySaved": "Provider priority saved", - "@snackbarProviderPrioritySaved": { - "description": "Snackbar - provider order saved" - }, - "snackbarMetadataProviderSaved": "Metadata provider priority saved", - "@snackbarMetadataProviderSaved": { - "description": "Snackbar - metadata provider order saved" - }, - "snackbarExtensionInstalled": "{extensionName} installed.", - "@snackbarExtensionInstalled": { - "description": "Snackbar - extension installed successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarExtensionUpdated": "{extensionName} updated.", - "@snackbarExtensionUpdated": { - "description": "Snackbar - extension updated successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarFailedToInstall": "Failed to install extension", - "@snackbarFailedToInstall": { - "description": "Snackbar - extension install error" - }, - "snackbarFailedToUpdate": "Failed to update extension", - "@snackbarFailedToUpdate": { - "description": "Snackbar - extension update error" - }, - "errorRateLimited": "Rate Limited", - "@errorRateLimited": { - "description": "Error title - too many requests" - }, - "errorRateLimitedMessage": "Too many requests. Please wait a moment before searching again.", - "@errorRateLimitedMessage": { - "description": "Error message - rate limit explanation" - }, - "errorNoTracksFound": "No tracks found", - "@errorNoTracksFound": { - "description": "Error - search returned no results" - }, - "searchEmptyResultSubtitle": "Try another keyword", - "@searchEmptyResultSubtitle": { - "description": "Subtitle shown under the empty search result state on the home screen" - }, - "errorUrlNotRecognized": "Link not recognized", - "@errorUrlNotRecognized": { - "description": "Error title - URL not handled by any extension or service" - }, - "errorUrlNotRecognizedMessage": "This link is not supported. Make sure the URL is correct and a compatible extension is installed.", - "@errorUrlNotRecognizedMessage": { - "description": "Error message - URL not recognized explanation" - }, - "errorUrlFetchFailed": "Failed to load content from this link. Please try again.", - "@errorUrlFetchFailed": { - "description": "Error message - generic URL fetch failure" - }, - "errorMissingExtensionSource": "Cannot load {item}: missing extension source", - "@errorMissingExtensionSource": { - "description": "Error - extension source not available", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "actionPause": "Pause", - "@actionPause": { - "description": "Action button - pause download" - }, - "actionResume": "Resume", - "@actionResume": { - "description": "Action button - resume download" - }, - "actionCancel": "Cancel", - "@actionCancel": { - "description": "Action button - cancel operation" - }, - "actionSelectAll": "Select All", - "@actionSelectAll": { - "description": "Action button - select all items" - }, - "actionDeselect": "Deselect", - "@actionDeselect": { - "description": "Action button - deselect all" - }, - "selectionSelected": "{count} selected", - "@selectionSelected": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionAllSelected": "All tracks selected", - "@selectionAllSelected": { - "description": "Status - all items selected" - }, - "selectionSelectToDelete": "Select tracks to delete", - "@selectionSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "progressFetchingMetadata": "Fetching metadata... {current}/{total}", - "@progressFetchingMetadata": { - "description": "Progress indicator - loading track info", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "progressReadingCsv": "Reading CSV...", - "@progressReadingCsv": { - "description": "Progress indicator - parsing CSV file" - }, - "searchSongs": "Songs", - "@searchSongs": { - "description": "Search result category - songs" - }, - "searchArtists": "Artists", - "@searchArtists": { - "description": "Search result category - artists" - }, - "searchAlbums": "Albums", - "@searchAlbums": { - "description": "Search result category - albums" - }, - "searchPlaylists": "Playlists", - "@searchPlaylists": { - "description": "Search result category - playlists" - }, - "searchSortTitle": "Sort Results", - "@searchSortTitle": { - "description": "Bottom sheet title for search sort options" - }, - "searchSortDefault": "Default", - "@searchSortDefault": { - "description": "Sort option - default API order" - }, - "searchSortTitleAZ": "Title (A-Z)", - "@searchSortTitleAZ": { - "description": "Sort option - title ascending" - }, - "searchSortTitleZA": "Title (Z-A)", - "@searchSortTitleZA": { - "description": "Sort option - title descending" - }, - "searchSortArtistAZ": "Artist (A-Z)", - "@searchSortArtistAZ": { - "description": "Sort option - artist ascending" - }, - "searchSortArtistZA": "Artist (Z-A)", - "@searchSortArtistZA": { - "description": "Sort option - artist descending" - }, - "searchSortDurationShort": "Duration (Shortest)", - "@searchSortDurationShort": { - "description": "Sort option - shortest duration first" - }, - "searchSortDurationLong": "Duration (Longest)", - "@searchSortDurationLong": { - "description": "Sort option - longest duration first" - }, - "searchSortDateOldest": "Release Date (Oldest)", - "@searchSortDateOldest": { - "description": "Sort option - oldest release first" - }, - "searchSortDateNewest": "Release Date (Newest)", - "@searchSortDateNewest": { - "description": "Sort option - newest release first" - }, - "tooltipPlay": "Play", - "@tooltipPlay": { - "description": "Tooltip - play button" - }, - "filenameFormat": "Filename Format", - "@filenameFormat": { - "description": "Setting title - filename pattern" - }, - "filenameShowAdvancedTags": "Show advanced tags", - "@filenameShowAdvancedTags": { - "description": "Toggle label for showing advanced filename tags" - }, - "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", - "@filenameShowAdvancedTagsDescription": { - "description": "Description for advanced filename tag toggle" - }, - "folderOrganizationNone": "No organization", - "@folderOrganizationNone": { - "description": "Folder option - flat structure" - }, - "folderOrganizationByPlaylist": "By Playlist", - "@folderOrganizationByPlaylist": { - "description": "Folder option - playlist folders" - }, - "folderOrganizationByPlaylistSubtitle": "Separate folder for each playlist", - "@folderOrganizationByPlaylistSubtitle": { - "description": "Subtitle for playlist folder option" - }, - "folderOrganizationByArtist": "By Artist", - "@folderOrganizationByArtist": { - "description": "Folder option - artist folders" - }, - "folderOrganizationByAlbum": "By Album", - "@folderOrganizationByAlbum": { - "description": "Folder option - album folders" - }, - "folderOrganizationByArtistAlbum": "Artist/Album", - "@folderOrganizationByArtistAlbum": { - "description": "Folder option - nested folders" - }, - "folderOrganizationDescription": "Organize downloaded files into folders", - "@folderOrganizationDescription": { - "description": "Folder organization sheet description" - }, - "folderOrganizationNoneSubtitle": "All files in download folder", - "@folderOrganizationNoneSubtitle": { - "description": "Subtitle for no organization option" - }, - "folderOrganizationByArtistSubtitle": "Separate folder for each artist", - "@folderOrganizationByArtistSubtitle": { - "description": "Subtitle for artist folder option" - }, - "folderOrganizationByAlbumSubtitle": "Separate folder for each album", - "@folderOrganizationByAlbumSubtitle": { - "description": "Subtitle for album folder option" - }, - "folderOrganizationByArtistAlbumSubtitle": "Nested folders for artist and album", - "@folderOrganizationByArtistAlbumSubtitle": { - "description": "Subtitle for nested folder option" - }, - "updateAvailable": "Update Available", - "@updateAvailable": { - "description": "Update dialog title" - }, - "updateLater": "Later", - "@updateLater": { - "description": "Update button - dismiss" - }, - "updateStartingDownload": "Starting download...", - "@updateStartingDownload": { - "description": "Update status - initializing" - }, - "updateDownloadFailed": "Download failed", - "@updateDownloadFailed": { - "description": "Update error title" - }, - "updateFailedMessage": "Failed to download update", - "@updateFailedMessage": { - "description": "Update error message" - }, - "updateNewVersionReady": "A new version is ready", - "@updateNewVersionReady": { - "description": "Update subtitle" - }, - "updateCurrent": "Current", - "@updateCurrent": { - "description": "Label for current version" - }, - "updateNew": "New", - "@updateNew": { - "description": "Label for new version" - }, - "updateDownloading": "Downloading...", - "@updateDownloading": { - "description": "Update status - downloading" - }, - "updateWhatsNew": "What's New", - "@updateWhatsNew": { - "description": "Changelog section title" - }, - "updateDownloadInstall": "Download & Install", - "@updateDownloadInstall": { - "description": "Update button - download and install" - }, - "updateDontRemind": "Don't remind", - "@updateDontRemind": { - "description": "Update button - skip this version" - }, - "providerPriorityTitle": "Provider Priority", - "@providerPriorityTitle": { - "description": "Provider priority page title" - }, - "providerPriorityDescription": "Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.", - "@providerPriorityDescription": { - "description": "Provider priority page description" - }, - "providerPriorityInfo": "If a track is not available on the first provider, the app will automatically try the next one.", - "@providerPriorityInfo": { - "description": "Info tip about fallback behavior" - }, - "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", - "@providerPriorityFallbackExtensionsDescription": { - "description": "Section description for extension fallback selection" - }, - "providerPriorityFallbackExtensionsHint": "Only enabled extensions with download-provider capability are listed here.", - "@providerPriorityFallbackExtensionsHint": { - "description": "Hint below the extension fallback selection list" - }, - "providerExtension": "Extension", - "@providerExtension": { - "description": "Label for extension-provided providers" - }, - "metadataProviderPriorityTitle": "Metadata Priority", - "@metadataProviderPriorityTitle": { - "description": "Metadata priority page title" - }, - "metadataProviderPriorityDescription": "Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.", - "@metadataProviderPriorityDescription": { - "description": "Metadata priority page description" - }, - "metadataProviderPriorityInfo": "Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.", - "@metadataProviderPriorityInfo": { - "description": "Info tip about rate limits" - }, - "logTitle": "Logs", - "@logTitle": { - "description": "Logs screen title" - }, - "logCopied": "Logs copied to clipboard", - "@logCopied": { - "description": "Snackbar - logs copied" - }, - "logSearchHint": "Search logs...", - "@logSearchHint": { - "description": "Log search placeholder" - }, - "logFilterLevel": "Level", - "@logFilterLevel": { - "description": "Filter by log level" - }, - "logFilterSection": "Filter", - "@logFilterSection": { - "description": "Filter section title" - }, - "logShareLogs": "Share logs", - "@logShareLogs": { - "description": "Share button tooltip" - }, - "logClearLogs": "Clear logs", - "@logClearLogs": { - "description": "Clear button tooltip" - }, - "logClearLogsTitle": "Clear Logs", - "@logClearLogsTitle": { - "description": "Clear logs dialog title" - }, - "logClearLogsMessage": "Are you sure you want to clear all logs?", - "@logClearLogsMessage": { - "description": "Clear logs confirmation message" - }, - "logFilterBySeverity": "Filter logs by severity", - "@logFilterBySeverity": { - "description": "Filter dialog title" - }, - "logNoLogsYet": "No logs yet", - "@logNoLogsYet": { - "description": "Empty state title" - }, - "logNoLogsYetSubtitle": "Logs will appear here as you use the app", - "@logNoLogsYetSubtitle": { - "description": "Empty state subtitle" - }, - "logEntriesFiltered": "Entries ({count} filtered)", - "@logEntriesFiltered": { - "description": "Log count with filter active", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "logEntries": "Entries ({count})", - "@logEntries": { - "description": "Total log count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "channelStable": "Stable", - "@channelStable": { - "description": "Update channel - stable releases" - }, - "channelPreview": "Preview", - "@channelPreview": { - "description": "Update channel - beta/preview releases" - }, - "sectionSearchSource": "Search Source", - "@sectionSearchSource": { - "description": "Settings section header" - }, - "sectionDownload": "Download", - "@sectionDownload": { - "description": "Settings section header" - }, - "sectionPerformance": "Performance", - "@sectionPerformance": { - "description": "Settings section header" - }, - "sectionApp": "App", - "@sectionApp": { - "description": "Settings section header" - }, - "sectionData": "Data", - "@sectionData": { - "description": "Settings section header" - }, - "sectionDebug": "Debug", - "@sectionDebug": { - "description": "Settings section header" - }, - "sectionService": "Service", - "@sectionService": { - "description": "Settings section header" - }, - "sectionAudioQuality": "Audio Quality", - "@sectionAudioQuality": { - "description": "Settings section header" - }, - "sectionFileSettings": "File Settings", - "@sectionFileSettings": { - "description": "Settings section header" - }, - "sectionLyrics": "Lyrics", - "@sectionLyrics": { - "description": "Settings section header" - }, - "lyricsMode": "Lyrics Mode", - "@lyricsMode": { - "description": "Setting - how to save lyrics" - }, - "lyricsModeDescription": "Choose how lyrics are saved with your downloads", - "@lyricsModeDescription": { - "description": "Lyrics mode picker description" - }, - "lyricsModeEmbed": "Embed in file", - "@lyricsModeEmbed": { - "description": "Lyrics mode option - embed in audio file" - }, - "lyricsModeEmbedSubtitle": "Lyrics stored inside FLAC metadata", - "@lyricsModeEmbedSubtitle": { - "description": "Subtitle for embed option" - }, - "lyricsModeExternal": "External .lrc file", - "@lyricsModeExternal": { - "description": "Lyrics mode option - separate LRC file" - }, - "lyricsModeExternalSubtitle": "Separate .lrc file for players like Samsung Music", - "@lyricsModeExternalSubtitle": { - "description": "Subtitle for external option" - }, - "lyricsModeBoth": "Both", - "@lyricsModeBoth": { - "description": "Lyrics mode option - embed and external" - }, - "lyricsModeBothSubtitle": "Embed and save .lrc file", - "@lyricsModeBothSubtitle": { - "description": "Subtitle for both option" - }, - "sectionColor": "Color", - "@sectionColor": { - "description": "Settings section header" - }, - "sectionTheme": "Theme", - "@sectionTheme": { - "description": "Settings section header" - }, - "sectionLayout": "Layout", - "@sectionLayout": { - "description": "Settings section header" - }, - "sectionLanguage": "Language", - "@sectionLanguage": { - "description": "Settings section header for language" - }, - "appearanceLanguage": "App Language", - "@appearanceLanguage": { - "description": "Language setting title" - }, - "settingsAppearanceSubtitle": "Theme, colors, display", - "@settingsAppearanceSubtitle": { - "description": "Appearance settings description" - }, - "settingsDownloadSubtitle": "Service, quality, fallback", - "@settingsDownloadSubtitle": { - "description": "Download settings description" - }, - "settingsExtensionsSubtitle": "Manage download providers", - "@settingsExtensionsSubtitle": { - "description": "Extensions settings description" - }, - "settingsLogsSubtitle": "View app logs for debugging", - "@settingsLogsSubtitle": { - "description": "Logs settings description" - }, - "loadingSharedLink": "Loading shared link...", - "@loadingSharedLink": { - "description": "Status when opening shared URL" - }, - "pressBackAgainToExit": "Press back again to exit", - "@pressBackAgainToExit": { - "description": "Exit confirmation message" - }, - "downloadAllCount": "Download All ({count})", - "@downloadAllCount": { - "description": "Download all button with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tracksCount": "{count, plural, =1{1 track} other{{count} tracks}}", - "@tracksCount": { - "description": "Track count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackCopyFilePath": "Copy file path", - "@trackCopyFilePath": { - "description": "Action - copy file path" - }, - "trackRemoveFromDevice": "Remove from device", - "@trackRemoveFromDevice": { - "description": "Action - delete downloaded file" - }, - "trackLoadLyrics": "Load Lyrics", - "@trackLoadLyrics": { - "description": "Action - fetch lyrics" - }, - "trackMetadata": "Metadata", - "@trackMetadata": { - "description": "Tab title - track metadata" - }, - "trackFileInfo": "File Info", - "@trackFileInfo": { - "description": "Tab title - file information" - }, - "trackLyrics": "Lyrics", - "@trackLyrics": { - "description": "Tab title - lyrics" - }, - "trackFileNotFound": "File not found", - "@trackFileNotFound": { - "description": "Error - file doesn't exist" - }, - "trackOpenInDeezer": "Open in Deezer", - "@trackOpenInDeezer": { - "description": "Action - open track in Deezer app" - }, - "trackOpenInSpotify": "Open in Spotify", - "@trackOpenInSpotify": { - "description": "Action - open track in Spotify app" - }, - "trackTrackName": "Track name", - "@trackTrackName": { - "description": "Metadata label - track title" - }, - "trackArtist": "Artist", - "@trackArtist": { - "description": "Metadata label - artist name" - }, - "trackAlbumArtist": "Album artist", - "@trackAlbumArtist": { - "description": "Metadata label - album artist" - }, - "trackAlbum": "Album", - "@trackAlbum": { - "description": "Metadata label - album name" - }, - "trackTrackNumber": "Track number", - "@trackTrackNumber": { - "description": "Metadata label - track number" - }, - "trackDiscNumber": "Disc number", - "@trackDiscNumber": { - "description": "Metadata label - disc number" - }, - "trackDuration": "Duration", - "@trackDuration": { - "description": "Metadata label - track length" - }, - "trackAudioQuality": "Audio quality", - "@trackAudioQuality": { - "description": "Metadata label - audio quality" - }, - "trackReleaseDate": "Release date", - "@trackReleaseDate": { - "description": "Metadata label - release date" - }, - "trackGenre": "Genre", - "@trackGenre": { - "description": "Metadata label - music genre" - }, - "trackLabel": "Label", - "@trackLabel": { - "description": "Metadata label - record label" - }, - "trackCopyright": "Copyright", - "@trackCopyright": { - "description": "Metadata label - copyright information" - }, - "trackDownloaded": "Downloaded", - "@trackDownloaded": { - "description": "Metadata label - download date" - }, - "trackCopyLyrics": "Copy lyrics", - "@trackCopyLyrics": { - "description": "Action - copy lyrics to clipboard" - }, - "trackLyricsSource": "Source: {source}", - "@trackLyricsSource": { - "description": "Label showing the lyrics source/provider", - "placeholders": { - "source": { - "type": "String" - } - } - }, - "trackLyricsNotAvailable": "Lyrics not available for this track", - "@trackLyricsNotAvailable": { - "description": "Message when lyrics not found" - }, - "trackLyricsNotInFile": "No lyrics found in this file", - "@trackLyricsNotInFile": { - "description": "Message when no embedded lyrics in audio file" - }, - "trackFetchOnlineLyrics": "Fetch from Online", - "@trackFetchOnlineLyrics": { - "description": "Action - fetch lyrics from online providers" - }, - "trackLyricsTimeout": "Request timed out. Try again later.", - "@trackLyricsTimeout": { - "description": "Message when lyrics request times out" - }, - "trackLyricsLoadFailed": "Failed to load lyrics", - "@trackLyricsLoadFailed": { - "description": "Message when lyrics loading fails" - }, - "trackEmbedLyrics": "Embed Lyrics", - "@trackEmbedLyrics": { - "description": "Action - embed lyrics into audio file" - }, - "trackLyricsEmbedded": "Lyrics embedded successfully", - "@trackLyricsEmbedded": { - "description": "Snackbar - lyrics saved to file" - }, - "trackInstrumental": "Instrumental track", - "@trackInstrumental": { - "description": "Message when track is instrumental (no lyrics)" - }, - "trackCopiedToClipboard": "Copied to clipboard", - "@trackCopiedToClipboard": { - "description": "Snackbar - content copied" - }, - "trackDeleteConfirmTitle": "Remove from device?", - "@trackDeleteConfirmTitle": { - "description": "Delete confirmation title" - }, - "trackDeleteConfirmMessage": "This will permanently delete the downloaded file and remove it from your history.", - "@trackDeleteConfirmMessage": { - "description": "Delete confirmation message" - }, - "dateToday": "Today", - "@dateToday": { - "description": "Relative date - today" - }, - "dateYesterday": "Yesterday", - "@dateYesterday": { - "description": "Relative date - yesterday" - }, - "dateDaysAgo": "{count} days ago", - "@dateDaysAgo": { - "description": "Relative date - days ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateWeeksAgo": "{count} weeks ago", - "@dateWeeksAgo": { - "description": "Relative date - weeks ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateMonthsAgo": "{count} months ago", - "@dateMonthsAgo": { - "description": "Relative date - months ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "storeFilterAll": "All", - "@storeFilterAll": { - "description": "Store filter - all extensions" - }, - "storeFilterMetadata": "Metadata", - "@storeFilterMetadata": { - "description": "Store filter - metadata providers" - }, - "storeFilterDownload": "Download", - "@storeFilterDownload": { - "description": "Store filter - download providers" - }, - "storeFilterUtility": "Utility", - "@storeFilterUtility": { - "description": "Store filter - utility extensions" - }, - "storeFilterLyrics": "Lyrics", - "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" - }, - "storeFilterIntegration": "Integration", - "@storeFilterIntegration": { - "description": "Store filter - integrations" - }, - "storeClearFilters": "Clear filters", - "@storeClearFilters": { - "description": "Button to clear all filters" - }, - "storeAddRepoTitle": "Add Extension Repository", - "@storeAddRepoTitle": { - "description": "Store setup screen - heading when no repo is configured" - }, - "storeAddRepoDescription": "Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.", - "@storeAddRepoDescription": { - "description": "Store setup screen - explanatory text" - }, - "storeRepoUrlLabel": "Repository URL", - "@storeRepoUrlLabel": { - "description": "Label for the repository URL input field" - }, - "storeRepoUrlHint": "https://github.com/user/repo", - "@storeRepoUrlHint": { - "description": "Hint/placeholder for the repository URL input field" - }, - "storeAddRepoButton": "Add Repository", - "@storeAddRepoButton": { - "description": "Button to submit a new repository URL" - }, - "storeChangeRepoTooltip": "Change repository", - "@storeChangeRepoTooltip": { - "description": "Tooltip for the change-repository icon button in the app bar" - }, - "storeRepoDialogTitle": "Extension Repository", - "@storeRepoDialogTitle": { - "description": "Title of the change/remove repository dialog" - }, - "storeRepoDialogCurrent": "Current repository:", - "@storeRepoDialogCurrent": { - "description": "Label shown above the current repository URL in the dialog" - }, - "storeNewRepoUrlLabel": "New Repository URL", - "@storeNewRepoUrlLabel": { - "description": "Label for the new repository URL field inside the dialog" - }, - "storeLoadError": "Failed to load repository", - "@storeLoadError": { - "description": "Error heading when the store cannot be loaded" - }, - "storeEmptyNoExtensions": "No extensions available", - "@storeEmptyNoExtensions": { - "description": "Message when store has no extensions" - }, - "storeEmptyNoResults": "No extensions found", - "@storeEmptyNoResults": { - "description": "Message when search/filter returns no results" - }, - "extensionId": "ID", - "@extensionId": { - "description": "Extension detail - unique ID" - }, - "extensionError": "Error", - "@extensionError": { - "description": "Extension detail - error message" - }, - "extensionCapabilities": "Capabilities", - "@extensionCapabilities": { - "description": "Section header - extension features" - }, - "extensionMetadataProvider": "Metadata Provider", - "@extensionMetadataProvider": { - "description": "Capability - provides metadata" - }, - "extensionDownloadProvider": "Download Provider", - "@extensionDownloadProvider": { - "description": "Capability - provides downloads" - }, - "extensionLyricsProvider": "Lyrics Provider", - "@extensionLyricsProvider": { - "description": "Capability - provides lyrics" - }, - "extensionUrlHandler": "URL Handler", - "@extensionUrlHandler": { - "description": "Capability - handles URLs" - }, - "extensionQualityOptions": "Quality Options", - "@extensionQualityOptions": { - "description": "Capability - quality selection" - }, - "extensionPostProcessingHooks": "Post-Processing Hooks", - "@extensionPostProcessingHooks": { - "description": "Capability - post-processing" - }, - "extensionPermissions": "Permissions", - "@extensionPermissions": { - "description": "Section header - required permissions" - }, - "extensionSettings": "Settings", - "@extensionSettings": { - "description": "Section header - extension settings" - }, - "extensionRemoveButton": "Remove Extension", - "@extensionRemoveButton": { - "description": "Button to uninstall extension" - }, - "extensionUpdated": "Updated", - "@extensionUpdated": { - "description": "Extension detail - last update" - }, - "extensionMinAppVersion": "Min App Version", - "@extensionMinAppVersion": { - "description": "Extension detail - minimum app version" - }, - "extensionCustomTrackMatching": "Custom Track Matching", - "@extensionCustomTrackMatching": { - "description": "Capability - custom track matching algorithm" - }, - "extensionPostProcessing": "Post-Processing", - "@extensionPostProcessing": { - "description": "Capability - post-download processing" - }, - "extensionHooksAvailable": "{count} hook(s) available", - "@extensionHooksAvailable": { - "description": "Post-processing hooks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionPatternsCount": "{count} pattern(s)", - "@extensionPatternsCount": { - "description": "URL patterns count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionStrategy": "Strategy: {strategy}", - "@extensionStrategy": { - "description": "Track matching strategy name", - "placeholders": { - "strategy": { - "type": "String" - } - } - }, - "extensionsProviderPrioritySection": "Provider Priority", - "@extensionsProviderPrioritySection": { - "description": "Section header - provider priority" - }, - "extensionsInstalledSection": "Installed Extensions", - "@extensionsInstalledSection": { - "description": "Section header - installed extensions" - }, - "extensionsNoExtensions": "No extensions installed", - "@extensionsNoExtensions": { - "description": "Empty state - no extensions" - }, - "extensionsNoExtensionsSubtitle": "Install .spotiflac-ext files to add new providers", - "@extensionsNoExtensionsSubtitle": { - "description": "Empty state subtitle" - }, - "extensionsInstallButton": "Install Extension", - "@extensionsInstallButton": { - "description": "Button to install extension from file" - }, - "extensionsInfoTip": "Extensions can add new metadata and download providers. Only install extensions from trusted sources.", - "@extensionsInfoTip": { - "description": "Security warning about extensions" - }, - "extensionsInstalledSuccess": "Extension installed successfully", - "@extensionsInstalledSuccess": { - "description": "Success message after install" - }, - "extensionsInstalledCount": "{count} extensions installed successfully", - "@extensionsInstalledCount": { - "description": "Success message after installing multiple extensions", - "placeholders": { - "count": { - "type": "int", - "description": "Number of installed extensions" - } - } - }, - "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", - "@extensionsInstallPartialSuccess": { - "description": "Message when installing multiple extensions partially succeeds", - "placeholders": { - "installed": { - "type": "int", - "description": "Number of successfully installed extensions" - }, - "attempted": { - "type": "int", - "description": "Number of selected extensions" - } - } - }, - "extensionsDownloadPriority": "Download Priority", - "@extensionsDownloadPriority": { - "description": "Setting - download provider order" - }, - "extensionsDownloadPrioritySubtitle": "Set download service order", - "@extensionsDownloadPrioritySubtitle": { - "description": "Subtitle for download priority" - }, - "extensionsFallbackTitle": "Fallback Extensions", - "@extensionsFallbackTitle": { - "description": "Setting and page title for choosing which download extensions can be used during fallback" - }, - "extensionsFallbackSubtitle": "Choose which installed download extensions can be used as fallback", - "@extensionsFallbackSubtitle": { - "description": "Subtitle for download fallback extensions menu" - }, - "extensionsNoDownloadProvider": "No extensions with download provider", - "@extensionsNoDownloadProvider": { - "description": "Empty state - no download providers" - }, - "extensionsMetadataPriority": "Metadata Priority", - "@extensionsMetadataPriority": { - "description": "Setting - metadata provider order" - }, - "extensionsMetadataPrioritySubtitle": "Set search & metadata source order", - "@extensionsMetadataPrioritySubtitle": { - "description": "Subtitle for metadata priority" - }, - "extensionsNoMetadataProvider": "No extensions with metadata provider", - "@extensionsNoMetadataProvider": { - "description": "Empty state - no metadata providers" - }, - "extensionsSearchProvider": "Search Provider", - "@extensionsSearchProvider": { - "description": "Setting - search provider selection" - }, - "extensionsNoCustomSearch": "No extensions with custom search", - "@extensionsNoCustomSearch": { - "description": "Empty state - no search providers" - }, - "extensionsSearchProviderDescription": "Choose which service to use for searching tracks", - "@extensionsSearchProviderDescription": { - "description": "Search provider setting description" - }, - "extensionsCustomSearch": "Custom search", - "@extensionsCustomSearch": { - "description": "Label for custom search provider" - }, - "extensionsErrorLoading": "Error loading extension", - "@extensionsErrorLoading": { - "description": "Error message when extension fails to load" - }, - "qualityFlacLossless": "FLAC Lossless", - "@qualityFlacLossless": { - "description": "Quality option - CD quality FLAC" - }, - "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", - "@qualityFlacLosslessSubtitle": { - "description": "Technical spec for lossless" - }, - "qualityHiResFlac": "Hi-Res FLAC", - "@qualityHiResFlac": { - "description": "Quality option - high resolution FLAC" - }, - "qualityHiResFlacSubtitle": "24-bit / up to 96kHz", - "@qualityHiResFlacSubtitle": { - "description": "Technical spec for hi-res" - }, - "qualityHiResFlacMax": "Hi-Res FLAC Max", - "@qualityHiResFlacMax": { - "description": "Quality option - maximum resolution FLAC" - }, - "qualityHiResFlacMaxSubtitle": "24-bit / up to 192kHz", - "@qualityHiResFlacMaxSubtitle": { - "description": "Technical spec for hi-res max" - }, - "downloadLossy320": "Lossy 320kbps", - "@downloadLossy320": { - "description": "Quality option label for lossy 320kbps" - }, - "downloadLossyFormat": "Lossy Format", - "@downloadLossyFormat": { - "description": "Setting title to pick output format for lossy downloads" - }, - "downloadLossy320Format": "Lossy 320kbps Format", - "@downloadLossy320Format": { - "description": "Title of the lossy format picker bottom sheet" - }, - "downloadLossy320FormatDesc": "Choose the output format for 320kbps lossy downloads. The original stream will be converted to your selected format when needed.", - "@downloadLossy320FormatDesc": { - "description": "Description in the lossy format picker" - }, - "downloadLossyMp3": "MP3 320kbps", - "@downloadLossyMp3": { - "description": "Lossy format option - MP3 320kbps" - }, - "downloadLossyMp3Subtitle": "Best compatibility, ~10MB per track", - "@downloadLossyMp3Subtitle": { - "description": "Subtitle for MP3 320kbps lossy option" - }, - "downloadLossyAac": "AAC/M4A 320kbps", - "@downloadLossyAac": { - "description": "Lossy format option - AAC in M4A container at 320kbps" - }, - "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", - "@downloadLossyAacSubtitle": { - "description": "Subtitle for AAC/M4A 320kbps lossy option" - }, - "downloadLossyOpus256": "Opus 256kbps", - "@downloadLossyOpus256": { - "description": "Lossy format option - Opus 256kbps" - }, - "downloadLossyOpus256Subtitle": "Best quality Opus, ~8MB per track", - "@downloadLossyOpus256Subtitle": { - "description": "Subtitle for Opus 256kbps lossy option" - }, - "downloadLossyOpus128": "Opus 128kbps", - "@downloadLossyOpus128": { - "description": "Lossy format option - Opus 128kbps" - }, - "downloadLossyOpus128Subtitle": "Smallest size, ~4MB per track", - "@downloadLossyOpus128Subtitle": { - "description": "Subtitle for Opus 128kbps lossy option" - }, - "downloadAskBeforeDownload": "Ask Before Download", - "@downloadAskBeforeDownload": { - "description": "Setting - show quality picker" - }, - "downloadDirectory": "Download Directory", - "@downloadDirectory": { - "description": "Setting - download folder" - }, - "downloadSeparateSinglesFolder": "Separate Singles Folder", - "@downloadSeparateSinglesFolder": { - "description": "Setting - separate folder for singles" - }, - "downloadAlbumFolderStructure": "Album Folder Structure", - "@downloadAlbumFolderStructure": { - "description": "Setting - album folder organization" - }, - "albumFolderStructureDescription": "Choose how album folders are structured", - "@albumFolderStructureDescription": { - "description": "Album folder structure picker description" - }, - "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", - "@downloadUseAlbumArtistForFolders": { - "description": "Setting - choose whether artist folders use Album Artist or Track Artist" - }, - "downloadUsePrimaryArtistOnly": "Primary artist only for folders", - "@downloadUsePrimaryArtistOnly": { - "description": "Setting - strip featured artists from folder name" - }, - "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", - "@downloadUsePrimaryArtistOnlyEnabled": { - "description": "Subtitle when primary artist only is enabled" - }, - "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", - "@downloadUsePrimaryArtistOnlyDisabled": { - "description": "Subtitle when primary artist only is disabled" - }, - "downloadSelectQuality": "Select Quality", - "@downloadSelectQuality": { - "description": "Dialog title - choose audio quality" - }, - "downloadFrom": "Download From", - "@downloadFrom": { - "description": "Label - download source" - }, - "appearanceAmoledDark": "AMOLED Dark", - "@appearanceAmoledDark": { - "description": "Theme option - pure black" - }, - "appearanceAmoledDarkSubtitle": "Pure black background", - "@appearanceAmoledDarkSubtitle": { - "description": "Subtitle for AMOLED dark" - }, - "queueClearAll": "Clear All", - "@queueClearAll": { - "description": "Button - clear all queue items" - }, - "queueClearAllMessage": "Are you sure you want to clear all downloads?", - "@queueClearAllMessage": { - "description": "Clear queue confirmation" - }, - "settingsAutoExportFailed": "Auto-export failed downloads", - "@settingsAutoExportFailed": { - "description": "Setting toggle for auto-export" - }, - "settingsAutoExportFailedSubtitle": "Save failed downloads to TXT file automatically", - "@settingsAutoExportFailedSubtitle": { - "description": "Subtitle for auto-export setting" - }, - "settingsDownloadNetwork": "Download Network", - "@settingsDownloadNetwork": { - "description": "Setting for network type preference" - }, - "settingsDownloadNetworkAny": "WiFi + Mobile Data", - "@settingsDownloadNetworkAny": { - "description": "Network option - use any connection" - }, - "settingsDownloadNetworkWifiOnly": "WiFi Only", - "@settingsDownloadNetworkWifiOnly": { - "description": "Network option - only use WiFi" - }, - "settingsDownloadNetworkSubtitle": "Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.", - "@settingsDownloadNetworkSubtitle": { - "description": "Subtitle explaining network preference" - }, - "albumFolderArtistAlbum": "Artist / Album", - "@albumFolderArtistAlbum": { - "description": "Album folder option" - }, - "albumFolderArtistAlbumSubtitle": "Albums/Artist Name/Album Name/", - "@albumFolderArtistAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistYearAlbum": "Artist / [Year] Album", - "@albumFolderArtistYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderArtistYearAlbumSubtitle": "Albums/Artist Name/[2005] Album Name/", - "@albumFolderArtistYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderAlbumOnly": "Album Only", - "@albumFolderAlbumOnly": { - "description": "Album folder option" - }, - "albumFolderAlbumOnlySubtitle": "Albums/Album Name/", - "@albumFolderAlbumOnlySubtitle": { - "description": "Folder structure example" - }, - "albumFolderYearAlbum": "[Year] Album", - "@albumFolderYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderYearAlbumSubtitle": "Albums/[2005] Album Name/", - "@albumFolderYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistAlbumSingles": "Artist / Album + Singles", - "@albumFolderArtistAlbumSingles": { - "description": "Album folder option with singles inside artist" - }, - "albumFolderArtistAlbumSinglesSubtitle": "Artist/Album/ and Artist/Singles/", - "@albumFolderArtistAlbumSinglesSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", - "@albumFolderArtistAlbumFlat": { - "description": "Album folder option with singles directly in artist folder" - }, - "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", - "@albumFolderArtistAlbumFlatSubtitle": { - "description": "Folder structure example for flat singles" - }, - "downloadedAlbumDeleteSelected": "Delete Selected", - "@downloadedAlbumDeleteSelected": { - "description": "Button - delete selected tracks" - }, - "downloadedAlbumDeleteMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from this album?\n\nThis will also delete the files from storage.", - "@downloadedAlbumDeleteMessage": { - "description": "Delete confirmation with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectedCount": "{count} selected", - "@downloadedAlbumSelectedCount": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumTapToSelect": "Tap tracks to select", - "@downloadedAlbumTapToSelect": { - "description": "Selection hint" - }, - "downloadedAlbumDeleteCount": "Delete {count} {count, plural, =1{track} other{tracks}}", - "@downloadedAlbumDeleteCount": { - "description": "Delete button text with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectToDelete": "Select tracks to delete", - "@downloadedAlbumSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "downloadedAlbumDiscHeader": "Disc {discNumber}", - "@downloadedAlbumDiscHeader": { - "description": "Header for disc separator in multi-disc albums", - "placeholders": { - "discNumber": { - "type": "int", - "example": "1" - } - } - }, - "recentTypeArtist": "Artist", - "@recentTypeArtist": { - "description": "Recent access item type - artist" - }, - "recentTypeAlbum": "Album", - "@recentTypeAlbum": { - "description": "Recent access item type - album" - }, - "recentTypeSong": "Song", - "@recentTypeSong": { - "description": "Recent access item type - song/track" - }, - "recentTypePlaylist": "Playlist", - "@recentTypePlaylist": { - "description": "Recent access item type - playlist" - }, - "recentEmpty": "No recent items yet", - "@recentEmpty": { - "description": "Empty state text for recent access list" - }, - "recentShowAllDownloads": "Show All Downloads", - "@recentShowAllDownloads": { - "description": "Button label to unhide hidden downloads in recent access" - }, - "recentPlaylistInfo": "Playlist: {name}", - "@recentPlaylistInfo": { - "description": "Snackbar message when tapping playlist in recent access", - "placeholders": { - "name": { - "type": "String", - "description": "Playlist name" - } - } - }, - "discographyDownload": "Download Discography", - "@discographyDownload": { - "description": "Button - download artist discography" - }, - "discographyDownloadAll": "Download All", - "@discographyDownloadAll": { - "description": "Option - download entire discography" - }, - "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", - "@discographyDownloadAllSubtitle": { - "description": "Subtitle showing total tracks and albums", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographyAlbumsOnly": "Albums Only", - "@discographyAlbumsOnly": { - "description": "Option - download only albums" - }, - "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", - "@discographyAlbumsOnlySubtitle": { - "description": "Subtitle showing album tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySinglesOnly": "Singles & EPs Only", - "@discographySinglesOnly": { - "description": "Option - download only singles" - }, - "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", - "@discographySinglesOnlySubtitle": { - "description": "Subtitle showing singles tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySelectAlbums": "Select Albums...", - "@discographySelectAlbums": { - "description": "Option - manually select albums to download" - }, - "discographySelectAlbumsSubtitle": "Choose specific albums or singles", - "@discographySelectAlbumsSubtitle": { - "description": "Subtitle for select albums option" - }, - "discographyFetchingTracks": "Fetching tracks...", - "@discographyFetchingTracks": { - "description": "Progress - fetching album tracks" - }, - "discographyFetchingAlbum": "Fetching {current} of {total}...", - "@discographyFetchingAlbum": { - "description": "Progress - fetching specific album", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "discographySelectedCount": "{count} selected", - "@discographySelectedCount": { - "description": "Selection count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographyDownloadSelected": "Download Selected", - "@discographyDownloadSelected": { - "description": "Button - download selected albums" - }, - "discographyAddedToQueue": "Added {count} tracks to queue", - "@discographyAddedToQueue": { - "description": "Snackbar - tracks added from discography", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", - "@discographySkippedDownloaded": { - "description": "Snackbar - with skipped tracks count", - "placeholders": { - "added": { - "type": "int" - }, - "skipped": { - "type": "int" - } - } - }, - "discographyNoAlbums": "No albums available", - "@discographyNoAlbums": { - "description": "Error - no albums found for artist" - }, - "discographyFailedToFetch": "Failed to fetch some albums", - "@discographyFailedToFetch": { - "description": "Error - some albums failed to load" - }, - "sectionStorageAccess": "Storage Access", - "@sectionStorageAccess": { - "description": "Section header for storage access settings" - }, - "allFilesAccess": "All Files Access", - "@allFilesAccess": { - "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" - }, - "allFilesAccessEnabledSubtitle": "Can write to any folder", - "@allFilesAccessEnabledSubtitle": { - "description": "Subtitle when all files access is enabled" - }, - "allFilesAccessDisabledSubtitle": "Limited to media folders only", - "@allFilesAccessDisabledSubtitle": { - "description": "Subtitle when all files access is disabled" - }, - "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", - "@allFilesAccessDescription": { - "description": "Description explaining when to enable all files access" - }, - "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", - "@allFilesAccessDeniedMessage": { - "description": "Message when permission is permanently denied" - }, - "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", - "@allFilesAccessDisabledMessage": { - "description": "Snackbar message when user disables all files access" - }, - "settingsLocalLibrary": "Local Library", - "@settingsLocalLibrary": { - "description": "Settings menu item - local library" - }, - "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", - "@settingsLocalLibrarySubtitle": { - "description": "Subtitle for local library settings" - }, - "settingsCache": "Storage & Cache", - "@settingsCache": { - "description": "Settings menu item - cache management" - }, - "settingsCacheSubtitle": "View size and clear cached data", - "@settingsCacheSubtitle": { - "description": "Subtitle for cache management menu" - }, - "libraryTitle": "Local Library", - "@libraryTitle": { - "description": "Library settings page title" - }, - "libraryScanSettings": "Scan Settings", - "@libraryScanSettings": { - "description": "Section header for scan settings" - }, - "libraryEnableLocalLibrary": "Enable Local Library", - "@libraryEnableLocalLibrary": { - "description": "Toggle to enable library scanning" - }, - "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", - "@libraryEnableLocalLibrarySubtitle": { - "description": "Subtitle for enable toggle" - }, - "libraryFolder": "Library Folder", - "@libraryFolder": { - "description": "Folder selection setting" - }, - "libraryFolderHint": "Tap to select folder", - "@libraryFolderHint": { - "description": "Placeholder when no folder selected" - }, - "libraryShowDuplicateIndicator": "Show Duplicate Indicator", - "@libraryShowDuplicateIndicator": { - "description": "Toggle for duplicate indicator in search" - }, - "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", - "@libraryShowDuplicateIndicatorSubtitle": { - "description": "Subtitle for duplicate indicator toggle" - }, - "libraryAutoScan": "Auto Scan", - "@libraryAutoScan": { - "description": "Setting for automatic library scanning" - }, - "libraryAutoScanSubtitle": "Automatically scan your library for new files", - "@libraryAutoScanSubtitle": { - "description": "Subtitle for auto scan setting" - }, - "libraryAutoScanOff": "Off", - "@libraryAutoScanOff": { - "description": "Auto scan disabled" - }, - "libraryAutoScanOnOpen": "Every app open", - "@libraryAutoScanOnOpen": { - "description": "Auto scan when app opens" - }, - "libraryAutoScanDaily": "Daily", - "@libraryAutoScanDaily": { - "description": "Auto scan once per day" - }, - "libraryAutoScanWeekly": "Weekly", - "@libraryAutoScanWeekly": { - "description": "Auto scan once per week" - }, - "libraryActions": "Actions", - "@libraryActions": { - "description": "Section header for library actions" - }, - "libraryScan": "Scan Library", - "@libraryScan": { - "description": "Button to start library scan" - }, - "libraryScanSubtitle": "Scan for audio files", - "@libraryScanSubtitle": { - "description": "Subtitle for scan button" - }, - "libraryScanSelectFolderFirst": "Select a folder first", - "@libraryScanSelectFolderFirst": { - "description": "Message when trying to scan without folder" - }, - "libraryCleanupMissingFiles": "Cleanup Missing Files", - "@libraryCleanupMissingFiles": { - "description": "Button to remove entries for missing files" - }, - "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", - "@libraryCleanupMissingFilesSubtitle": { - "description": "Subtitle for cleanup button" - }, - "libraryClear": "Clear Library", - "@libraryClear": { - "description": "Button to clear all library entries" - }, - "libraryClearSubtitle": "Remove all scanned tracks", - "@libraryClearSubtitle": { - "description": "Subtitle for clear button" - }, - "libraryClearConfirmTitle": "Clear Library", - "@libraryClearConfirmTitle": { - "description": "Dialog title for clear confirmation" - }, - "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", - "@libraryClearConfirmMessage": { - "description": "Dialog message for clear confirmation" - }, - "libraryAbout": "About Local Library", - "@libraryAbout": { - "description": "Section header for about info" - }, - "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", - "@libraryAboutDescription": { - "description": "Description of local library feature" - }, - "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", - "@libraryTracksUnit": { - "description": "Unit label for tracks count (without the number itself)", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryFilesUnit": "{count, plural, =1{file} other{files}}", - "@libraryFilesUnit": { - "description": "Unit label for files count during library scanning", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryLastScanned": "Last scanned: {time}", - "@libraryLastScanned": { - "description": "Last scan time display", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "libraryLastScannedNever": "Never", - "@libraryLastScannedNever": { - "description": "Shown when library has never been scanned" - }, - "libraryScanning": "Scanning...", - "@libraryScanning": { - "description": "Status during scan" - }, - "libraryScanFinalizing": "Finalizing library...", - "@libraryScanFinalizing": { - "description": "Status shown after file scanning finishes but library persistence is still running" - }, - "libraryScanProgress": "{progress}% of {total} files", - "@libraryScanProgress": { - "description": "Scan progress display", - "placeholders": { - "progress": { - "type": "String" - }, - "total": { - "type": "int" - } - } - }, - "libraryInLibrary": "In Library", - "@libraryInLibrary": { - "description": "Badge shown on tracks that exist in local library" - }, - "libraryRemovedMissingFiles": "Removed {count} missing files from library", - "@libraryRemovedMissingFiles": { - "description": "Snackbar after cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryCleared": "Library cleared", - "@libraryCleared": { - "description": "Snackbar after clearing library" - }, - "libraryStorageAccessRequired": "Storage Access Required", - "@libraryStorageAccessRequired": { - "description": "Dialog title for storage permission" - }, - "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", - "@libraryStorageAccessMessage": { - "description": "Dialog message for storage permission" - }, - "libraryFolderNotExist": "Selected folder does not exist", - "@libraryFolderNotExist": { - "description": "Error when folder doesn't exist" - }, - "librarySourceDownloaded": "Downloaded", - "@librarySourceDownloaded": { - "description": "Badge for tracks downloaded via SpotiFLAC" - }, - "librarySourceLocal": "Local", - "@librarySourceLocal": { - "description": "Badge for tracks from local library scan" - }, - "libraryFilterAll": "All", - "@libraryFilterAll": { - "description": "Filter chip - show all library items" - }, - "libraryFilterDownloaded": "Downloaded", - "@libraryFilterDownloaded": { - "description": "Filter chip - show only downloaded items" - }, - "libraryFilterLocal": "Local", - "@libraryFilterLocal": { - "description": "Filter chip - show only local library items" - }, - "libraryFilterTitle": "Filters", - "@libraryFilterTitle": { - "description": "Filter bottom sheet title" - }, - "libraryFilterReset": "Reset", - "@libraryFilterReset": { - "description": "Reset all filters button" - }, - "libraryFilterApply": "Apply", - "@libraryFilterApply": { - "description": "Apply filters button" - }, - "libraryFilterSource": "Source", - "@libraryFilterSource": { - "description": "Filter section - source type" - }, - "libraryFilterQuality": "Quality", - "@libraryFilterQuality": { - "description": "Filter section - audio quality" - }, - "libraryFilterQualityHiRes": "Hi-Res (24bit)", - "@libraryFilterQualityHiRes": { - "description": "Filter option - high resolution audio" - }, - "libraryFilterQualityCD": "CD (16bit)", - "@libraryFilterQualityCD": { - "description": "Filter option - CD quality audio" - }, - "libraryFilterQualityLossy": "Lossy", - "@libraryFilterQualityLossy": { - "description": "Filter option - lossy compressed audio" - }, - "libraryFilterFormat": "Format", - "@libraryFilterFormat": { - "description": "Filter section - file format" - }, - "libraryFilterMetadata": "Metadata", - "@libraryFilterMetadata": { - "description": "Filter section - metadata completeness" - }, - "libraryFilterMetadataComplete": "Complete metadata", - "@libraryFilterMetadataComplete": { - "description": "Filter option - items with complete metadata" - }, - "libraryFilterMetadataMissingAny": "Missing any metadata", - "@libraryFilterMetadataMissingAny": { - "description": "Filter option - items missing any tracked metadata field" - }, - "libraryFilterMetadataMissingYear": "Missing year", - "@libraryFilterMetadataMissingYear": { - "description": "Filter option - items missing release year/date" - }, - "libraryFilterMetadataMissingGenre": "Missing genre", - "@libraryFilterMetadataMissingGenre": { - "description": "Filter option - items missing genre" - }, - "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", - "@libraryFilterMetadataMissingAlbumArtist": { - "description": "Filter option - items missing album artist" - }, - "libraryFilterSort": "Sort", - "@libraryFilterSort": { - "description": "Filter section - sort order" - }, - "libraryFilterSortLatest": "Latest", - "@libraryFilterSortLatest": { - "description": "Sort option - newest first" - }, - "libraryFilterSortOldest": "Oldest", - "@libraryFilterSortOldest": { - "description": "Sort option - oldest first" - }, - "libraryFilterSortAlbumAsc": "Album (A-Z)", - "@libraryFilterSortAlbumAsc": { - "description": "Sort option - album ascending" - }, - "libraryFilterSortAlbumDesc": "Album (Z-A)", - "@libraryFilterSortAlbumDesc": { - "description": "Sort option - album descending" - }, - "libraryFilterSortGenreAsc": "Genre (A-Z)", - "@libraryFilterSortGenreAsc": { - "description": "Sort option - genre ascending" - }, - "libraryFilterSortGenreDesc": "Genre (Z-A)", - "@libraryFilterSortGenreDesc": { - "description": "Sort option - genre descending" - }, - "timeJustNow": "Just now", - "@timeJustNow": { - "description": "Relative time - less than a minute ago" - }, - "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", - "@timeMinutesAgo": { - "description": "Relative time - minutes ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", - "@timeHoursAgo": { - "description": "Relative time - hours ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC!", - "@tutorialWelcomeTitle": { - "description": "Tutorial welcome page title" - }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", - "@tutorialWelcomeDesc": { - "description": "Tutorial welcome page description" - }, - "tutorialWelcomeTip1": "Download music from Spotify, Deezer, or paste any supported URL", - "@tutorialWelcomeTip1": { - "description": "Tutorial welcome tip 1" - }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", - "@tutorialWelcomeTip2": { - "description": "Tutorial welcome tip 2" - }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", - "@tutorialWelcomeTip3": { - "description": "Tutorial welcome tip 3" - }, - "tutorialSearchTitle": "Finding Music", - "@tutorialSearchTitle": { - "description": "Tutorial search page title" - }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", - "@tutorialSearchDesc": { - "description": "Tutorial search page description" - }, - "tutorialDownloadTitle": "Downloading Music", - "@tutorialDownloadTitle": { - "description": "Tutorial download page title" - }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", - "@tutorialDownloadDesc": { - "description": "Tutorial download page description" - }, - "tutorialLibraryTitle": "Your Library", - "@tutorialLibraryTitle": { - "description": "Tutorial library page title" - }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", - "@tutorialLibraryDesc": { - "description": "Tutorial library page description" - }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", - "@tutorialLibraryTip1": { - "description": "Tutorial library tip 1" - }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", - "@tutorialLibraryTip2": { - "description": "Tutorial library tip 2" - }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", - "@tutorialLibraryTip3": { - "description": "Tutorial library tip 3" - }, - "tutorialExtensionsTitle": "Extensions", - "@tutorialExtensionsTitle": { - "description": "Tutorial extensions page title" - }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", - "@tutorialExtensionsDesc": { - "description": "Tutorial extensions page description" - }, - "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", - "@tutorialExtensionsTip1": { - "description": "Tutorial extensions tip 1" - }, - "tutorialExtensionsTip2": "Add new download providers or search sources", - "@tutorialExtensionsTip2": { - "description": "Tutorial extensions tip 2" - }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", - "@tutorialExtensionsTip3": { - "description": "Tutorial extensions tip 3" - }, - "tutorialSettingsTitle": "Customize Your Experience", - "@tutorialSettingsTitle": { - "description": "Tutorial settings page title" - }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", - "@tutorialSettingsDesc": { - "description": "Tutorial settings page description" - }, - "tutorialSettingsTip1": "Change download location and folder organization", - "@tutorialSettingsTip1": { - "description": "Tutorial settings tip 1" - }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", - "@tutorialSettingsTip2": { - "description": "Tutorial settings tip 2" - }, - "tutorialSettingsTip3": "Customize app theme and appearance", - "@tutorialSettingsTip3": { - "description": "Tutorial settings tip 3" - }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", - "@tutorialReadyMessage": { - "description": "Tutorial completion message" - }, - "libraryForceFullScan": "Force Full Scan", - "@libraryForceFullScan": { - "description": "Button to force a complete rescan of library" - }, - "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", - "@libraryForceFullScanSubtitle": { - "description": "Subtitle for force full scan button" - }, - "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", - "@cleanupOrphanedDownloads": { - "description": "Button to remove history entries for deleted files" - }, - "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", - "@cleanupOrphanedDownloadsSubtitle": { - "description": "Subtitle for orphaned cleanup button" - }, - "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", - "@cleanupOrphanedDownloadsResult": { - "description": "Snackbar after orphan cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cleanupOrphanedDownloadsNone": "No orphaned entries found", - "@cleanupOrphanedDownloadsNone": { - "description": "Snackbar when no orphans found" - }, - "cacheTitle": "Storage & Cache", - "@cacheTitle": { - "description": "Cache management page title" - }, - "cacheSummaryTitle": "Cache overview", - "@cacheSummaryTitle": { - "description": "Heading for cache summary card" - }, - "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", - "@cacheSummarySubtitle": { - "description": "Helper text for cache summary card" - }, - "cacheEstimatedTotal": "Estimated cache usage: {size}", - "@cacheEstimatedTotal": { - "description": "Total cache size shown in summary", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheSectionStorage": "Cached Data", - "@cacheSectionStorage": { - "description": "Section header for cache entries" - }, - "cacheSectionMaintenance": "Maintenance", - "@cacheSectionMaintenance": { - "description": "Section header for cleanup actions" - }, - "cacheAppDirectory": "App cache directory", - "@cacheAppDirectory": { - "description": "Cache item title for app cache directory" - }, - "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", - "@cacheAppDirectoryDesc": { - "description": "Description of what app cache directory contains" - }, - "cacheTempDirectory": "Temporary directory", - "@cacheTempDirectory": { - "description": "Cache item title for temporary files directory" - }, - "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", - "@cacheTempDirectoryDesc": { - "description": "Description of what temporary directory contains" - }, - "cacheCoverImage": "Cover image cache", - "@cacheCoverImage": { - "description": "Cache item title for persistent cover images" - }, - "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", - "@cacheCoverImageDesc": { - "description": "Description of what cover image cache contains" - }, - "cacheLibraryCover": "Library cover cache", - "@cacheLibraryCover": { - "description": "Cache item title for local library cover art images" - }, - "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", - "@cacheLibraryCoverDesc": { - "description": "Description of what library cover cache contains" - }, - "cacheExploreFeed": "Explore feed cache", - "@cacheExploreFeed": { - "description": "Cache item title for explore home feed cache" - }, - "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", - "@cacheExploreFeedDesc": { - "description": "Description of what explore feed cache contains" - }, - "cacheTrackLookup": "Track lookup cache", - "@cacheTrackLookup": { - "description": "Cache item title for track ID lookup cache" - }, - "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", - "@cacheTrackLookupDesc": { - "description": "Description of what track lookup cache contains" - }, - "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", - "@cacheCleanupUnusedDesc": { - "description": "Description of what cleanup unused data does" - }, - "cacheNoData": "No cached data", - "@cacheNoData": { - "description": "Label when cache category has no data" - }, - "cacheSizeWithFiles": "{size} in {count} files", - "@cacheSizeWithFiles": { - "description": "Cache size and file count", - "placeholders": { - "size": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "cacheSizeOnly": "{size}", - "@cacheSizeOnly": { - "description": "Cache size only", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheEntries": "{count} entries", - "@cacheEntries": { - "description": "Track cache entry count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cacheClearSuccess": "Cleared: {target}", - "@cacheClearSuccess": { - "description": "Snackbar after clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearConfirmTitle": "Clear cache?", - "@cacheClearConfirmTitle": { - "description": "Dialog title before clearing one cache category" - }, - "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", - "@cacheClearConfirmMessage": { - "description": "Dialog message before clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearAllConfirmTitle": "Clear all cache?", - "@cacheClearAllConfirmTitle": { - "description": "Dialog title before clearing all caches" - }, - "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", - "@cacheClearAllConfirmMessage": { - "description": "Dialog message before clearing all caches" - }, - "cacheClearAll": "Clear all cache", - "@cacheClearAll": { - "description": "Button label to clear all caches" - }, - "cacheCleanupUnused": "Cleanup unused data", - "@cacheCleanupUnused": { - "description": "Action title for cleaning unused entries" - }, - "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", - "@cacheCleanupUnusedSubtitle": { - "description": "Subtitle for cleanup unused data action" - }, - "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", - "@cacheCleanupResult": { - "description": "Snackbar after unused data cleanup", - "placeholders": { - "downloadCount": { - "type": "int" - }, - "libraryCount": { - "type": "int" - } - } - }, - "cacheRefreshStats": "Refresh stats", - "@cacheRefreshStats": { - "description": "Button label to refresh cache statistics" - }, - "trackSaveCoverArt": "Save Cover Art", - "@trackSaveCoverArt": { - "description": "Menu action - save album cover art as file" - }, - "trackSaveLyrics": "Save Lyrics (.lrc)", - "@trackSaveLyrics": { - "description": "Menu action - save lyrics as .lrc file" - }, - "trackSaveLyricsProgress": "Saving lyrics...", - "@trackSaveLyricsProgress": { - "description": "Snackbar while saving lyrics to file" - }, - "trackReEnrich": "Re-enrich", - "@trackReEnrich": { - "description": "Menu action - re-embed metadata into audio file" - }, - "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", - "@trackReEnrichOnlineSubtitle": { - "description": "Subtitle for re-enrich metadata action for local items" - }, - "trackReEnrichFieldCover": "Cover Art", - "@trackReEnrichFieldCover": { - "description": "Checkbox label for cover art field in re-enrich" - }, - "trackReEnrichFieldLyrics": "Lyrics", - "@trackReEnrichFieldLyrics": { - "description": "Checkbox label for lyrics field in re-enrich" - }, - "trackReEnrichFieldBasicTags": "Album, Album Artist", - "@trackReEnrichFieldBasicTags": { - "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" - }, - "trackReEnrichFieldTrackInfo": "Track & Disc Number", - "@trackReEnrichFieldTrackInfo": { - "description": "Checkbox label for track info in re-enrich" - }, - "trackReEnrichFieldReleaseInfo": "Date & ISRC", - "@trackReEnrichFieldReleaseInfo": { - "description": "Checkbox label for release info in re-enrich" - }, - "trackReEnrichFieldExtra": "Genre, Label, Copyright", - "@trackReEnrichFieldExtra": { - "description": "Checkbox label for extra metadata in re-enrich" - }, - "trackReEnrichSelectAll": "Select All", - "@trackReEnrichSelectAll": { - "description": "Select all fields checkbox in re-enrich" - }, - "trackEditMetadata": "Edit Metadata", - "@trackEditMetadata": { - "description": "Menu action - edit embedded metadata" - }, - "trackCoverSaved": "Cover art saved to {fileName}", - "@trackCoverSaved": { - "description": "Snackbar after cover art saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackCoverNoSource": "No cover art source available", - "@trackCoverNoSource": { - "description": "Snackbar when no cover art URL or embedded cover" - }, - "trackLyricsSaved": "Lyrics saved to {fileName}", - "@trackLyricsSaved": { - "description": "Snackbar after lyrics saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackReEnrichProgress": "Re-enriching metadata...", - "@trackReEnrichProgress": { - "description": "Snackbar while re-enriching metadata" - }, - "trackReEnrichSearching": "Searching metadata online...", - "@trackReEnrichSearching": { - "description": "Snackbar while searching metadata from internet for local items" - }, - "trackReEnrichSuccess": "Metadata re-enriched successfully", - "@trackReEnrichSuccess": { - "description": "Snackbar after successful re-enrichment" - }, - "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", - "@trackReEnrichFfmpegFailed": { - "description": "Snackbar when FFmpeg embed fails for MP3/Opus" - }, - "queueFlacAction": "Queue FLAC", - "@queueFlacAction": { - "description": "Action/button label for queueing FLAC redownloads for local tracks" - }, - "queueFlacConfirmMessage": "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", - "@queueFlacConfirmMessage": { - "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueFlacNoReliableMatches": "No reliable online matches found for the selection", - "@queueFlacNoReliableMatches": { - "description": "Snackbar when no safe FLAC redownload matches were found" - }, - "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", - "@queueFlacQueuedWithSkipped": { - "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", - "placeholders": { - "addedCount": { - "type": "int" - }, - "skippedCount": { - "type": "int" - } - } - }, - "trackSaveFailed": "Failed: {error}", - "@trackSaveFailed": { - "description": "Snackbar when save operation fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "trackConvertFormat": "Convert Format", - "@trackConvertFormat": { - "description": "Menu item - convert audio format" - }, - "trackConvertTitle": "Convert Audio", - "@trackConvertTitle": { - "description": "Title of convert bottom sheet" - }, - "trackConvertTargetFormat": "Target Format", - "@trackConvertTargetFormat": { - "description": "Label for format selection" - }, - "trackConvertBitrate": "Bitrate", - "@trackConvertBitrate": { - "description": "Label for bitrate selection" - }, - "trackConvertConfirmTitle": "Confirm Conversion", - "@trackConvertConfirmTitle": { - "description": "Confirmation dialog title" - }, - "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", - "@trackConvertConfirmMessage": { - "description": "Confirmation dialog message", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", - "@trackConvertConfirmMessageLossless": { - "description": "Confirmation dialog message for lossless-to-lossless conversion", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - } - } - }, - "trackConvertLosslessHint": "Lossless conversion — no quality loss", - "@trackConvertLosslessHint": { - "description": "Hint shown when converting between lossless formats" - }, - "trackConvertConverting": "Converting audio...", - "@trackConvertConverting": { - "description": "Snackbar while converting" - }, - "trackConvertSuccess": "Converted to {format} successfully", - "@trackConvertSuccess": { - "description": "Snackbar after successful conversion", - "placeholders": { - "format": { - "type": "String" - } - } - }, - "trackConvertFailed": "Conversion failed", - "@trackConvertFailed": { - "description": "Snackbar when conversion fails" - }, - "cueSplitTitle": "Split CUE Sheet", - "@cueSplitTitle": { - "description": "Title for CUE split bottom sheet" - }, - "cueSplitAlbum": "Album: {album}", - "@cueSplitAlbum": { - "description": "Album name in CUE split sheet", - "placeholders": { - "album": { - "type": "String" - } - } - }, - "cueSplitArtist": "Artist: {artist}", - "@cueSplitArtist": { - "description": "Artist name in CUE split sheet", - "placeholders": { - "artist": { - "type": "String" - } - } - }, - "cueSplitTrackCount": "{count} tracks", - "@cueSplitTrackCount": { - "description": "Number of tracks in CUE sheet", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cueSplitConfirmTitle": "Split CUE Album", - "@cueSplitConfirmTitle": { - "description": "CUE split confirmation dialog title" - }, - "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", - "@cueSplitConfirmMessage": { - "description": "CUE split confirmation dialog message", - "placeholders": { - "album": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", - "@cueSplitSplitting": { - "description": "Snackbar while splitting CUE", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "cueSplitSuccess": "Split into {count} tracks successfully", - "@cueSplitSuccess": { - "description": "Snackbar after successful CUE split", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cueSplitFailed": "CUE split failed", - "@cueSplitFailed": { - "description": "Snackbar when CUE split fails" - }, - "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", - "@cueSplitNoAudioFile": { - "description": "Error when CUE audio file is missing" - }, - "cueSplitButton": "Split into Tracks", - "@cueSplitButton": { - "description": "Button text to start CUE splitting" - }, - "actionCreate": "Create", - "@actionCreate": { - "description": "Generic action button - create" - }, - "collectionFoldersTitle": "My folders", - "@collectionFoldersTitle": { - "description": "Library section title for custom folders" - }, - "collectionWishlist": "Wishlist", - "@collectionWishlist": { - "description": "Custom folder for saved tracks to download later" - }, - "collectionLoved": "Loved", - "@collectionLoved": { - "description": "Custom folder for favorite tracks" - }, - "collectionFavoriteArtists": "Favorite Artists", - "@collectionFavoriteArtists": { - "description": "Custom folder for favorite artists" - }, - "collectionPlaylist": "Playlist", - "@collectionPlaylist": { - "description": "Single playlist label" - }, - "collectionAddToPlaylist": "Add to playlist", - "@collectionAddToPlaylist": { - "description": "Action to add a track to user playlist" - }, - "collectionCreatePlaylist": "Create playlist", - "@collectionCreatePlaylist": { - "description": "Action to create a new playlist" - }, - "collectionNoPlaylistsYet": "No playlists yet", - "@collectionNoPlaylistsYet": { - "description": "Empty state title when user has no playlists" - }, - "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", - "@collectionPlaylistTracks": { - "description": "Track count label for custom playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", - "@collectionArtistCount": { - "description": "Artist count label for favorite artists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionAddedToPlaylist": "Added to \"{playlistName}\"", - "@collectionAddedToPlaylist": { - "description": "Snackbar after adding track to playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", - "@collectionAlreadyInPlaylist": { - "description": "Snackbar when track already exists in playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistNameHint": "Playlist name", - "@collectionPlaylistNameHint": { - "description": "Hint text for playlist name input" - }, - "collectionPlaylistNameRequired": "Playlist name is required", - "@collectionPlaylistNameRequired": { - "description": "Validation error for empty playlist name" - }, - "collectionRenamePlaylist": "Rename playlist", - "@collectionRenamePlaylist": { - "description": "Action to rename playlist" - }, - "collectionDeletePlaylist": "Delete playlist", - "@collectionDeletePlaylist": { - "description": "Action to delete playlist" - }, - "collectionPlaylistRenamed": "Playlist renamed", - "@collectionPlaylistRenamed": { - "description": "Snackbar after renaming playlist" - }, - "collectionWishlistEmptyTitle": "Wishlist is empty", - "@collectionWishlistEmptyTitle": { - "description": "Wishlist empty state title" - }, - "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", - "@collectionWishlistEmptySubtitle": { - "description": "Wishlist empty state subtitle" - }, - "collectionLovedEmptyTitle": "Loved folder is empty", - "@collectionLovedEmptyTitle": { - "description": "Loved empty state title" - }, - "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", - "@collectionLovedEmptySubtitle": { - "description": "Loved empty state subtitle" - }, - "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", - "@collectionFavoriteArtistsEmptyTitle": { - "description": "Favorite artists empty state title" - }, - "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", - "@collectionFavoriteArtistsEmptySubtitle": { - "description": "Favorite artists empty state subtitle" - }, - "collectionPlaylistEmptyTitle": "Playlist is empty", - "@collectionPlaylistEmptyTitle": { - "description": "Playlist empty state title" - }, - "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", - "@collectionPlaylistEmptySubtitle": { - "description": "Playlist empty state subtitle" - }, - "collectionRemoveFromPlaylist": "Remove from playlist", - "@collectionRemoveFromPlaylist": { - "description": "Tooltip for removing track from playlist" - }, - "collectionRemoveFromFolder": "Remove from folder", - "@collectionRemoveFromFolder": { - "description": "Tooltip for removing track from wishlist/loved folder" - }, - "collectionAddedToLoved": "\"{trackName}\" added to Loved", - "@collectionAddedToLoved": { - "description": "Snackbar after adding track to loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", - "@collectionRemovedFromLoved": { - "description": "Snackbar after removing track from loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", - "@collectionAddedToWishlist": { - "description": "Snackbar after adding track to wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", - "@collectionRemovedFromWishlist": { - "description": "Snackbar after removing track from wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", - "@collectionAddedToFavoriteArtists": { - "description": "Snackbar after adding artist to favorite artists", - "placeholders": { - "artistName": { - "type": "String" - } - } - }, - "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", - "@collectionRemovedFromFavoriteArtists": { - "description": "Snackbar after removing artist from favorite artists", - "placeholders": { - "artistName": { - "type": "String" - } - } - }, - "trackOptionAddToLoved": "Add to Loved", - "@trackOptionAddToLoved": { - "description": "Bottom sheet action label - add track to loved folder" - }, - "trackOptionRemoveFromLoved": "Remove from Loved", - "@trackOptionRemoveFromLoved": { - "description": "Bottom sheet action label - remove track from loved folder" - }, - "trackOptionAddToWishlist": "Add to Wishlist", - "@trackOptionAddToWishlist": { - "description": "Bottom sheet action label - add track to wishlist" - }, - "trackOptionRemoveFromWishlist": "Remove from Wishlist", - "@trackOptionRemoveFromWishlist": { - "description": "Bottom sheet action label - remove track from wishlist" - }, - "artistOptionAddToFavorites": "Add to Favorite Artists", - "@artistOptionAddToFavorites": { - "description": "Action label - add artist to favorite artists" - }, - "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", - "@artistOptionRemoveFromFavorites": { - "description": "Action label - remove artist from favorite artists" - }, - "collectionPlaylistChangeCover": "Change cover image", - "@collectionPlaylistChangeCover": { - "description": "Bottom sheet action to pick a custom cover image for a playlist" - }, - "collectionPlaylistRemoveCover": "Remove cover image", - "@collectionPlaylistRemoveCover": { - "description": "Bottom sheet action to remove custom cover image from a playlist" - }, - "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", - "@selectionShareCount": { - "description": "Share button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionShareNoFiles": "No shareable files found", - "@selectionShareNoFiles": { - "description": "Snackbar when no selected files exist on disk" - }, - "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", - "@selectionConvertCount": { - "description": "Convert button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionConvertNoConvertible": "No convertible tracks selected", - "@selectionConvertNoConvertible": { - "description": "Snackbar when no selected tracks support conversion" - }, - "selectionBatchConvertConfirmTitle": "Batch Convert", - "@selectionBatchConvertConfirmTitle": { - "description": "Confirmation dialog title for batch conversion" - }, - "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessage": { - "description": "Confirmation dialog message for batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessageLossless": { - "description": "Confirmation dialog message for lossless batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", - "@selectionBatchConvertSuccess": { - "description": "Snackbar after batch conversion completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "downloadedAlbumDownloadedCount": "{count} downloaded", - "@downloadedAlbumDownloadedCount": { - "description": "Downloaded tracks count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", - "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { - "description": "Subtitle when album artist is used for folder names" - }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", - "@downloadUseAlbumArtistForFoldersTrackSubtitle": { - "description": "Subtitle when track artist is used for folder names" - }, - "lyricsProvidersTitle": "Lyrics Provider Priority", - "@lyricsProvidersTitle": { - "description": "Settings item title for lyrics provider order" - }, - "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", - "@lyricsProvidersDescription": { - "description": "Description on the lyrics provider priority page" - }, - "lyricsProvidersInfoText": "Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.", - "@lyricsProvidersInfoText": { - "description": "Info tip on lyrics provider priority page" - }, - "lyricsProvidersEnabledSection": "Enabled ({count})", - "@lyricsProvidersEnabledSection": { - "description": "Section header for enabled providers", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "lyricsProvidersDisabledSection": "Disabled ({count})", - "@lyricsProvidersDisabledSection": { - "description": "Section header for disabled providers", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", - "@lyricsProvidersAtLeastOne": { - "description": "Snackbar when user tries to disable the last enabled provider" - }, - "lyricsProvidersSaved": "Lyrics provider priority saved", - "@lyricsProvidersSaved": { - "description": "Snackbar after saving lyrics provider priority" - }, - "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", - "@lyricsProvidersDiscardContent": { - "description": "Body text of the discard-changes dialog on lyrics provider page" - }, - "lyricsProviderLrclibDesc": "Open-source synced lyrics database", - "@lyricsProviderLrclibDesc": { - "description": "Description for LRCLIB provider" - }, - "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", - "@lyricsProviderNeteaseDesc": { - "description": "Description for Netease provider" - }, - "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", - "@lyricsProviderMusixmatchDesc": { - "description": "Description for Musixmatch provider" - }, - "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", - "@lyricsProviderAppleMusicDesc": { - "description": "Description for Apple Music provider" - }, - "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", - "@lyricsProviderQqMusicDesc": { - "description": "Description for QQ Music provider" - }, - "lyricsProviderLyricsPlusDesc": "Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)", - "@lyricsProviderLyricsPlusDesc": { - "description": "Description for LyricsPlus provider" - }, - "lyricsProviderExtensionDesc": "Extension provider", - "@lyricsProviderExtensionDesc": { - "description": "Generic description for extension-based lyrics providers" - }, - "safMigrationTitle": "Storage Update Required", - "@safMigrationTitle": { - "description": "Title of SAF migration dialog" - }, - "safMigrationMessage1": "SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.", - "@safMigrationMessage1": { - "description": "First paragraph of SAF migration dialog" - }, - "safMigrationMessage2": "Please select your download folder again to switch to the new storage system.", - "@safMigrationMessage2": { - "description": "Second paragraph of SAF migration dialog" - }, - "safMigrationSuccess": "Download folder updated to SAF mode", - "@safMigrationSuccess": { - "description": "Snackbar after successfully migrating to SAF" - }, - "settingsDonate": "Support Development", - "@settingsDonate": { - "description": "Settings menu item - donate page" - }, - "settingsDonateSubtitle": "Buy the developer a coffee", - "@settingsDonateSubtitle": { - "description": "Subtitle for donate menu item" - }, - "settingsBackup": "Backup & Restore", - "@settingsBackup": { - "description": "Settings menu item - backup and restore page" - }, - "settingsBackupSubtitle": "Move your library, history and settings to a new device", - "@settingsBackupSubtitle": { - "description": "Subtitle for backup and restore settings item" - }, - "backupTitle": "Backup & Restore", - "@backupTitle": { - "description": "App bar title for the backup and restore page" - }, - "backupExportSectionTitle": "Create backup", - "@backupExportSectionTitle": { - "description": "Section title for the export/backup card" - }, - "backupExportSectionDescription": "Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.", - "@backupExportSectionDescription": { - "description": "Description of what a backup contains" - }, - "backupExportButton": "Create backup file", - "@backupExportButton": { - "description": "Button to create and share a backup file" - }, - "backupImportSectionTitle": "Restore backup", - "@backupImportSectionTitle": { - "description": "Section title for the import/restore card" - }, - "backupImportSectionDescription": "Pick a backup file to restore your data. This replaces the current settings, history and library on this device.", - "@backupImportSectionDescription": { - "description": "Description for the restore action" - }, - "backupImportButton": "Choose backup file", - "@backupImportButton": { - "description": "Button to pick a backup file to restore" - }, - "backupCreated": "Backup created", - "@backupCreated": { - "description": "Snackbar after a backup file is created" - }, - "backupCreateFailed": "Failed to create backup", - "@backupCreateFailed": { - "description": "Snackbar when backup creation fails" - }, - "backupRestoreConfirmTitle": "Restore this backup?", - "@backupRestoreConfirmTitle": { - "description": "Confirmation dialog title before restoring a backup" - }, - "backupRestoreConfirmMessage": "This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.", - "@backupRestoreConfirmMessage": { - "description": "Confirmation dialog message before restoring a backup" - }, - "backupRestoreConfirmButton": "Restore", - "@backupRestoreConfirmButton": { - "description": "Confirm button to proceed with restore" - }, - "backupRestored": "Backup restored successfully", - "@backupRestored": { - "description": "Snackbar after a successful restore" - }, - "backupRestoreFailed": "Failed to restore backup", - "@backupRestoreFailed": { - "description": "Snackbar when restore fails" - }, - "backupInvalidFile": "This file is not a valid SpotiFLAC backup", - "@backupInvalidFile": { - "description": "Snackbar when the chosen file is not a valid backup" - }, - "backupRestoreRestartHint": "Restart the app to make sure every change is applied.", - "@backupRestoreRestartHint": { - "description": "Hint shown after restoring that an app restart is recommended" - }, - "backupContentsTitle": "Backup contents", - "@backupContentsTitle": { - "description": "Header above the list summarizing what the backup contains" - }, - "backupContentsSettings": "App settings", - "@backupContentsSettings": { - "description": "Backup contents row label for settings" - }, - "backupContentsHistory": "{count} history {count, plural, =1{item} other{items}}", - "@backupContentsHistory": { - "description": "Backup contents row for history count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsLiked": "{count} liked {count, plural, =1{track} other{tracks}}", - "@backupContentsLiked": { - "description": "Backup contents row for liked tracks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsWishlist": "{count} wishlist {count, plural, =1{track} other{tracks}}", - "@backupContentsWishlist": { - "description": "Backup contents row for wishlist tracks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsPlaylists": "{count, plural, =1{1 playlist} other{{count} playlists}}", - "@backupContentsPlaylists": { - "description": "Backup contents row for playlist count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsArtists": "{count, plural, =1{1 favorite artist} other{{count} favorite artists}}", - "@backupContentsArtists": { - "description": "Backup contents row for favorite artists count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsExtensions": "{count, plural, =1{1 extension} other{{count} extensions}}", - "@backupContentsExtensions": { - "description": "Backup contents row for installed extensions count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupIncludeSecrets": "Include extension credentials", - "@backupIncludeSecrets": { - "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" - }, - "backupIncludeSecretsDescription": "Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.", - "@backupIncludeSecretsDescription": { - "description": "Explanation for the include-credentials toggle" - }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", - "@backupExtensionsRestoreFailed": { - "description": "Snackbar/hint when some extensions failed to reinstall during restore", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tooltipLoveAll": "Love All", - "@tooltipLoveAll": { - "description": "Tooltip for the Love All button on album/playlist screens" - }, - "tooltipAddToPlaylist": "Add to Playlist", - "@tooltipAddToPlaylist": { - "description": "Tooltip for the Add to Playlist button" - }, - "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", - "@snackbarRemovedTracksFromLoved": { - "description": "Snackbar after removing multiple tracks from Loved folder", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", - "@snackbarAddedTracksToLoved": { - "description": "Snackbar after adding multiple tracks to Loved folder", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogDownloadAllTitle": "Download All", - "@dialogDownloadAllTitle": { - "description": "Dialog title for bulk download confirmation" - }, - "dialogDownloadAllMessage": "Download {count} tracks?", - "@dialogDownloadAllMessage": { - "description": "Body of the Download All confirmation dialog", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "homeSkipAlreadyDownloaded": "Skip already downloaded songs", - "@homeSkipAlreadyDownloaded": { - "description": "Checkbox label in import dialog to skip already-downloaded songs" - }, - "homeGoToAlbum": "Go to Album", - "@homeGoToAlbum": { - "description": "Context menu item to navigate to the album page" - }, - "homeAlbumInfoUnavailable": "Album info not available", - "@homeAlbumInfoUnavailable": { - "description": "Snackbar when album info cannot be loaded" - }, - "snackbarLoadingCueSheet": "Loading CUE sheet...", - "@snackbarLoadingCueSheet": { - "description": "Snackbar while loading a CUE sheet file" - }, - "snackbarMetadataSaved": "Metadata saved successfully", - "@snackbarMetadataSaved": { - "description": "Snackbar after successfully saving track metadata" - }, - "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", - "@snackbarFailedToEmbedLyrics": { - "description": "Snackbar when lyrics embedding fails" - }, - "snackbarFailedToWriteStorage": "Failed to write back to storage", - "@snackbarFailedToWriteStorage": { - "description": "Snackbar when writing metadata back to file fails" - }, - "snackbarError": "Error: {error}", - "@snackbarError": { - "description": "Generic error snackbar with error detail", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "snackbarNoActionDefined": "No action defined for this button", - "@snackbarNoActionDefined": { - "description": "Snackbar when an extension button has no action configured" - }, - "noTracksFoundForAlbum": "No tracks found for this album", - "@noTracksFoundForAlbum": { - "description": "Empty state message when an album has no tracks" - }, - "downloadLocationSubtitle": "Choose where to save your downloaded tracks", - "@downloadLocationSubtitle": { - "description": "Subtitle shown in the download location picker sheet" - }, - "storageModeAppFolder": "App Folder (Recommended)", - "@storageModeAppFolder": { - "description": "Storage mode option - app-managed folder" - }, - "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", - "@storageModeAppFolderSubtitle": { - "description": "Subtitle for app folder storage mode" - }, - "storageModeSaf": "Custom Folder (SAF)", - "@storageModeSaf": { - "description": "Storage mode option - Storage Access Framework" - }, - "storageModeSafSubtitle": "Pick any folder, including SD card", - "@storageModeSafSubtitle": { - "description": "Subtitle for SAF storage mode" - }, - "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", - "@downloadFilenameDescription": { - "description": "Description shown in filename format editor" - }, - "downloadFilenameInsertTag": "Tap to insert tag:", - "@downloadFilenameInsertTag": { - "description": "Label above filename tag chips" - }, - "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", - "@downloadSeparateSinglesEnabled": { - "description": "Subtitle when separate singles folder is on" - }, - "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", - "@downloadSeparateSinglesDisabled": { - "description": "Subtitle when separate singles folder is off" - }, - "downloadArtistNameFilters": "Artist Name Filters", - "@downloadArtistNameFilters": { - "description": "Setting title for artist folder filter options" - }, - "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", - "@downloadCreatePlaylistSourceFolder": { - "description": "Setting to create a subfolder per playlist source" - }, - "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", - "@downloadCreatePlaylistSourceFolderEnabled": { - "description": "Subtitle when playlist folder is enabled" - }, - "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", - "@downloadCreatePlaylistSourceFolderDisabled": { - "description": "Subtitle when playlist folder is disabled" - }, - "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", - "@downloadCreatePlaylistSourceFolderRedundant": { - "description": "Subtitle when folder organization is already set to playlist" - }, - "downloadSongLinkRegion": "SongLink Region", - "@downloadSongLinkRegion": { - "description": "Setting for SongLink region used during fallback resolution" - }, - "downloadNetworkCompatibilityMode": "Network Compatibility Mode", - "@downloadNetworkCompatibilityMode": { - "description": "Setting for legacy TLS/network handling" - }, - "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", - "@downloadNetworkCompatibilityModeEnabled": { - "description": "Subtitle when network compatibility mode is on" - }, - "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", - "@downloadNetworkCompatibilityModeDisabled": { - "description": "Subtitle when network compatibility mode is off" - }, - "downloadAllowLocalNetwork": "Allow Local Network Access", - "@downloadAllowLocalNetwork": { - "description": "Setting title for allowing requests to private/local network targets" - }, - "downloadAllowLocalNetworkEnabled": "Requests to local/private addresses are allowed (for local proxy or custom DNS)", - "@downloadAllowLocalNetworkEnabled": { - "description": "Subtitle when allow local network access is on" - }, - "downloadAllowLocalNetworkDisabled": "Local/private addresses are blocked for security", - "@downloadAllowLocalNetworkDisabled": { - "description": "Subtitle when allow local network access is off" - }, - "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", - "@downloadSelectServiceToEnable": { - "description": "Subtitle when quality picker is disabled due to extension service" - }, - "downloadEmbedLyricsDisabled": "Enable metadata embedding first", - "@downloadEmbedLyricsDisabled": { - "description": "Subtitle when lyrics embedding is blocked by metadata toggle" - }, - "downloadNeteaseIncludeTranslation": "Netease: Include Translation", - "@downloadNeteaseIncludeTranslation": { - "description": "Setting to include translated lyrics from Netease" - }, - "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", - "@downloadNeteaseIncludeTranslationEnabled": { - "description": "Subtitle when Netease translation is on" - }, - "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", - "@downloadNeteaseIncludeTranslationDisabled": { - "description": "Subtitle when Netease translation is off" - }, - "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", - "@downloadNeteaseIncludeRomanization": { - "description": "Setting to include romanized lyrics from Netease" - }, - "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", - "@downloadNeteaseIncludeRomanizationEnabled": { - "description": "Subtitle when Netease romanization is on" - }, - "downloadNeteaseIncludeRomanizationDisabled": "No romanization", - "@downloadNeteaseIncludeRomanizationDisabled": { - "description": "Subtitle when Netease romanization is off" - }, - "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", - "@downloadAppleQqMultiPerson": { - "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" - }, - "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", - "@downloadAppleQqMultiPersonEnabled": { - "description": "Subtitle when multi-person lyrics is on" - }, - "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", - "@downloadAppleQqMultiPersonDisabled": { - "description": "Subtitle when multi-person lyrics is off" - }, - "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", - "@downloadAppleElrcWordSync": { - "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" - }, - "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", - "@downloadAppleElrcWordSyncEnabled": { - "description": "Subtitle when Apple Music eLRC word sync is enabled" - }, - "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", - "@downloadAppleElrcWordSyncDisabled": { - "description": "Subtitle when Apple Music eLRC word sync is disabled" - }, - "downloadMusixmatchLanguage": "Musixmatch Language", - "@downloadMusixmatchLanguage": { - "description": "Setting for Musixmatch lyrics translation language" - }, - "downloadMusixmatchLanguageAuto": "Auto (original language)", - "@downloadMusixmatchLanguageAuto": { - "description": "Subtitle when no language is set" - }, - "downloadFilterContributing": "Filter Contributing Artists", - "@downloadFilterContributing": { - "description": "Setting to strip contributing artists from Album Artist folder name" - }, - "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", - "@downloadFilterContributingEnabled": { - "description": "Subtitle when contributing artist filter is on" - }, - "downloadFilterContributingDisabled": "Full Album Artist string used", - "@downloadFilterContributingDisabled": { - "description": "Subtitle when contributing artist filter is off" - }, - "downloadProvidersNoneEnabled": "No providers enabled", - "@downloadProvidersNoneEnabled": { - "description": "Shown when no lyrics providers are active" - }, - "downloadMusixmatchLanguageCode": "Language code", - "@downloadMusixmatchLanguageCode": { - "description": "Label for Musixmatch language input field" - }, - "downloadMusixmatchLanguageHint": "e.g. en, de, ja", - "@downloadMusixmatchLanguageHint": { - "description": "Placeholder for Musixmatch language input" - }, - "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", - "@downloadMusixmatchLanguageDesc": { - "description": "Description in Musixmatch language picker" - }, - "downloadMusixmatchAuto": "Auto", - "@downloadMusixmatchAuto": { - "description": "Button to clear Musixmatch language (use auto)" - }, - "downloadNetworkAnySubtitle": "Use WiFi or mobile data", - "@downloadNetworkAnySubtitle": { - "description": "Subtitle for any-network option in picker" - }, - "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", - "@downloadNetworkWifiOnlySubtitle": { - "description": "Subtitle for WiFi-only option in picker" - }, - "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", - "@downloadSongLinkRegionDesc": { - "description": "Description in SongLink region picker" - }, - "snackbarUnsupportedAudioFormat": "Unsupported audio format", - "@snackbarUnsupportedAudioFormat": { - "description": "Snackbar when the audio format is not supported for the requested operation" - }, - "cacheRefresh": "Refresh", - "@cacheRefresh": { - "description": "Tooltip for refresh button on cache management page" - }, - "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", - "@dialogDownloadPlaylistsMessage": { - "description": "Dialog message for bulk playlist download confirmation", - "placeholders": { - "trackCount": { - "type": "int" - }, - "playlistCount": { - "type": "int" - } - } - }, - "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", - "@bulkDownloadPlaylistsButton": { - "description": "Button label for bulk downloading selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "bulkDownloadSelectPlaylists": "Select playlists to download", - "@bulkDownloadSelectPlaylists": { - "description": "Button label when no playlists are selected for download" - }, - "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", - "@snackbarSelectedPlaylistsEmpty": { - "description": "Snackbar when selected playlists contain no tracks" - }, - "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", - "@playlistsCount": { - "description": "Playlist count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "editMetadataAutoFill": "Auto-fill from online", - "@editMetadataAutoFill": { - "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" - }, - "editMetadataAutoFillDesc": "Select fields to fill automatically from online metadata", - "@editMetadataAutoFillDesc": { - "description": "Description for the auto-fill section" - }, - "editMetadataAutoFillFetch": "Fetch & Fill", - "@editMetadataAutoFillFetch": { - "description": "Button label to fetch online metadata and fill selected fields" - }, - "editMetadataAutoFillSearching": "Searching online...", - "@editMetadataAutoFillSearching": { - "description": "Snackbar shown while searching for online metadata" - }, - "editMetadataAutoFillNoResults": "No matching metadata found online", - "@editMetadataAutoFillNoResults": { - "description": "Snackbar when online metadata search returns no results" - }, - "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", - "@editMetadataAutoFillDone": { - "description": "Snackbar confirming how many fields were auto-filled", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", - "@editMetadataAutoFillNoneSelected": { - "description": "Snackbar when user taps Fetch without selecting any fields" - }, - "editMetadataFieldTitle": "Title", - "@editMetadataFieldTitle": { - "description": "Chip label for title field in auto-fill selector" - }, - "editMetadataFieldArtist": "Artist", - "@editMetadataFieldArtist": { - "description": "Chip label for artist field in auto-fill selector" - }, - "editMetadataFieldAlbum": "Album", - "@editMetadataFieldAlbum": { - "description": "Chip label for album field in auto-fill selector" - }, - "editMetadataFieldAlbumArtist": "Album Artist", - "@editMetadataFieldAlbumArtist": { - "description": "Chip label for album artist field in auto-fill selector" - }, - "editMetadataFieldDate": "Date", - "@editMetadataFieldDate": { - "description": "Chip label for date field in auto-fill selector" - }, - "editMetadataFieldTrackNum": "Track #", - "@editMetadataFieldTrackNum": { - "description": "Chip label for track number field in auto-fill selector" - }, - "editMetadataFieldDiscNum": "Disc #", - "@editMetadataFieldDiscNum": { - "description": "Chip label for disc number field in auto-fill selector" - }, - "editMetadataFieldGenre": "Genre", - "@editMetadataFieldGenre": { - "description": "Chip label for genre field in auto-fill selector" - }, - "editMetadataFieldIsrc": "ISRC", - "@editMetadataFieldIsrc": { - "description": "Chip label for ISRC field in auto-fill selector" - }, - "editMetadataFieldLabel": "Label", - "@editMetadataFieldLabel": { - "description": "Chip label for label field in auto-fill selector" - }, - "editMetadataFieldCopyright": "Copyright", - "@editMetadataFieldCopyright": { - "description": "Chip label for copyright field in auto-fill selector" - }, - "editMetadataFieldCover": "Cover Art", - "@editMetadataFieldCover": { - "description": "Chip label for cover art field in auto-fill selector" - }, - "editMetadataSelectAll": "All", - "@editMetadataSelectAll": { - "description": "Button to select all fields for auto-fill" - }, - "editMetadataSelectEmpty": "Empty only", - "@editMetadataSelectEmpty": { - "description": "Button to select only fields that are currently empty" - }, - "queueDownloadingCount": "Downloading ({count})", - "@queueDownloadingCount": { - "description": "Header for active downloads section with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueFilteringIndicator": "Filtering...", - "@queueFilteringIndicator": { - "description": "Shown while filter results are being computed" - }, - "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", - "@queueTrackCount": { - "description": "Track count label with plural support", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueAlbumCount": "{count, plural, =1{1 album} other{{count} albums}}", - "@queueAlbumCount": { - "description": "Album count label with plural support", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueEmptyAlbums": "No album downloads", - "@queueEmptyAlbums": { - "description": "Empty state title when no album downloads exist" - }, - "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", - "@queueEmptyAlbumsSubtitle": { - "description": "Empty state subtitle for album downloads" - }, - "queueEmptySingles": "No single downloads", - "@queueEmptySingles": { - "description": "Empty state title when no single track downloads exist" - }, - "queueEmptySinglesSubtitle": "Single track downloads will appear here", - "@queueEmptySinglesSubtitle": { - "description": "Empty state subtitle for single track downloads" - }, - "queueEmptyHistory": "No download history", - "@queueEmptyHistory": { - "description": "Empty state title when download history is empty" - }, - "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", - "@queueEmptyHistorySubtitle": { - "description": "Empty state subtitle for download history" - }, - "selectionAllPlaylistsSelected": "All playlists selected", - "@selectionAllPlaylistsSelected": { - "description": "Shown when all playlists are selected in selection mode" - }, - "selectionTapPlaylistsToSelect": "Tap playlists to select", - "@selectionTapPlaylistsToSelect": { - "description": "Hint shown in playlist selection mode" - }, - "selectionSelectPlaylistsToDelete": "Select playlists to delete", - "@selectionSelectPlaylistsToDelete": { - "description": "Hint shown when no playlists are selected for deletion" - }, - "audioAnalysisTitle": "Audio Quality Analysis", - "@audioAnalysisTitle": { - "description": "Title for audio analysis section" - }, - "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", - "@audioAnalysisDescription": { - "description": "Description for audio analysis tap-to-analyze prompt" - }, - "audioAnalysisAnalyzing": "Analyzing audio...", - "@audioAnalysisAnalyzing": { - "description": "Loading text while analyzing audio" - }, - "audioAnalysisSampleRate": "Sample Rate", - "@audioAnalysisSampleRate": { - "description": "Sample rate metric label" - }, - "audioAnalysisCodec": "Codec", - "@audioAnalysisCodec": { - "description": "Audio codec metric label" - }, - "audioAnalysisContainer": "Container", - "@audioAnalysisContainer": { - "description": "Audio container metric label" - }, - "audioAnalysisDecodedFormat": "Decoded Format", - "@audioAnalysisDecodedFormat": { - "description": "Decoded sample format metric label" - }, - "audioAnalysisBitDepth": "Bit Depth", - "@audioAnalysisBitDepth": { - "description": "Bit depth metric label" - }, - "audioAnalysisChannels": "Channels", - "@audioAnalysisChannels": { - "description": "Channels metric label" - }, - "audioAnalysisDuration": "Duration", - "@audioAnalysisDuration": { - "description": "Duration metric label" - }, - "audioAnalysisNyquist": "Nyquist", - "@audioAnalysisNyquist": { - "description": "Nyquist frequency metric label" - }, - "audioAnalysisFileSize": "Size", - "@audioAnalysisFileSize": { - "description": "File size metric label" - }, - "audioAnalysisDynamicRange": "Dynamic Range", - "@audioAnalysisDynamicRange": { - "description": "Dynamic range metric label" - }, - "audioAnalysisPeak": "Peak", - "@audioAnalysisPeak": { - "description": "Peak amplitude metric label" - }, - "audioAnalysisRms": "RMS", - "@audioAnalysisRms": { - "description": "RMS level metric label" - }, - "audioAnalysisLufs": "LUFS", - "@audioAnalysisLufs": { - "description": "Integrated loudness metric label" - }, - "audioAnalysisTruePeak": "True Peak", - "@audioAnalysisTruePeak": { - "description": "True peak metric label" - }, - "audioAnalysisClipping": "Clipping", - "@audioAnalysisClipping": { - "description": "Clipping metric label" - }, - "audioAnalysisNoClipping": "No clipping", - "@audioAnalysisNoClipping": { - "description": "Displayed when no clipped samples were detected" - }, - "audioAnalysisSpectralCutoff": "Spectral Cutoff", - "@audioAnalysisSpectralCutoff": { - "description": "Estimated spectral cutoff metric label" - }, - "audioAnalysisChannelStats": "Per-channel Stats", - "@audioAnalysisChannelStats": { - "description": "Per-channel audio analysis section label" - }, - "audioAnalysisSamples": "Samples", - "@audioAnalysisSamples": { - "description": "Total samples metric label" - }, - "audioAnalysisRescan": "Re-analyze", - "@audioAnalysisRescan": { - "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" - }, - "audioAnalysisRescanning": "Re-analyzing audio...", - "@audioAnalysisRescanning": { - "description": "Loading text while audio is being re-analyzed after an explicit refresh" - }, - "extensionsHomeFeedProvider": "Home Feed Provider", - "@extensionsHomeFeedProvider": { - "description": "Extensions page - label for home feed provider selector" - }, - "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", - "@extensionsHomeFeedDescription": { - "description": "Extensions page - description for home feed provider picker" - }, - "extensionsHomeFeedAuto": "Auto", - "@extensionsHomeFeedAuto": { - "description": "Label for auto-selected search provider" - }, - "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", - "@extensionsHomeFeedAutoSubtitle": { - "description": "Extensions page - subtitle for auto home feed option" - }, - "extensionsHomeFeedOff": "Off", - "@extensionsHomeFeedOff": { - "description": "Extensions page - home feed provider option: off" - }, - "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", - "@extensionsHomeFeedOffSubtitle": { - "description": "Extensions page - subtitle for off home feed option" - }, - "extensionsHomeFeedUse": "Use {extensionName} home feed", - "@extensionsHomeFeedUse": { - "description": "Extensions page - subtitle for a specific extension home feed option", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "extensionsNoHomeFeedExtensions": "No extensions with home feed", - "@extensionsNoHomeFeedExtensions": { - "description": "Extensions page - shown when no installed extension has home feed" - }, - "cancelDownloadTitle": "Cancel download?", - "@cancelDownloadTitle": { - "description": "Dialog title when confirming cancellation of an active download" - }, - "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", - "@cancelDownloadContent": { - "description": "Dialog body when confirming cancellation of an active download", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "cancelDownloadKeep": "Keep", - "@cancelDownloadKeep": { - "description": "Dialog button - keep the active download (do not cancel)" - }, - "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", - "@metadataSaveFailedFfmpeg": { - "description": "Snackbar error when FFmpeg fails to write metadata" - }, - "metadataSaveFailedStorage": "Failed to write metadata back to storage", - "@metadataSaveFailedStorage": { - "description": "Snackbar error when writing metadata file back to storage fails" - }, - "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", - "@snackbarFolderPickerFailed": { - "description": "Snackbar shown when folder picker fails to open", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "notifDownloadingTrack": "Downloading {trackName}", - "@notifDownloadingTrack": { - "description": "Notification title while downloading a track", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "notifFinalizingTrack": "Finalizing {trackName}", - "@notifFinalizingTrack": { - "description": "Notification title while finalizing (embedding metadata) a track", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "notifEmbeddingMetadata": "Embedding metadata...", - "@notifEmbeddingMetadata": { - "description": "Notification body while embedding metadata into a downloaded track" - }, - "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", - "@notifAlreadyInLibraryCount": { - "description": "Notification title when track is already in library, with count", - "placeholders": { - "completed": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "notifAlreadyInLibrary": "Already in Library", - "@notifAlreadyInLibrary": { - "description": "Notification title when track is already in library" - }, - "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", - "@notifDownloadCompleteCount": { - "description": "Notification title when download is complete, with count", - "placeholders": { - "completed": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "notifDownloadComplete": "Download Complete", - "@notifDownloadComplete": { - "description": "Notification title when a single download is complete" - }, - "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", - "@notifDownloadsFinished": { - "description": "Notification title when queue finishes with some failures", - "placeholders": { - "completed": { - "type": "int" - }, - "failed": { - "type": "int" - } - } - }, - "notifAllDownloadsComplete": "All Downloads Complete", - "@notifAllDownloadsComplete": { - "description": "Notification title when all downloads finish successfully" - }, - "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", - "@notifTracksDownloadedSuccess": { - "description": "Notification body for queue complete - how many tracks were downloaded", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", - "@notifDownloadsFinishedBody": { - "description": "Notification body when queue finishes with failures", - "placeholders": { - "completed": { - "type": "int" - }, - "failed": { - "type": "int" - } - } - }, - "notifDownloadsCanceledTitle": "Downloads canceled", - "@notifDownloadsCanceledTitle": { - "description": "Notification title when downloads are canceled by the user" - }, - "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", - "@notifDownloadsCanceledBody": { - "description": "Notification body when downloads are canceled by the user", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifScanningLibrary": "Scanning local library", - "@notifScanningLibrary": { - "description": "Notification title while scanning local library" - }, - "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", - "@notifLibraryScanProgressWithTotal": { - "description": "Notification body for library scan progress when total is known", - "placeholders": { - "scanned": { - "type": "int" - }, - "total": { - "type": "int" - }, - "percentage": { - "type": "int" - } - } - }, - "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", - "@notifLibraryScanProgressNoTotal": { - "description": "Notification body for library scan progress when total is unknown", - "placeholders": { - "scanned": { - "type": "int" - }, - "percentage": { - "type": "int" - } - } - }, - "notifLibraryScanComplete": "Library scan complete", - "@notifLibraryScanComplete": { - "description": "Notification title when library scan finishes" - }, - "notifLibraryScanCompleteBody": "{count} tracks indexed", - "@notifLibraryScanCompleteBody": { - "description": "Notification body for library scan complete - number of indexed tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanExcluded": "{count} excluded", - "@notifLibraryScanExcluded": { - "description": "Library scan complete suffix - excluded track count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanErrors": "{count} errors", - "@notifLibraryScanErrors": { - "description": "Library scan complete suffix - error count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanFailed": "Library scan failed", - "@notifLibraryScanFailed": { - "description": "Notification title when library scan fails" - }, - "notifLibraryScanCancelled": "Library scan cancelled", - "@notifLibraryScanCancelled": { - "description": "Notification title when library scan is cancelled by the user" - }, - "notifLibraryScanStopped": "Scan stopped before completion.", - "@notifLibraryScanStopped": { - "description": "Notification body when library scan is cancelled" - }, - "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", - "@notifDownloadingUpdate": { - "description": "Notification title while downloading an app update", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "notifUpdateProgress": "{received} / {total} MB • {percentage}%", - "@notifUpdateProgress": { - "description": "Notification body showing update download progress", - "placeholders": { - "received": { - "type": "String" - }, - "total": { - "type": "String" - }, - "percentage": { - "type": "int" - } - } - }, - "notifUpdateReady": "Update Ready", - "@notifUpdateReady": { - "description": "Notification title when app update download is complete" - }, - "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", - "@notifUpdateReadyBody": { - "description": "Notification body when app update is ready to install", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "notifUpdateFailed": "Update Failed", - "@notifUpdateFailed": { - "description": "Notification title when app update download fails" - }, - "notifUpdateFailedBody": "Could not download update. Try again later.", - "@notifUpdateFailedBody": { - "description": "Notification body when app update download fails" - }, - "searchTracks": "Tracks", - "@searchTracks": { - "description": "Search filter label - tracks" - }, - "homeSearchHintDefault": "Paste supported URL or search...", - "@homeSearchHintDefault": { - "description": "Default placeholder for the main search field on Home" - }, - "homeSearchHintProvider": "Search with {providerName}...", - "@homeSearchHintProvider": { - "description": "Placeholder for the main search field when a provider is selected", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, - "homeImportCsvTooltip": "Import CSV", - "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" - }, - "homeChangeSearchProviderTooltip": "Change search provider", - "@homeChangeSearchProviderTooltip": { - "description": "Tooltip for the Home search provider picker" - }, - "actionPaste": "Paste", - "@actionPaste": { - "description": "Generic action - paste from clipboard" - }, - "tutorialSearchHint": "Paste or search...", - "@tutorialSearchHint": { - "description": "Placeholder shown in the tutorial search demo" - }, - "tutorialDownloadCompletedSemantics": "Download completed", - "@tutorialDownloadCompletedSemantics": { - "description": "Accessibility label for completed download state in tutorial demo" - }, - "tutorialDownloadInProgressSemantics": "Download in progress", - "@tutorialDownloadInProgressSemantics": { - "description": "Accessibility label for active download state in tutorial demo" - }, - "tutorialStartDownloadSemantics": "Start download", - "@tutorialStartDownloadSemantics": { - "description": "Accessibility label for idle download button in tutorial demo" - }, - "optionsEmbedMetadata": "Embed Metadata", - "@optionsEmbedMetadata": { - "description": "Settings toggle title for writing metadata into downloaded files" - }, - "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", - "@optionsEmbedMetadataSubtitleOn": { - "description": "Subtitle when metadata embedding is enabled" - }, - "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", - "@optionsEmbedMetadataSubtitleOff": { - "description": "Subtitle when metadata embedding is disabled" - }, - "trackCoverNoEmbeddedArt": "No embedded album art found", - "@trackCoverNoEmbeddedArt": { - "description": "Message shown when a track file has no embedded cover art" - }, - "trackCoverReplace": "Replace Cover", - "@trackCoverReplace": { - "description": "Button label for replacing selected cover art" - }, - "trackCoverPick": "Pick Cover", - "@trackCoverPick": { - "description": "Button label for selecting cover art" - }, - "trackCoverClearSelected": "Clear selected cover", - "@trackCoverClearSelected": { - "description": "Tooltip for clearing the newly selected cover art" - }, - "trackCoverCurrent": "Current cover", - "@trackCoverCurrent": { - "description": "Label for the currently embedded cover preview" - }, - "trackCoverSelected": "Selected cover", - "@trackCoverSelected": { - "description": "Label for the newly selected cover preview" - }, - "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", - "@trackCoverReplaceNotice": { - "description": "Notice shown when a new cover has been selected but not saved yet" - }, - "actionStop": "Stop", - "@actionStop": { - "description": "Generic action - stop" - }, - "queueFinalizingDownload": "Finalizing download", - "@queueFinalizingDownload": { - "description": "Accessibility label for a queue item that is finalizing" - }, - "queueDownloadedFileMissing": "Downloaded file missing", - "@queueDownloadedFileMissing": { - "description": "Accessibility label when a downloaded file is missing from disk" - }, - "queueDownloadCompleted": "Download completed", - "@queueDownloadCompleted": { - "description": "Accessibility label for completed download state in queue" - }, - "queueRateLimitTitle": "Service rate limited", - "@queueRateLimitTitle": { - "description": "Title shown on a failed queue item when the download service rate limits requests" - }, - "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", - "@queueRateLimitMessage": { - "description": "Explanation shown on a failed queue item when the download service rate limits requests" - }, - "appearanceSelectAccentColor": "Select accent color {hex}", - "@appearanceSelectAccentColor": { - "description": "Accessibility label for picking an accent color", - "placeholders": { - "hex": { - "type": "String" - } - } - }, - "logAutoScrollOn": "Auto-scroll ON", - "@logAutoScrollOn": { - "description": "Tooltip when auto-scroll is enabled on the log screen" - }, - "logAutoScrollOff": "Auto-scroll OFF", - "@logAutoScrollOff": { - "description": "Tooltip when auto-scroll is disabled on the log screen" - }, - "logCopyLogs": "Copy logs", - "@logCopyLogs": { - "description": "Tooltip for copying logs" - }, - "logClearSearch": "Clear search", - "@logClearSearch": { - "description": "Tooltip for clearing the log search field" - }, - "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", - "@logIssueIspBlockingLabel": { - "description": "Diagnostic badge label when ISP blocking is detected" - }, - "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", - "@logIssueIspBlockingDescription": { - "description": "Diagnostic badge description for ISP blocking" - }, - "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", - "@logIssueIspBlockingSuggestion": { - "description": "Diagnostic badge suggestion for ISP blocking" - }, - "logIssueRateLimitedLabel": "RATE LIMITED", - "@logIssueRateLimitedLabel": { - "description": "Diagnostic badge label when the service rate limits requests" - }, - "logIssueRateLimitedDescription": "Too many requests to the service", - "@logIssueRateLimitedDescription": { - "description": "Diagnostic badge description for rate limiting" - }, - "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", - "@logIssueRateLimitedSuggestion": { - "description": "Diagnostic badge suggestion for rate limiting" - }, - "logIssueNetworkErrorLabel": "NETWORK ERROR", - "@logIssueNetworkErrorLabel": { - "description": "Diagnostic badge label for generic network errors" - }, - "logIssueNetworkErrorDescription": "Connection issues detected", - "@logIssueNetworkErrorDescription": { - "description": "Diagnostic badge description for generic network errors" - }, - "logIssueNetworkErrorSuggestion": "Check your internet connection", - "@logIssueNetworkErrorSuggestion": { - "description": "Diagnostic badge suggestion for generic network errors" - }, - "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", - "@logIssueTrackNotFoundLabel": { - "description": "Diagnostic badge label when a track is unavailable" - }, - "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", - "@logIssueTrackNotFoundDescription": { - "description": "Diagnostic badge description when a track is unavailable" - }, - "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", - "@logIssueTrackNotFoundSuggestion": { - "description": "Diagnostic badge suggestion when a track is unavailable" - }, - "clickableLookingUpArtist": "Looking up artist...", - "@clickableLookingUpArtist": { - "description": "Snackbar shown while clickable artist metadata is being resolved" - }, - "clickableInformationUnavailable": "{type} information not available", - "@clickableInformationUnavailable": { - "description": "Snackbar shown when clickable metadata cannot open a destination", - "placeholders": { - "type": { - "type": "String" - } - } - }, - "extensionDetailsTags": "Tags", - "@extensionDetailsTags": { - "description": "Section title for extension tags" - }, - "extensionDetailsInformation": "Information", - "@extensionDetailsInformation": { - "description": "Section title for extension metadata information" - }, - "extensionUtilityFunctions": "Utility Functions", - "@extensionUtilityFunctions": { - "description": "Capability label for utility-only extensions" - }, - "actionDismiss": "Dismiss", - "@actionDismiss": { - "description": "Generic action - dismiss" - }, - "setupChangeFolderTooltip": "Change folder", - "@setupChangeFolderTooltip": { - "description": "Tooltip for editing the selected download folder" - }, - "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", - "@a11yOpenTrackByArtist": { - "description": "Accessibility label for opening a track item", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "a11yOpenItem": "Open {itemType} {name}", - "@a11yOpenItem": { - "description": "Accessibility label for opening a generic item", - "placeholders": { - "itemType": { - "type": "String" - }, - "name": { - "type": "String" - } - } - }, - "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", - "@a11yOpenItemCount": { - "description": "Accessibility label for opening a grouped item with count", - "placeholders": { - "title": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", - "@a11yOpenAlbumByArtistTrackCount": { - "description": "Accessibility label for opening an album item with track count", - "placeholders": { - "albumName": { - "type": "String" - }, - "artistName": { - "type": "String" - }, - "trackCount": { - "type": "int" - } - } - }, - "a11yTrackByArtist": "{trackName} by {artistName}", - "@a11yTrackByArtist": { - "description": "Accessibility label for a queue or list track item", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "a11ySelectAlbum": "Select album {albumName}", - "@a11ySelectAlbum": { - "description": "Accessibility label for selecting an album", - "placeholders": { - "albumName": { - "type": "String" - } - } - }, - "a11yOpenAlbum": "Open album {albumName}", - "@a11yOpenAlbum": { - "description": "Accessibility label for opening an album", - "placeholders": { - "albumName": { - "type": "String" - } - } - }, - "settingsFiles": "Files & Folders", - "@settingsFiles": { - "description": "Settings menu item - file and folder settings" - }, - "settingsFilesSubtitle": "Download location, filename, folder structure", - "@settingsFilesSubtitle": { - "description": "Subtitle for files & folders settings" - }, - "settingsMetadata": "Metadata", - "@settingsMetadata": { - "description": "Settings menu item - metadata settings" - }, - "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", - "@settingsMetadataSubtitle": { - "description": "Subtitle for metadata settings" - }, - "settingsLyrics": "Lyrics", - "@settingsLyrics": { - "description": "Settings menu item - lyrics settings" - }, - "settingsLyricsSubtitle": "Embed, mode, providers, language options", - "@settingsLyricsSubtitle": { - "description": "Subtitle for lyrics settings" - }, - "settingsApp": "App", - "@settingsApp": { - "description": "Settings menu item - app settings" - }, - "settingsAppSubtitle": "Updates, data, extension repo, debug", - "@settingsAppSubtitle": { - "description": "Subtitle for app settings" - }, - "sectionMetadataProviders": "Providers", - "@sectionMetadataProviders": { - "description": "Settings section header for metadata providers" - }, - "sectionDuplicates": "Duplicates", - "@sectionDuplicates": { - "description": "Settings section header for deduplication" - }, - "sectionLyricsProviderOptions": "Provider Options", - "@sectionLyricsProviderOptions": { - "description": "Settings section header for per-provider lyrics options" - }, - "metadataProvidersTitle": "Metadata Provider Priority", - "@metadataProvidersTitle": { - "description": "Settings item title for metadata provider order" - }, - "metadataProvidersSubtitle": "Drag to set search and metadata source order", - "@metadataProvidersSubtitle": { - "description": "Subtitle for metadata provider priority item" - }, - "downloadDeduplication": "Skip Duplicate Downloads", - "@downloadDeduplication": { - "description": "Setting - skip tracks already in download history" - }, - "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", - "@downloadDeduplicationEnabled": { - "description": "Subtitle when deduplication is on" - }, - "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", - "@downloadDeduplicationDisabled": { - "description": "Subtitle when deduplication is off" - }, - "downloadFallbackExtensions": "Fallback Extensions", - "@downloadFallbackExtensions": { - "description": "Settings item for configuring fallback extension providers" - }, - "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", - "@downloadFallbackExtensionsSubtitle": { - "description": "Subtitle for fallback extensions item" - }, - "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", - "@editMetadataFieldDateHint": { - "description": "Hint text for the edit metadata date field" - }, - "editMetadataFieldTrackTotal": "Track Total", - "@editMetadataFieldTrackTotal": { - "description": "Label for total tracks field in the edit metadata sheet" - }, - "editMetadataFieldDiscTotal": "Disc Total", - "@editMetadataFieldDiscTotal": { - "description": "Label for total discs field in the edit metadata sheet" - }, - "editMetadataFieldComposer": "Composer", - "@editMetadataFieldComposer": { - "description": "Label for composer field in the edit metadata sheet" - }, - "editMetadataFieldComment": "Comment", - "@editMetadataFieldComment": { - "description": "Label for comment field in the edit metadata sheet" - }, - "editMetadataAdvanced": "Advanced", - "@editMetadataAdvanced": { - "description": "Expandable section label for advanced metadata fields" - }, - "libraryFilterMetadataMissingTrackNumber": "Missing track number", - "@libraryFilterMetadataMissingTrackNumber": { - "description": "Filter option - items missing track number" - }, - "libraryFilterMetadataMissingDiscNumber": "Missing disc number", - "@libraryFilterMetadataMissingDiscNumber": { - "description": "Filter option - items missing disc number" - }, - "libraryFilterMetadataMissingArtist": "Missing artist", - "@libraryFilterMetadataMissingArtist": { - "description": "Filter option - items missing artist" - }, - "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", - "@libraryFilterMetadataIncorrectIsrcFormat": { - "description": "Filter option - items with an invalid ISRC format" - }, - "libraryFilterMetadataMissingLabel": "Missing label", - "@libraryFilterMetadataMissingLabel": { - "description": "Filter option - items missing record label" - }, - "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", - "@collectionDeletePlaylistsMessage": { - "description": "Confirmation message for deleting selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", - "@collectionPlaylistsDeleted": { - "description": "Snackbar after deleting selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", - "@collectionAddedTracksToPlaylist": { - "description": "Snackbar after adding multiple tracks to a playlist", - "placeholders": { - "count": { - "type": "int" - }, - "playlistName": { - "type": "String" - } - } - }, - "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", - "@collectionAddedTracksToPlaylistWithExisting": { - "description": "Snackbar after adding multiple tracks to a playlist when some were already present", - "placeholders": { - "count": { - "type": "int" - }, - "playlistName": { - "type": "String" - }, - "alreadyCount": { - "type": "int" - } - } - }, - "itemCount": "{count} {count, plural, =1{item} other{items}}", - "@itemCount": { - "description": "Generic item count label", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", - "@trackReEnrichSuccessWithFailures": { - "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", - "placeholders": { - "successCount": { - "type": "int" - }, - "total": { - "type": "int" - }, - "failedCount": { - "type": "int" - } - } - }, - "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", - "@selectionDeleteTracksCount": { - "description": "Button label for deleting selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", - "@queueDownloadSpeedStatus": { - "description": "Queue status while downloading with speed", - "placeholders": { - "speed": { - "type": "String" - } - } - }, - "queueDownloadStarting": "Starting...", - "@queueDownloadStarting": { - "description": "Queue status before download progress is available" - }, - "a11ySelectTrack": "Select track", - "@a11ySelectTrack": { - "description": "Accessibility label for selecting a track" - }, - "a11yDeselectTrack": "Deselect track", - "@a11yDeselectTrack": { - "description": "Accessibility label for deselecting a track" - }, - "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", - "@a11yPlayTrackByArtist": { - "description": "Accessibility label for playing a local library track", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", - "@storeExtensionsCount": { - "description": "Store extension result count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "storeRequiresVersion": "Requires v{version}+", - "@storeRequiresVersion": { - "description": "Store compatibility badge for minimum app version", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "actionGo": "Go", - "@actionGo": { - "description": "Generic action button label" - }, - "logIssueSummary": "Issue Summary", - "@logIssueSummary": { - "description": "Header for log issue analysis summary" - }, - "logTotalErrors": "Total errors: {count}", - "@logTotalErrors": { - "description": "Total error count in log issue analysis", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "logAffectedDomains": "Affected: {domains}", - "@logAffectedDomains": { - "description": "Affected domains in log issue analysis", - "placeholders": { - "domains": { - "type": "String" - } - } - }, - "libraryScanCancelled": "Scan cancelled", - "@libraryScanCancelled": { - "description": "Library scan status when a scan was cancelled" - }, - "libraryScanCancelledSubtitle": "You can retry the scan when ready.", - "@libraryScanCancelledSubtitle": { - "description": "Library scan status subtitle after cancellation" - }, - "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", - "@libraryDownloadsHistoryExcluded": { - "description": "Library count note for downloaded history items excluded from the local list", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadNativeWorker": "Native download worker", - "@downloadNativeWorker": { - "description": "Setting title for Android native download worker" - }, - "downloadNativeWorkerSubtitle": "Android-achtergrondservice voor extensiedownloads", - "@downloadNativeWorkerSubtitle": { - "description": "Setting subtitle for Android native download worker" - }, - "badgeBeta": "BETA", - "@badgeBeta": { - "description": "Badge label for beta features" - }, - "extensionServiceStatus": "Service Status", - "@extensionServiceStatus": { - "description": "Extension detail section header for service status" - }, - "extensionServiceHealth": "Service health", - "@extensionServiceHealth": { - "description": "Extension capability label for service health checks" - }, - "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", - "@extensionHealthChecksConfigured": { - "description": "Extension service health check count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", - "@extensionOauthConnectHint": { - "description": "Hint for an OAuth login link field before connecting Spotify" - }, - "extensionLastChecked": "Last checked {time}", - "@extensionLastChecked": { - "description": "Timestamp for the latest extension service health check", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "extensionRefreshStatus": "Refresh status", - "@extensionRefreshStatus": { - "description": "Tooltip for refreshing extension service health status" - }, - "extensionCustomUrlHandling": "Custom URL Handling", - "@extensionCustomUrlHandling": { - "description": "Extension detail section title for custom URL handling" - }, - "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", - "@extensionCustomUrlHandlingSubtitle": { - "description": "Extension detail subtitle for custom URL handling" - }, - "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", - "@extensionCustomUrlHandlingShareHint": { - "description": "Extension detail hint explaining share-to-app URL handling" - }, - "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", - "@extensionSettingsCount": { - "description": "Count of settings exposed by an extension quality option", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionHealthOnline": "Online", - "@extensionHealthOnline": { - "description": "Extension service health status - online" - }, - "extensionHealthDegraded": "Degraded", - "@extensionHealthDegraded": { - "description": "Extension service health status - degraded" - }, - "extensionHealthOffline": "Offline", - "@extensionHealthOffline": { - "description": "Extension service health status - offline" - }, - "extensionHealthNotConfigured": "Not configured", - "@extensionHealthNotConfigured": { - "description": "Extension service health status - not configured" - }, - "extensionHealthUnknown": "Unknown", - "@extensionHealthUnknown": { - "description": "Extension service health status - unknown" - }, - "extensionHealthRequired": "required", - "@extensionHealthRequired": { - "description": "Label for a required extension service health check" - }, - "extensionSettingNotSet": "Not set", - "@extensionSettingNotSet": { - "description": "Value shown when an extension setting has no value" - }, - "extensionActionFailed": "Action failed", - "@extensionActionFailed": { - "description": "Fallback error when an extension action fails without details" - }, - "extensionEnterValue": "Enter value", - "@extensionEnterValue": { - "description": "Hint for editing an extension setting value" - }, - "extensionHealthServiceOnline": "Service online", - "@extensionHealthServiceOnline": { - "description": "Tooltip for online extension service" - }, - "extensionHealthServiceDegraded": "Service degraded", - "@extensionHealthServiceDegraded": { - "description": "Tooltip for degraded extension service" - }, - "extensionHealthServiceOffline": "Service offline", - "@extensionHealthServiceOffline": { - "description": "Tooltip for offline extension service" - }, - "extensionHealthServiceUnknown": "Service status unknown", - "@extensionHealthServiceUnknown": { - "description": "Tooltip for unknown extension service health" - }, - "audioAnalysisStereo": "Stereo", - "@audioAnalysisStereo": { - "description": "Audio channel layout label - stereo" - }, - "audioAnalysisMono": "Mono", - "@audioAnalysisMono": { - "description": "Audio channel layout label - mono" - }, - "trackOpenInService": "Open in {serviceName}", - "@trackOpenInService": { - "description": "Button label to open a track in a named music service", - "placeholders": { - "serviceName": { - "type": "String" - } - } - }, - "trackLyricsEmbeddedSource": "Embedded", - "@trackLyricsEmbeddedSource": { - "description": "Lyrics source label for embedded lyrics" - }, - "unknownAlbum": "Unknown Album", - "@unknownAlbum": { - "description": "Fallback album name when metadata is missing" - }, - "unknownArtist": "Unknown Artist", - "@unknownArtist": { - "description": "Fallback artist name when metadata is missing" - }, - "permissionAudio": "Audio", - "@permissionAudio": { - "description": "Audio permission type label" - }, - "permissionStorage": "Storage", - "@permissionStorage": { - "description": "Storage permission type label" - }, - "permissionNotification": "Notification", - "@permissionNotification": { - "description": "Notification permission type label" - }, - "errorInvalidFolderSelected": "Invalid folder selected", - "@errorInvalidFolderSelected": { - "description": "Error when the selected folder is invalid" - }, - "storeAnyVersion": "Any", - "@storeAnyVersion": { - "description": "Store detail value when any app version is accepted" - }, - "storeCategoryMetadata": "Metadata", - "@storeCategoryMetadata": { - "description": "Store extension category - metadata" - }, - "storeCategoryDownload": "Download", - "@storeCategoryDownload": { - "description": "Store extension category - download" - }, - "storeCategoryUtility": "Utility", - "@storeCategoryUtility": { - "description": "Store extension category - utility" - }, - "storeCategoryLyrics": "Lyrics", - "@storeCategoryLyrics": { - "description": "Store extension category - lyrics" - }, - "storeCategoryIntegration": "Integration", - "@storeCategoryIntegration": { - "description": "Store extension category - integration" - }, - "artistReleases": "Releases", - "@artistReleases": { - "description": "Section header for all artist releases" - }, - "editMetadataSelectNone": "None", - "@editMetadataSelectNone": { - "description": "Button to clear selected fields for auto-fill" - }, - "queueRetryAllFailed": "Retry {count} failed", - "@queueRetryAllFailed": { - "description": "Button to retry every failed download in the queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "settingsSaveDownloadHistory": "Save download history", - "@settingsSaveDownloadHistory": { - "description": "Settings switch title for storing completed downloads in history" - }, - "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", - "@settingsSaveDownloadHistorySubtitle": { - "description": "Settings switch subtitle for storing completed downloads in history" - }, - "dialogDisableHistoryTitle": "Turn off download history?", - "@dialogDisableHistoryTitle": { - "description": "Confirmation dialog title shown before disabling download history" - }, - "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", - "@dialogDisableHistoryMessage": { - "description": "Confirmation dialog message shown before disabling download history" - }, - "dialogDisableAndClear": "Turn off and clear", - "@dialogDisableAndClear": { - "description": "Confirmation action to disable download history and clear existing entries" - }, - "openInOtherServices": "Open in Other Services", - "@openInOtherServices": { - "description": "Title and tooltip for finding the current collection in other services" - }, - "shareSheetNoExtensions": "No other compatible services", - "@shareSheetNoExtensions": { - "description": "Empty state when no extensions can be searched for cross-service links" - }, - "shareSheetNotFound": "Not found", - "@shareSheetNotFound": { - "description": "Cross-service share sheet row subtitle when a service has no match" - }, - "shareSheetCopyLink": "Copy Link", - "@shareSheetCopyLink": { - "description": "Tooltip for copying a cross-service link" - }, - "shareSheetLinkCopied": "{service} link copied", - "@shareSheetLinkCopied": { - "description": "Snackbar after copying a cross-service link", - "placeholders": { - "service": {} - } - }, - "libraryPlayback": "Playback", - "@libraryPlayback": { - "description": "Section header for playback settings in library settings" - }, - "libraryExternalPlayer": "External player", - "@libraryExternalPlayer": { - "description": "Setting option to use an external music player" - }, - "libraryExternalPlayerSubtitle": "Recommended for listening, best quality, gapless playback, EQ, and wider format support", - "@libraryExternalPlayerSubtitle": { - "description": "Subtitle for external player option" - }, - "libraryBuiltInPreviewPlayer": "Built-in preview player", - "@libraryBuiltInPreviewPlayer": { - "description": "Setting option to use the built-in preview player" - }, - "libraryBuiltInPreviewPlayerSubtitle": "Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening", - "@libraryBuiltInPreviewPlayerSubtitle": { - "description": "Subtitle for built-in preview player option" - }, - "libraryBuiltInPlayerInfo": "The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.", - "@libraryBuiltInPlayerInfo": { - "description": "Info note explaining the built-in player is for previews only" - }, - "nowPlayingTitle": "Now Playing", - "@nowPlayingTitle": { - "description": "Title for the now playing screen" - }, - "nowPlayingNothingPlaying": "Nothing is playing", - "@nowPlayingNothingPlaying": { - "description": "Empty state when no track is currently playing" - }, - "nowPlayingMinimize": "Minimize", - "@nowPlayingMinimize": { - "description": "Tooltip for minimizing the now playing screen" - }, - "nowPlayingUpNext": "Up next", - "@nowPlayingUpNext": { - "description": "Title for the playback queue sheet" - }, - "nowPlayingDetails": "Details", - "@nowPlayingDetails": { - "description": "Menu item and section title for track metadata details" - }, - "nowPlayingOpenInExternalPlayer": "Open in external player", - "@nowPlayingOpenInExternalPlayer": { - "description": "Menu item to open the current track in an external player" - }, - "nowPlayingTabPlayer": "Player", - "@nowPlayingTabPlayer": { - "description": "Tab label for the player view" - }, - "nowPlayingTabLyrics": "Lyrics", - "@nowPlayingTabLyrics": { - "description": "Tab label for the lyrics view" - }, - "nowPlayingNoLyrics": "No lyrics in this file", - "@nowPlayingNoLyrics": { - "description": "Empty state when the playing file has no embedded lyrics" - }, - "nowPlayingLibraryEmpty": "Your library is empty", - "@nowPlayingLibraryEmpty": { - "description": "Snackbar when shuffle library is requested but library has no tracks" - }, - "nowPlayingShuffleLibraryFailed": "Could not shuffle library: {error}", - "@nowPlayingShuffleLibraryFailed": { - "description": "Snackbar when shuffling the library fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "nowPlayingShuffleOn": "Shuffle on", - "@nowPlayingShuffleOn": { - "description": "Tooltip when shuffle mode is enabled" - }, - "nowPlayingPlayInOrder": "Play in order", - "@nowPlayingPlayInOrder": { - "description": "Tooltip when shuffle mode is disabled" - }, - "nowPlayingShuffleLibrary": "Shuffle library", - "@nowPlayingShuffleLibrary": { - "description": "Button label to shuffle and play the entire local library" - }, - "nowPlayingQueueEmpty": "Queue is empty", - "@nowPlayingQueueEmpty": { - "description": "Empty state when the playback queue has no items" - }, - "nowPlayingNoMetadata": "No metadata available", - "@nowPlayingNoMetadata": { - "description": "Empty state when track metadata cannot be loaded" - }, - "announcementUnableToOpenLink": "Unable to open link. Please try again.", - "@announcementUnableToOpenLink": { - "description": "Snackbar shown when an announcement CTA link cannot be opened" - }, - "trackConvertLosslessOutputWithCap": "Lossless output with {quality} cap", - "@trackConvertLosslessOutputWithCap": { - "description": "Hint shown when lossless conversion will cap bit depth or sample rate", - "placeholders": { - "quality": { - "type": "String" - } - } - }, - "trackConvertConfirmMessageLosslessCapped": "Convert from {sourceFormat} to {targetFormat} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.", - "@trackConvertConfirmMessageLosslessCapped": { - "description": "Confirmation dialog message for capped lossless conversion of a single file", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "selectionBatchConvertConfirmMessageLosslessCapped": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessageLosslessCapped": { - "description": "Confirmation dialog message for capped lossless batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "trackConvertActionLabelLossless": "{sourceFormat} → {targetFormat} ({quality})", - "@trackConvertActionLabelLossless": { - "description": "Convert button label for lossless conversion with quality cap", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", - "@trackConvertActionLabelLossy": { - "description": "Convert button label for lossy conversion", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "aboutPaxsenixSubtitle": "Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius", - "@aboutPaxsenixSubtitle": { - "description": "Subtitle for Paxsenix special thanks entry on the about page" - }, - "snackbarPlayingNext": "Playing next", - "@snackbarPlayingNext": { - "description": "Snackbar when a track is inserted as the next queue item" - }, - "snackbarAddedToQueueGeneric": "Added to queue", - "@snackbarAddedToQueueGeneric": { - "description": "Snackbar when a track is added to the playback queue without naming it" - }, - "selectionDeletePlaylistsCount": "Delete {count} {count, plural, =1{playlist} other{playlists}}", - "@selectionDeletePlaylistsCount": { - "description": "Button label for deleting multiple selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "actionShuffle": "Shuffle", - "@actionShuffle": { - "description": "Tooltip for shuffle playback action" - }, - "downloadPrimaryArtistOnlyOn": "Primary only: On", - "@downloadPrimaryArtistOnlyOn": { - "description": "Status label when primary-artist-only folder naming is enabled" - }, - "downloadPrimaryArtistOnlyOff": "Primary only: Off", - "@downloadPrimaryArtistOnlyOff": { - "description": "Status label when primary-artist-only folder naming is disabled" - }, - "downloadAlbumArtistMetadataPrimaryOnly": "Album Artist metadata: Primary only", - "@downloadAlbumArtistMetadataPrimaryOnly": { - "description": "Status label when album-artist folder filtering uses primary artist only" - }, - "downloadAlbumArtistMetadataFull": "Album Artist metadata: Full", - "@downloadAlbumArtistMetadataFull": { - "description": "Status label when album-artist folder filtering uses full metadata" - }, - "trackConvertOriginal": "Original", - "@trackConvertOriginal": { - "description": "Label for keeping original bit depth or sample rate during conversion" - }, - "trackConvertOriginalQuality": "Original quality", - "@trackConvertOriginalQuality": { - "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" - }, - "trackConvertLosslessSuffix": "Lossless", - "@trackConvertLosslessSuffix": { - "description": "Suffix used in converted lossless quality labels" - }, - "trackConvertDithering": "Dithering", - "@trackConvertDithering": { - "description": "Section label for lossless conversion dithering options" - }, - "trackConvertResampler": "Resampler", - "@trackConvertResampler": { - "description": "Section label for lossless conversion resampler options" - }, - "trackConvertDitherNone": "None", - "@trackConvertDitherNone": { - "description": "Lossless conversion dither option with no dithering applied" - }, - "trackConvertDitherTriangular": "TPDF", - "@trackConvertDitherTriangular": { - "description": "Lossless conversion triangular probability density function dither option" - }, - "trackConvertDitherTriangularHp": "Triangular HP", - "@trackConvertDitherTriangularHp": { - "description": "Lossless conversion high-pass triangular dither option" - }, - "trackConvertResamplerSwr": "SWR", - "@trackConvertResamplerSwr": { - "description": "Lossless conversion default FFmpeg swresample resampler option" - }, - "trackConvertResamplerSoxr": "SoXr", - "@trackConvertResamplerSoxr": { - "description": "Lossless conversion SoX resampler option" - }, - "updateSeeReleaseNotes": "See release notes for details.", - "@updateSeeReleaseNotes": { - "description": "Fallback changelog text when release notes cannot be parsed" - }, - "unknownTitle": "Unknown title", - "@unknownTitle": { - "description": "Fallback track title when metadata is missing" - }, - "trackPlayNext": "Play next", - "@trackPlayNext": { - "description": "Menu action to play a track as the next queue item" - }, - "trackAddToQueue": "Add to queue", - "@trackAddToQueue": { - "description": "Menu action to add a track to the playback queue" - }, - "snackbarExtensionInstalledEnable": "{extensionName} installed. Enable it in Settings > Extensions", - "@snackbarExtensionInstalledEnable": { - "description": "Snackbar after installing an extension from the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarExtensionUpdatedVersion": "{extensionName} updated to v{version}", - "@snackbarExtensionUpdatedVersion": { - "description": "Snackbar after updating an extension from the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - }, - "version": { - "type": "String" - } - } - }, - "snackbarFailedToInstallNamed": "Failed to install {extensionName}", - "@snackbarFailedToInstallNamed": { - "description": "Snackbar when extension install fails in the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarFailedToUpdateNamed": "Failed to update {extensionName}", - "@snackbarFailedToUpdateNamed": { - "description": "Snackbar when extension update fails in the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "releaseTypeEp": "EP", - "@releaseTypeEp": { - "description": "Badge label for EP releases" - }, - "releaseTypeSingle": "Single", - "@releaseTypeSingle": { - "description": "Badge label for single releases" - }, - "trackCoverOnline": "Online cover", - "@trackCoverOnline": { - "description": "Label shown when metadata autofill downloaded cover art from the internet" - }, - "regionCountryUS": "United States", - "@regionCountryUS": { - "description": "Country name for SongLink region picker" - }, - "regionCountryGB": "United Kingdom", - "@regionCountryGB": { - "description": "Country name for SongLink region picker" - }, - "regionCountryFR": "France", - "@regionCountryFR": { - "description": "Country name for SongLink region picker" - }, - "regionCountryDE": "Germany", - "@regionCountryDE": { - "description": "Country name for SongLink region picker" - }, - "regionCountryJP": "Japan", - "@regionCountryJP": { - "description": "Country name for SongLink region picker" - }, - "regionCountryKR": "South Korea", - "@regionCountryKR": { - "description": "Country name for SongLink region picker" - }, - "regionCountryIN": "India", - "@regionCountryIN": { - "description": "Country name for SongLink region picker" - }, - "regionCountryID": "Indonesia", - "@regionCountryID": { - "description": "Country name for SongLink region picker" - }, - "regionCountryBR": "Brazil", - "@regionCountryBR": { - "description": "Country name for SongLink region picker" - }, - "regionCountryMX": "Mexico", - "@regionCountryMX": { - "description": "Country name for SongLink region picker" - }, - "regionCountryAU": "Australia", - "@regionCountryAU": { - "description": "Country name for SongLink region picker" - }, - "regionCountryCA": "Canada", - "@regionCountryCA": { - "description": "Country name for SongLink region picker" - }, - "regionCountryXK": "Kosovo", - "@regionCountryXK": { - "description": "Country name for SongLink region picker" - }, - "extensionVerificationBrowserTitle": "Verification browser", - "@extensionVerificationBrowserTitle": { - "description": "Settings option title for extension verification browser preference" - }, - "extensionVerificationBrowserSubtitleExternal": "Open challenges in the default browser first", - "@extensionVerificationBrowserSubtitleExternal": { - "description": "Subtitle when external browser is preferred for extension verification" - }, - "extensionVerificationBrowserSubtitleInApp": "Open challenges in the in-app browser first", - "@extensionVerificationBrowserSubtitleInApp": { - "description": "Subtitle when in-app browser is preferred for extension verification" - }, - "extensionVerificationBrowserExternal": "External", - "@extensionVerificationBrowserExternal": { - "description": "Chip label for external browser verification mode" - }, - "extensionVerificationBrowserInApp": "In-app", - "@extensionVerificationBrowserInApp": { - "description": "Chip label for in-app browser verification mode" - }, - "extensionVerificationHelpTitleManual": "Open verification manually", - "@extensionVerificationHelpTitleManual": { - "description": "Dialog title when automatic browser launch for verification fails" - }, - "extensionVerificationHelpTitleWaiting": "Verification still waiting", - "@extensionVerificationHelpTitleWaiting": { - "description": "Dialog title when verification is taking longer than expected" - }, - "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.", - "@extensionVerificationHelpMessageManual": { - "description": "Dialog message when automatic browser launch for verification fails" - }, - "extensionVerificationHelpMessageWaiting": "If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.", - "@extensionVerificationHelpMessageWaiting": { - "description": "Dialog message when verification may need manual browser help" - }, - "extensionVerificationClose": "Close", - "@extensionVerificationClose": { - "description": "Button to dismiss the extension verification help dialog" - }, - "extensionVerificationCopyLink": "Copy link", - "@extensionVerificationCopyLink": { - "description": "Button to copy the extension verification URL" - }, - "extensionVerificationLinkCopied": "Verification link copied", - "@extensionVerificationLinkCopied": { - "description": "Snackbar after copying the extension verification URL" - }, - "extensionVerificationOpenBrowser": "Open browser", - "@extensionVerificationOpenBrowser": { - "description": "Button to open the extension verification URL in a browser" - } -} diff --git a/lib/l10n/arb/app_zh.arb b/lib/l10n/arb/app_zh.arb deleted file mode 100644 index 7b506450..00000000 --- a/lib/l10n/arb/app_zh.arb +++ /dev/null @@ -1,4283 +0,0 @@ -{ - "@@locale": "zh", - "@@last_modified": "2026-01-16", - "appName": "SpotiFLAC Mobile", - "@appName": { - "description": "App name - DO NOT TRANSLATE" - }, - "navHome": "Home", - "@navHome": { - "description": "Bottom navigation - Home tab" - }, - "navSettings": "Settings", - "@navSettings": { - "description": "Bottom navigation - Settings tab" - }, - "navStore": "Repo", - "@navStore": { - "description": "Bottom navigation - Extension store tab" - }, - "homeTitle": "Home", - "@homeTitle": { - "description": "Home screen title" - }, - "homeSubtitle": "Paste a Spotify link or search by name", - "@homeSubtitle": { - "description": "Subtitle shown below search box" - }, - "homeSupports": "Supports: Track, Album, Playlist, Artist URLs", - "@homeSupports": { - "description": "Info text about supported URL types" - }, - "homeRecent": "Recent", - "@homeRecent": { - "description": "Section header for recent searches" - }, - "historyFilterAll": "All", - "@historyFilterAll": { - "description": "Filter chip - show all items" - }, - "historyFilterAlbums": "Albums", - "@historyFilterAlbums": { - "description": "Filter chip - show albums only" - }, - "historyFilterSingles": "Singles", - "@historyFilterSingles": { - "description": "Filter chip - show singles only" - }, - "settingsTitle": "Settings", - "@settingsTitle": { - "description": "Settings screen title" - }, - "settingsDownload": "Download", - "@settingsDownload": { - "description": "Settings section - download options" - }, - "settingsAppearance": "Appearance", - "@settingsAppearance": { - "description": "Settings section - visual customization" - }, - "settingsExtensions": "Extensions", - "@settingsExtensions": { - "description": "Settings section - extension management" - }, - "settingsAbout": "About", - "@settingsAbout": { - "description": "Settings section - app info" - }, - "downloadTitle": "Download", - "@downloadTitle": { - "description": "Download settings page title" - }, - "downloadAskQualitySubtitle": "Show quality picker for each download", - "@downloadAskQualitySubtitle": { - "description": "Subtitle for ask quality toggle" - }, - "downloadFilenameFormat": "Filename Format", - "@downloadFilenameFormat": { - "description": "Setting for output filename pattern" - }, - "downloadFolderOrganization": "Folder Organization", - "@downloadFolderOrganization": { - "description": "Setting for folder structure" - }, - "appearanceTitle": "Appearance", - "@appearanceTitle": { - "description": "Appearance settings page title" - }, - "appearanceThemeSystem": "System", - "@appearanceThemeSystem": { - "description": "Follow system theme" - }, - "appearanceThemeLight": "Light", - "@appearanceThemeLight": { - "description": "Light theme" - }, - "appearanceThemeDark": "Dark", - "@appearanceThemeDark": { - "description": "Dark theme" - }, - "appearanceDynamicColor": "Dynamic Color", - "@appearanceDynamicColor": { - "description": "Material You dynamic colors" - }, - "appearanceDynamicColorSubtitle": "Use colors from your wallpaper", - "@appearanceDynamicColorSubtitle": { - "description": "Subtitle for dynamic color" - }, - "appearanceHistoryView": "History View", - "@appearanceHistoryView": { - "description": "Layout style for history" - }, - "appearanceHistoryViewList": "List", - "@appearanceHistoryViewList": { - "description": "List layout option" - }, - "appearanceHistoryViewGrid": "Grid", - "@appearanceHistoryViewGrid": { - "description": "Grid layout option" - }, - "optionsPrimaryProvider": "Primary Provider", - "@optionsPrimaryProvider": { - "description": "Main search provider setting" - }, - "optionsPrimaryProviderSubtitle": "Service used when searching by track name.", - "@optionsPrimaryProviderSubtitle": { - "description": "Subtitle for primary provider" - }, - "optionsUsingExtension": "Using extension: {extensionName}", - "@optionsUsingExtension": { - "description": "Shows active extension name", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "optionsAutoFallback": "Auto Fallback", - "@optionsAutoFallback": { - "description": "Auto-retry with other services" - }, - "optionsAutoFallbackSubtitle": "Try other services if download fails", - "@optionsAutoFallbackSubtitle": { - "description": "Subtitle for auto fallback" - }, - "optionsEmbedLyrics": "Embed Lyrics", - "@optionsEmbedLyrics": { - "description": "Embed lyrics in audio files" - }, - "optionsEmbedLyricsSubtitle": "Embed synced lyrics into FLAC files", - "@optionsEmbedLyricsSubtitle": { - "description": "Subtitle for embed lyrics" - }, - "optionsMaxQualityCover": "Max Quality Cover", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "Download highest resolution cover art", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, - "optionsExtensionStore": "Extension Repo", - "@optionsExtensionStore": { - "description": "Show/hide store tab" - }, - "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", - "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" - }, - "optionsCheckUpdates": "Check for Updates", - "@optionsCheckUpdates": { - "description": "Auto update check toggle" - }, - "optionsCheckUpdatesSubtitle": "Notify when new version is available", - "@optionsCheckUpdatesSubtitle": { - "description": "Subtitle for update check" - }, - "optionsUpdateChannel": "Update Channel", - "@optionsUpdateChannel": { - "description": "Stable vs preview releases" - }, - "optionsUpdateChannelStable": "Stable releases only", - "@optionsUpdateChannelStable": { - "description": "Only stable updates" - }, - "optionsUpdateChannelPreview": "Get preview releases", - "@optionsUpdateChannelPreview": { - "description": "Include beta/preview updates" - }, - "optionsUpdateChannelWarning": "Preview may contain bugs or incomplete features", - "@optionsUpdateChannelWarning": { - "description": "Warning about preview channel" - }, - "optionsClearHistory": "Clear Download History", - "@optionsClearHistory": { - "description": "Delete all download history" - }, - "optionsClearHistorySubtitle": "Remove all downloaded tracks from history", - "@optionsClearHistorySubtitle": { - "description": "Subtitle for clear history" - }, - "optionsDetailedLogging": "Detailed Logging", - "@optionsDetailedLogging": { - "description": "Enable verbose logs for debugging" - }, - "optionsDetailedLoggingOn": "Detailed logs are being recorded", - "@optionsDetailedLoggingOn": { - "description": "Status when logging enabled" - }, - "optionsDetailedLoggingOff": "Enable for bug reports", - "@optionsDetailedLoggingOff": { - "description": "Status when logging disabled" - }, - "extensionsTitle": "Extensions", - "@extensionsTitle": { - "description": "Extensions page title" - }, - "extensionsDisabled": "Disabled", - "@extensionsDisabled": { - "description": "Extension status - inactive" - }, - "extensionsVersion": "Version {version}", - "@extensionsVersion": { - "description": "Extension version display", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "extensionsUninstall": "Uninstall", - "@extensionsUninstall": { - "description": "Uninstall extension button" - }, - "storeTitle": "Extension Repo", - "@storeTitle": { - "description": "Store screen title" - }, - "storeSearch": "Search extensions...", - "@storeSearch": { - "description": "Store search placeholder" - }, - "storeInstall": "Install", - "@storeInstall": { - "description": "Install extension button" - }, - "storeInstalled": "Installed", - "@storeInstalled": { - "description": "Already installed badge" - }, - "storeUpdate": "Update", - "@storeUpdate": { - "description": "Update available button" - }, - "aboutTitle": "About", - "@aboutTitle": { - "description": "About page title" - }, - "aboutContributors": "Contributors", - "@aboutContributors": { - "description": "Section for contributors" - }, - "aboutMobileDeveloper": "Mobile version developer", - "@aboutMobileDeveloper": { - "description": "Role description for mobile dev" - }, - "aboutOriginalCreator": "Creator of the original SpotiFLAC", - "@aboutOriginalCreator": { - "description": "Role description for original creator" - }, - "aboutLogoArtist": "The talented artist who created our beautiful app logo!", - "@aboutLogoArtist": { - "description": "Role description for logo artist" - }, - "aboutSpecialThanks": "Special Thanks", - "@aboutSpecialThanks": { - "description": "Section for special thanks" - }, - "aboutLinks": "Links", - "@aboutLinks": { - "description": "Section for external links" - }, - "aboutMobileSource": "Mobile source code", - "@aboutMobileSource": { - "description": "Link to mobile GitHub repo" - }, - "aboutPCSource": "PC source code", - "@aboutPCSource": { - "description": "Link to PC GitHub repo" - }, - "aboutKeepAndroidOpen": "Keep Android Open", - "@aboutKeepAndroidOpen": { - "description": "Link to Keep Android Open campaign website" - }, - "aboutReportIssue": "Report an issue", - "@aboutReportIssue": { - "description": "Link to report bugs" - }, - "aboutReportIssueSubtitle": "Report any problems you encounter", - "@aboutReportIssueSubtitle": { - "description": "Subtitle for report issue" - }, - "aboutFeatureRequest": "Feature request", - "@aboutFeatureRequest": { - "description": "Link to suggest features" - }, - "aboutFeatureRequestSubtitle": "Suggest new features for the app", - "@aboutFeatureRequestSubtitle": { - "description": "Subtitle for feature request" - }, - "aboutApp": "App", - "@aboutApp": { - "description": "Section for app info" - }, - "aboutVersion": "Version", - "@aboutVersion": { - "description": "Version info label" - }, - "aboutBinimumDesc": "The creator of QQDL & HiFi API. This project helped shape lossless download support.", - "@aboutBinimumDesc": { - "description": "Credit description for binimum" - }, - "aboutSachinsenalDesc": "The original HiFi project creator. A foundation for lossless-source integration.", - "@aboutSachinsenalDesc": { - "description": "Credit description for sachinsenal0x64" - }, - "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", - "@aboutAppDescription": { - "description": "App description in header card" - }, - "artistAlbums": "Albums", - "@artistAlbums": { - "description": "Section header for artist albums" - }, - "artistSingles": "Singles & EPs", - "@artistSingles": { - "description": "Section header for singles/EPs" - }, - "artistCompilations": "Compilations", - "@artistCompilations": { - "description": "Section header for compilations" - }, - "trackMetadataService": "Service", - "@trackMetadataService": { - "description": "Metadata field - download service used" - }, - "trackMetadataPlay": "Play", - "@trackMetadataPlay": { - "description": "Action button - play track" - }, - "trackMetadataShare": "Share", - "@trackMetadataShare": { - "description": "Action button - share track" - }, - "trackMetadataDelete": "Delete", - "@trackMetadataDelete": { - "description": "Action button - delete track" - }, - "setupGrantPermission": "Grant Permission", - "@setupGrantPermission": { - "description": "Button to request permission" - }, - "setupSkip": "Skip for now", - "@setupSkip": { - "description": "Skip current step button" - }, - "setupStorageAccessRequired": "Storage Access Required", - "@setupStorageAccessRequired": { - "description": "Title when storage access needed" - }, - "setupStorageAccessMessageAndroid11": "Android 11+ requires \"All files access\" permission to save files to your chosen download folder.", - "@setupStorageAccessMessageAndroid11": { - "description": "Android 11+ specific explanation" - }, - "setupOpenSettings": "Open Settings", - "@setupOpenSettings": { - "description": "Button to open system settings" - }, - "setupPermissionDeniedMessage": "Permission denied. Please grant all permissions to continue.", - "@setupPermissionDeniedMessage": { - "description": "Error when permission denied" - }, - "setupPermissionRequired": "{permissionType} Permission Required", - "@setupPermissionRequired": { - "description": "Generic permission required title", - "placeholders": { - "permissionType": { - "type": "String", - "description": "Type of permission (Storage/Notification)" - } - } - }, - "setupPermissionRequiredMessage": "{permissionType} permission is required for the best experience. You can change this later in Settings.", - "@setupPermissionRequiredMessage": { - "description": "Generic permission required message", - "placeholders": { - "permissionType": { - "type": "String" - } - } - }, - "setupUseDefaultFolder": "Use Default Folder?", - "@setupUseDefaultFolder": { - "description": "Dialog title for default folder" - }, - "setupNoFolderSelected": "No folder selected. Would you like to use the default Music folder?", - "@setupNoFolderSelected": { - "description": "Prompt when no folder selected" - }, - "setupUseDefault": "Use Default", - "@setupUseDefault": { - "description": "Button to use default folder" - }, - "setupDownloadLocationTitle": "Download Location", - "@setupDownloadLocationTitle": { - "description": "Download location dialog title" - }, - "setupDownloadLocationIosMessage": "On iOS, downloads are saved to the app's Documents folder. You can access them via the Files app.", - "@setupDownloadLocationIosMessage": { - "description": "iOS-specific folder info" - }, - "setupAppDocumentsFolder": "App Documents Folder", - "@setupAppDocumentsFolder": { - "description": "iOS documents folder option" - }, - "setupAppDocumentsFolderSubtitle": "Recommended - accessible via Files app", - "@setupAppDocumentsFolderSubtitle": { - "description": "Subtitle for documents folder" - }, - "setupChooseFromFiles": "Choose from Files", - "@setupChooseFromFiles": { - "description": "iOS file picker option" - }, - "setupChooseFromFilesSubtitle": "Select iCloud or other location", - "@setupChooseFromFilesSubtitle": { - "description": "Subtitle for file picker" - }, - "setupIosEmptyFolderWarning": "iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.", - "@setupIosEmptyFolderWarning": { - "description": "iOS folder selection warning" - }, - "setupDownloadInFlac": "Download Spotify tracks in FLAC", - "@setupDownloadInFlac": { - "description": "App tagline in setup" - }, - "setupStorageGranted": "Storage Permission Granted!", - "@setupStorageGranted": { - "description": "Success message for storage permission" - }, - "setupStorageRequired": "Storage Permission Required", - "@setupStorageRequired": { - "description": "Title when storage permission needed" - }, - "setupStorageDescription": "SpotiFLAC needs storage permission to save your downloaded music files.", - "@setupStorageDescription": { - "description": "Explanation for storage permission" - }, - "setupNotificationGranted": "Notification Permission Granted!", - "@setupNotificationGranted": { - "description": "Success message for notification permission" - }, - "setupNotificationEnable": "Enable Notifications", - "@setupNotificationEnable": { - "description": "Button to enable notifications" - }, - "setupFolderChoose": "Choose Download Folder", - "@setupFolderChoose": { - "description": "Button to choose folder" - }, - "setupFolderDescription": "Select a folder where your downloaded music will be saved.", - "@setupFolderDescription": { - "description": "Explanation for folder selection" - }, - "setupSelectFolder": "Select Folder", - "@setupSelectFolder": { - "description": "Button to select folder" - }, - "setupEnableNotifications": "Enable Notifications", - "@setupEnableNotifications": { - "description": "Button to enable notifications" - }, - "setupNotificationBackgroundDescription": "Get notified about download progress and completion. This helps you track downloads when the app is in background.", - "@setupNotificationBackgroundDescription": { - "description": "Detailed notification explanation" - }, - "setupSkipForNow": "Skip for now", - "@setupSkipForNow": { - "description": "Skip button text" - }, - "setupNext": "Next", - "@setupNext": { - "description": "Next button text" - }, - "setupGetStarted": "Get Started", - "@setupGetStarted": { - "description": "Final setup button" - }, - "setupAllowAccessToManageFiles": "Please enable \"Allow access to manage all files\" in the next screen.", - "@setupAllowAccessToManageFiles": { - "description": "Instruction for file access permission" - }, - "dialogCancel": "Cancel", - "@dialogCancel": { - "description": "Dialog button - cancel action" - }, - "dialogSave": "Save", - "@dialogSave": { - "description": "Dialog button - save changes" - }, - "dialogDelete": "Delete", - "@dialogDelete": { - "description": "Dialog button - delete item" - }, - "dialogRetry": "Retry", - "@dialogRetry": { - "description": "Dialog button - retry action" - }, - "dialogClear": "Clear", - "@dialogClear": { - "description": "Dialog button - clear items" - }, - "dialogDone": "Done", - "@dialogDone": { - "description": "Dialog button - action completed" - }, - "dialogImport": "Import", - "@dialogImport": { - "description": "Dialog button - import data" - }, - "dialogDiscard": "Discard", - "@dialogDiscard": { - "description": "Dialog button - discard changes" - }, - "dialogRemove": "Remove", - "@dialogRemove": { - "description": "Dialog button - remove item" - }, - "dialogUninstall": "Uninstall", - "@dialogUninstall": { - "description": "Dialog button - uninstall extension" - }, - "dialogDiscardChanges": "Discard Changes?", - "@dialogDiscardChanges": { - "description": "Dialog title - unsaved changes warning" - }, - "dialogUnsavedChanges": "You have unsaved changes. Do you want to discard them?", - "@dialogUnsavedChanges": { - "description": "Dialog message - unsaved changes" - }, - "dialogClearAll": "Clear All", - "@dialogClearAll": { - "description": "Dialog title - clear all items" - }, - "dialogRemoveExtension": "Remove Extension", - "@dialogRemoveExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogRemoveExtensionMessage": "Are you sure you want to remove this extension? This cannot be undone.", - "@dialogRemoveExtensionMessage": { - "description": "Dialog message - uninstall confirmation" - }, - "dialogUninstallExtension": "Uninstall Extension?", - "@dialogUninstallExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogUninstallExtensionMessage": "Are you sure you want to remove {extensionName}?", - "@dialogUninstallExtensionMessage": { - "description": "Dialog message - uninstall specific extension", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "dialogClearHistoryTitle": "Clear History", - "@dialogClearHistoryTitle": { - "description": "Dialog title - clear download history" - }, - "dialogClearHistoryMessage": "Are you sure you want to clear all download history? This cannot be undone.", - "@dialogClearHistoryMessage": { - "description": "Dialog message - clear history confirmation" - }, - "dialogDeleteSelectedTitle": "Delete Selected", - "@dialogDeleteSelectedTitle": { - "description": "Dialog title - delete selected items" - }, - "dialogDeleteSelectedMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from history?\n\nThis will also delete the files from storage.", - "@dialogDeleteSelectedMessage": { - "description": "Dialog message - delete selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogImportPlaylistTitle": "Import Playlist", - "@dialogImportPlaylistTitle": { - "description": "Dialog title - import CSV playlist" - }, - "dialogImportPlaylistMessage": "Found {count} tracks in CSV. Add them to download queue?", - "@dialogImportPlaylistMessage": { - "description": "Dialog message - import playlist confirmation", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedToQueue": "Added \"{trackName}\" to queue", - "@snackbarAddedToQueue": { - "description": "Snackbar - track added to download queue", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAddedTracksToQueue": "Added {count} tracks to queue", - "@snackbarAddedTracksToQueue": { - "description": "Snackbar - multiple tracks added to queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAlreadyDownloaded": "\"{trackName}\" already downloaded", - "@snackbarAlreadyDownloaded": { - "description": "Snackbar - track already exists", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarHistoryCleared": "History cleared", - "@snackbarHistoryCleared": { - "description": "Snackbar - history deleted" - }, - "snackbarDeletedTracks": "Deleted {count} {count, plural, =1{track} other{tracks}}", - "@snackbarDeletedTracks": { - "description": "Snackbar - tracks deleted", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarCannotOpenFile": "Cannot open file: {error}", - "@snackbarCannotOpenFile": { - "description": "Snackbar - file open error", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "snackbarViewQueue": "View Queue", - "@snackbarViewQueue": { - "description": "Snackbar action - view download queue" - }, - "snackbarUrlCopied": "{platform} URL copied to clipboard", - "@snackbarUrlCopied": { - "description": "Snackbar - URL copied", - "placeholders": { - "platform": { - "type": "String", - "description": "Platform name (Spotify/Deezer)" - } - } - }, - "snackbarFileNotFound": "File not found", - "@snackbarFileNotFound": { - "description": "Snackbar - file doesn't exist" - }, - "snackbarSelectExtFile": "Please select a .spotiflac-ext file", - "@snackbarSelectExtFile": { - "description": "Snackbar - wrong file type selected" - }, - "snackbarProviderPrioritySaved": "Provider priority saved", - "@snackbarProviderPrioritySaved": { - "description": "Snackbar - provider order saved" - }, - "snackbarMetadataProviderSaved": "Metadata provider priority saved", - "@snackbarMetadataProviderSaved": { - "description": "Snackbar - metadata provider order saved" - }, - "snackbarExtensionInstalled": "{extensionName} installed.", - "@snackbarExtensionInstalled": { - "description": "Snackbar - extension installed successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarExtensionUpdated": "{extensionName} updated.", - "@snackbarExtensionUpdated": { - "description": "Snackbar - extension updated successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarFailedToInstall": "Failed to install extension", - "@snackbarFailedToInstall": { - "description": "Snackbar - extension install error" - }, - "snackbarFailedToUpdate": "Failed to update extension", - "@snackbarFailedToUpdate": { - "description": "Snackbar - extension update error" - }, - "errorRateLimited": "Rate Limited", - "@errorRateLimited": { - "description": "Error title - too many requests" - }, - "errorRateLimitedMessage": "Too many requests. Please wait a moment before searching again.", - "@errorRateLimitedMessage": { - "description": "Error message - rate limit explanation" - }, - "errorNoTracksFound": "No tracks found", - "@errorNoTracksFound": { - "description": "Error - search returned no results" - }, - "errorMissingExtensionSource": "Cannot load {item}: missing extension source", - "@errorMissingExtensionSource": { - "description": "Error - extension source not available", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "actionPause": "Pause", - "@actionPause": { - "description": "Action button - pause download" - }, - "actionResume": "Resume", - "@actionResume": { - "description": "Action button - resume download" - }, - "actionCancel": "Cancel", - "@actionCancel": { - "description": "Action button - cancel operation" - }, - "actionSelectAll": "Select All", - "@actionSelectAll": { - "description": "Action button - select all items" - }, - "actionDeselect": "Deselect", - "@actionDeselect": { - "description": "Action button - deselect all" - }, - "selectionSelected": "{count} selected", - "@selectionSelected": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionAllSelected": "All tracks selected", - "@selectionAllSelected": { - "description": "Status - all items selected" - }, - "selectionSelectToDelete": "Select tracks to delete", - "@selectionSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "progressFetchingMetadata": "Fetching metadata... {current}/{total}", - "@progressFetchingMetadata": { - "description": "Progress indicator - loading track info", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "progressReadingCsv": "Reading CSV...", - "@progressReadingCsv": { - "description": "Progress indicator - parsing CSV file" - }, - "searchSongs": "Songs", - "@searchSongs": { - "description": "Search result category - songs" - }, - "searchArtists": "Artists", - "@searchArtists": { - "description": "Search result category - artists" - }, - "searchAlbums": "Albums", - "@searchAlbums": { - "description": "Search result category - albums" - }, - "searchPlaylists": "Playlists", - "@searchPlaylists": { - "description": "Search result category - playlists" - }, - "tooltipPlay": "Play", - "@tooltipPlay": { - "description": "Tooltip - play button" - }, - "filenameFormat": "Filename Format", - "@filenameFormat": { - "description": "Setting title - filename pattern" - }, - "folderOrganizationNone": "No organization", - "@folderOrganizationNone": { - "description": "Folder option - flat structure" - }, - "folderOrganizationByArtist": "By Artist", - "@folderOrganizationByArtist": { - "description": "Folder option - artist folders" - }, - "folderOrganizationByAlbum": "By Album", - "@folderOrganizationByAlbum": { - "description": "Folder option - album folders" - }, - "folderOrganizationByArtistAlbum": "Artist/Album", - "@folderOrganizationByArtistAlbum": { - "description": "Folder option - nested folders" - }, - "folderOrganizationDescription": "Organize downloaded files into folders", - "@folderOrganizationDescription": { - "description": "Folder organization sheet description" - }, - "folderOrganizationNoneSubtitle": "All files in download folder", - "@folderOrganizationNoneSubtitle": { - "description": "Subtitle for no organization option" - }, - "folderOrganizationByArtistSubtitle": "Separate folder for each artist", - "@folderOrganizationByArtistSubtitle": { - "description": "Subtitle for artist folder option" - }, - "folderOrganizationByAlbumSubtitle": "Separate folder for each album", - "@folderOrganizationByAlbumSubtitle": { - "description": "Subtitle for album folder option" - }, - "folderOrganizationByArtistAlbumSubtitle": "Nested folders for artist and album", - "@folderOrganizationByArtistAlbumSubtitle": { - "description": "Subtitle for nested folder option" - }, - "updateAvailable": "Update Available", - "@updateAvailable": { - "description": "Update dialog title" - }, - "updateLater": "Later", - "@updateLater": { - "description": "Update button - dismiss" - }, - "updateStartingDownload": "Starting download...", - "@updateStartingDownload": { - "description": "Update status - initializing" - }, - "updateDownloadFailed": "Download failed", - "@updateDownloadFailed": { - "description": "Update error title" - }, - "updateFailedMessage": "Failed to download update", - "@updateFailedMessage": { - "description": "Update error message" - }, - "updateNewVersionReady": "A new version is ready", - "@updateNewVersionReady": { - "description": "Update subtitle" - }, - "updateCurrent": "Current", - "@updateCurrent": { - "description": "Label for current version" - }, - "updateNew": "New", - "@updateNew": { - "description": "Label for new version" - }, - "updateDownloading": "Downloading...", - "@updateDownloading": { - "description": "Update status - downloading" - }, - "updateWhatsNew": "What's New", - "@updateWhatsNew": { - "description": "Changelog section title" - }, - "updateDownloadInstall": "Download & Install", - "@updateDownloadInstall": { - "description": "Update button - download and install" - }, - "updateDontRemind": "Don't remind", - "@updateDontRemind": { - "description": "Update button - skip this version" - }, - "providerPriorityTitle": "Provider Priority", - "@providerPriorityTitle": { - "description": "Provider priority page title" - }, - "providerPriorityDescription": "Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.", - "@providerPriorityDescription": { - "description": "Provider priority page description" - }, - "providerPriorityInfo": "If a track is not available on the first provider, the app will automatically try the next one.", - "@providerPriorityInfo": { - "description": "Info tip about fallback behavior" - }, - "providerExtension": "Extension", - "@providerExtension": { - "description": "Label for extension-provided providers" - }, - "metadataProviderPriorityTitle": "Metadata Priority", - "@metadataProviderPriorityTitle": { - "description": "Metadata priority page title" - }, - "metadataProviderPriorityDescription": "Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.", - "@metadataProviderPriorityDescription": { - "description": "Metadata priority page description" - }, - "metadataProviderPriorityInfo": "Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.", - "@metadataProviderPriorityInfo": { - "description": "Info tip about rate limits" - }, - "logTitle": "Logs", - "@logTitle": { - "description": "Logs screen title" - }, - "logCopied": "Logs copied to clipboard", - "@logCopied": { - "description": "Snackbar - logs copied" - }, - "logSearchHint": "Search logs...", - "@logSearchHint": { - "description": "Log search placeholder" - }, - "logFilterLevel": "Level", - "@logFilterLevel": { - "description": "Filter by log level" - }, - "logFilterSection": "Filter", - "@logFilterSection": { - "description": "Filter section title" - }, - "logShareLogs": "Share logs", - "@logShareLogs": { - "description": "Share button tooltip" - }, - "logClearLogs": "Clear logs", - "@logClearLogs": { - "description": "Clear button tooltip" - }, - "logClearLogsTitle": "Clear Logs", - "@logClearLogsTitle": { - "description": "Clear logs dialog title" - }, - "logClearLogsMessage": "Are you sure you want to clear all logs?", - "@logClearLogsMessage": { - "description": "Clear logs confirmation message" - }, - "logFilterBySeverity": "Filter logs by severity", - "@logFilterBySeverity": { - "description": "Filter dialog title" - }, - "logNoLogsYet": "No logs yet", - "@logNoLogsYet": { - "description": "Empty state title" - }, - "logNoLogsYetSubtitle": "Logs will appear here as you use the app", - "@logNoLogsYetSubtitle": { - "description": "Empty state subtitle" - }, - "logEntriesFiltered": "Entries ({count} filtered)", - "@logEntriesFiltered": { - "description": "Log count with filter active", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "logEntries": "Entries ({count})", - "@logEntries": { - "description": "Total log count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "channelStable": "Stable", - "@channelStable": { - "description": "Update channel - stable releases" - }, - "channelPreview": "Preview", - "@channelPreview": { - "description": "Update channel - beta/preview releases" - }, - "sectionSearchSource": "Search Source", - "@sectionSearchSource": { - "description": "Settings section header" - }, - "sectionDownload": "Download", - "@sectionDownload": { - "description": "Settings section header" - }, - "sectionPerformance": "Performance", - "@sectionPerformance": { - "description": "Settings section header" - }, - "sectionApp": "App", - "@sectionApp": { - "description": "Settings section header" - }, - "sectionData": "Data", - "@sectionData": { - "description": "Settings section header" - }, - "sectionDebug": "Debug", - "@sectionDebug": { - "description": "Settings section header" - }, - "sectionService": "Service", - "@sectionService": { - "description": "Settings section header" - }, - "sectionAudioQuality": "Audio Quality", - "@sectionAudioQuality": { - "description": "Settings section header" - }, - "sectionFileSettings": "File Settings", - "@sectionFileSettings": { - "description": "Settings section header" - }, - "sectionColor": "Color", - "@sectionColor": { - "description": "Settings section header" - }, - "sectionTheme": "Theme", - "@sectionTheme": { - "description": "Settings section header" - }, - "sectionLayout": "Layout", - "@sectionLayout": { - "description": "Settings section header" - }, - "sectionLanguage": "Language", - "@sectionLanguage": { - "description": "Settings section header for language selection" - }, - "appearanceLanguage": "App Language", - "@appearanceLanguage": { - "description": "Setting title for language selection" - }, - "settingsAppearanceSubtitle": "Theme, colors, display", - "@settingsAppearanceSubtitle": { - "description": "Appearance settings description" - }, - "settingsDownloadSubtitle": "Service, quality, filename format", - "@settingsDownloadSubtitle": { - "description": "Download settings description" - }, - "settingsExtensionsSubtitle": "Manage download providers", - "@settingsExtensionsSubtitle": { - "description": "Extensions settings description" - }, - "settingsLogsSubtitle": "View app logs for debugging", - "@settingsLogsSubtitle": { - "description": "Logs settings description" - }, - "loadingSharedLink": "Loading shared link...", - "@loadingSharedLink": { - "description": "Status when opening shared URL" - }, - "pressBackAgainToExit": "Press back again to exit", - "@pressBackAgainToExit": { - "description": "Exit confirmation message" - }, - "downloadAllCount": "Download All ({count})", - "@downloadAllCount": { - "description": "Download all button with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tracksCount": "{count, plural, =1{1 track} other{{count} tracks}}", - "@tracksCount": { - "description": "Track count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackCopyFilePath": "Copy file path", - "@trackCopyFilePath": { - "description": "Action - copy file path" - }, - "trackRemoveFromDevice": "Remove from device", - "@trackRemoveFromDevice": { - "description": "Action - delete downloaded file" - }, - "trackLoadLyrics": "Load Lyrics", - "@trackLoadLyrics": { - "description": "Action - fetch lyrics" - }, - "trackMetadata": "Metadata", - "@trackMetadata": { - "description": "Tab title - track metadata" - }, - "trackFileInfo": "File Info", - "@trackFileInfo": { - "description": "Tab title - file information" - }, - "trackLyrics": "Lyrics", - "@trackLyrics": { - "description": "Tab title - lyrics" - }, - "trackFileNotFound": "File not found", - "@trackFileNotFound": { - "description": "Error - file doesn't exist" - }, - "trackOpenInDeezer": "Open in Deezer", - "@trackOpenInDeezer": { - "description": "Action - open track in Deezer app" - }, - "trackOpenInSpotify": "Open in Spotify", - "@trackOpenInSpotify": { - "description": "Action - open track in Spotify app" - }, - "trackTrackName": "Track name", - "@trackTrackName": { - "description": "Metadata label - track title" - }, - "trackArtist": "Artist", - "@trackArtist": { - "description": "Metadata label - artist name" - }, - "trackAlbumArtist": "Album artist", - "@trackAlbumArtist": { - "description": "Metadata label - album artist" - }, - "trackAlbum": "Album", - "@trackAlbum": { - "description": "Metadata label - album name" - }, - "trackTrackNumber": "Track number", - "@trackTrackNumber": { - "description": "Metadata label - track number" - }, - "trackDiscNumber": "Disc number", - "@trackDiscNumber": { - "description": "Metadata label - disc number" - }, - "trackDuration": "Duration", - "@trackDuration": { - "description": "Metadata label - track length" - }, - "trackAudioQuality": "Audio quality", - "@trackAudioQuality": { - "description": "Metadata label - audio quality" - }, - "trackReleaseDate": "Release date", - "@trackReleaseDate": { - "description": "Metadata label - release date" - }, - "trackDownloaded": "Downloaded", - "@trackDownloaded": { - "description": "Metadata label - download date" - }, - "trackCopyLyrics": "Copy lyrics", - "@trackCopyLyrics": { - "description": "Action - copy lyrics to clipboard" - }, - "trackLyricsNotAvailable": "Lyrics not available for this track", - "@trackLyricsNotAvailable": { - "description": "Message when lyrics not found" - }, - "trackLyricsTimeout": "Request timed out. Try again later.", - "@trackLyricsTimeout": { - "description": "Message when lyrics request times out" - }, - "trackLyricsLoadFailed": "Failed to load lyrics", - "@trackLyricsLoadFailed": { - "description": "Message when lyrics loading fails" - }, - "trackCopiedToClipboard": "Copied to clipboard", - "@trackCopiedToClipboard": { - "description": "Snackbar - content copied" - }, - "trackDeleteConfirmTitle": "Remove from device?", - "@trackDeleteConfirmTitle": { - "description": "Delete confirmation title" - }, - "trackDeleteConfirmMessage": "This will permanently delete the downloaded file and remove it from your history.", - "@trackDeleteConfirmMessage": { - "description": "Delete confirmation message" - }, - "dateToday": "Today", - "@dateToday": { - "description": "Relative date - today" - }, - "dateYesterday": "Yesterday", - "@dateYesterday": { - "description": "Relative date - yesterday" - }, - "dateDaysAgo": "{count} days ago", - "@dateDaysAgo": { - "description": "Relative date - days ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateWeeksAgo": "{count} weeks ago", - "@dateWeeksAgo": { - "description": "Relative date - weeks ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateMonthsAgo": "{count} months ago", - "@dateMonthsAgo": { - "description": "Relative date - months ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "storeFilterAll": "All", - "@storeFilterAll": { - "description": "Store filter - all extensions" - }, - "storeFilterMetadata": "Metadata", - "@storeFilterMetadata": { - "description": "Store filter - metadata providers" - }, - "storeFilterDownload": "Download", - "@storeFilterDownload": { - "description": "Store filter - download providers" - }, - "storeFilterUtility": "Utility", - "@storeFilterUtility": { - "description": "Store filter - utility extensions" - }, - "storeFilterLyrics": "Lyrics", - "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" - }, - "storeFilterIntegration": "Integration", - "@storeFilterIntegration": { - "description": "Store filter - integrations" - }, - "storeClearFilters": "Clear filters", - "@storeClearFilters": { - "description": "Button to clear all filters" - }, - "extensionId": "ID", - "@extensionId": { - "description": "Extension detail - unique ID" - }, - "extensionError": "Error", - "@extensionError": { - "description": "Extension detail - error message" - }, - "extensionCapabilities": "Capabilities", - "@extensionCapabilities": { - "description": "Section header - extension features" - }, - "extensionMetadataProvider": "Metadata Provider", - "@extensionMetadataProvider": { - "description": "Capability - provides metadata" - }, - "extensionDownloadProvider": "Download Provider", - "@extensionDownloadProvider": { - "description": "Capability - provides downloads" - }, - "extensionLyricsProvider": "Lyrics Provider", - "@extensionLyricsProvider": { - "description": "Capability - provides lyrics" - }, - "extensionUrlHandler": "URL Handler", - "@extensionUrlHandler": { - "description": "Capability - handles URLs" - }, - "extensionQualityOptions": "Quality Options", - "@extensionQualityOptions": { - "description": "Capability - quality selection" - }, - "extensionPostProcessingHooks": "Post-Processing Hooks", - "@extensionPostProcessingHooks": { - "description": "Capability - post-processing" - }, - "extensionPermissions": "Permissions", - "@extensionPermissions": { - "description": "Section header - required permissions" - }, - "extensionSettings": "Settings", - "@extensionSettings": { - "description": "Section header - extension settings" - }, - "extensionRemoveButton": "Remove Extension", - "@extensionRemoveButton": { - "description": "Button to uninstall extension" - }, - "extensionUpdated": "Updated", - "@extensionUpdated": { - "description": "Extension detail - last update" - }, - "extensionMinAppVersion": "Min App Version", - "@extensionMinAppVersion": { - "description": "Extension detail - minimum app version" - }, - "extensionCustomTrackMatching": "Custom Track Matching", - "@extensionCustomTrackMatching": { - "description": "Capability - custom track matching algorithm" - }, - "extensionPostProcessing": "Post-Processing", - "@extensionPostProcessing": { - "description": "Capability - post-download processing" - }, - "extensionHooksAvailable": "{count} hook(s) available", - "@extensionHooksAvailable": { - "description": "Post-processing hooks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionPatternsCount": "{count} pattern(s)", - "@extensionPatternsCount": { - "description": "URL patterns count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionStrategy": "Strategy: {strategy}", - "@extensionStrategy": { - "description": "Track matching strategy name", - "placeholders": { - "strategy": { - "type": "String" - } - } - }, - "extensionsProviderPrioritySection": "Provider Priority", - "@extensionsProviderPrioritySection": { - "description": "Section header - provider priority" - }, - "extensionsInstalledSection": "Installed Extensions", - "@extensionsInstalledSection": { - "description": "Section header - installed extensions" - }, - "extensionsNoExtensions": "No extensions installed", - "@extensionsNoExtensions": { - "description": "Empty state - no extensions" - }, - "extensionsNoExtensionsSubtitle": "Install .spotiflac-ext files to add new providers", - "@extensionsNoExtensionsSubtitle": { - "description": "Empty state subtitle" - }, - "extensionsInstallButton": "Install Extension", - "@extensionsInstallButton": { - "description": "Button to install extension from file" - }, - "extensionsInfoTip": "Extensions can add new metadata and download providers. Only install extensions from trusted sources.", - "@extensionsInfoTip": { - "description": "Security warning about extensions" - }, - "extensionsInstalledSuccess": "Extension installed successfully", - "@extensionsInstalledSuccess": { - "description": "Success message after install" - }, - "extensionsDownloadPriority": "Download Priority", - "@extensionsDownloadPriority": { - "description": "Setting - download provider order" - }, - "extensionsDownloadPrioritySubtitle": "Set download service order", - "@extensionsDownloadPrioritySubtitle": { - "description": "Subtitle for download priority" - }, - "extensionsNoDownloadProvider": "No extensions with download provider", - "@extensionsNoDownloadProvider": { - "description": "Empty state - no download providers" - }, - "extensionsMetadataPriority": "Metadata Priority", - "@extensionsMetadataPriority": { - "description": "Setting - metadata provider order" - }, - "extensionsMetadataPrioritySubtitle": "Set search & metadata source order", - "@extensionsMetadataPrioritySubtitle": { - "description": "Subtitle for metadata priority" - }, - "extensionsNoMetadataProvider": "No extensions with metadata provider", - "@extensionsNoMetadataProvider": { - "description": "Empty state - no metadata providers" - }, - "extensionsSearchProvider": "Search Provider", - "@extensionsSearchProvider": { - "description": "Setting - search provider selection" - }, - "extensionsNoCustomSearch": "No extensions with custom search", - "@extensionsNoCustomSearch": { - "description": "Empty state - no search providers" - }, - "extensionsSearchProviderDescription": "Choose which service to use for searching tracks", - "@extensionsSearchProviderDescription": { - "description": "Search provider setting description" - }, - "extensionsCustomSearch": "Custom search", - "@extensionsCustomSearch": { - "description": "Label for custom search provider" - }, - "extensionsErrorLoading": "Error loading extension", - "@extensionsErrorLoading": { - "description": "Error message when extension fails to load" - }, - "qualityFlacLossless": "FLAC Lossless", - "@qualityFlacLossless": { - "description": "Quality option - CD quality FLAC" - }, - "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", - "@qualityFlacLosslessSubtitle": { - "description": "Technical spec for lossless" - }, - "qualityHiResFlac": "Hi-Res FLAC", - "@qualityHiResFlac": { - "description": "Quality option - high resolution FLAC" - }, - "qualityHiResFlacSubtitle": "24-bit / up to 96kHz", - "@qualityHiResFlacSubtitle": { - "description": "Technical spec for hi-res" - }, - "qualityHiResFlacMax": "Hi-Res FLAC Max", - "@qualityHiResFlacMax": { - "description": "Quality option - maximum resolution FLAC" - }, - "qualityHiResFlacMaxSubtitle": "24-bit / up to 192kHz", - "@qualityHiResFlacMaxSubtitle": { - "description": "Technical spec for hi-res max" - }, - "downloadAskBeforeDownload": "Ask Before Download", - "@downloadAskBeforeDownload": { - "description": "Setting - show quality picker" - }, - "downloadDirectory": "Download Directory", - "@downloadDirectory": { - "description": "Setting - download folder" - }, - "downloadSeparateSinglesFolder": "Separate Singles Folder", - "@downloadSeparateSinglesFolder": { - "description": "Setting - separate folder for singles" - }, - "downloadAlbumFolderStructure": "Album Folder Structure", - "@downloadAlbumFolderStructure": { - "description": "Setting - album folder organization" - }, - "albumFolderStructureDescription": "Choose how album folders are structured", - "@albumFolderStructureDescription": { - "description": "Album folder structure picker description" - }, - "downloadSelectQuality": "Select Quality", - "@downloadSelectQuality": { - "description": "Dialog title - choose audio quality" - }, - "downloadFrom": "Download From", - "@downloadFrom": { - "description": "Label - download source" - }, - "appearanceAmoledDark": "AMOLED Dark", - "@appearanceAmoledDark": { - "description": "Theme option - pure black" - }, - "appearanceAmoledDarkSubtitle": "Pure black background", - "@appearanceAmoledDarkSubtitle": { - "description": "Subtitle for AMOLED dark" - }, - "queueClearAll": "Clear All", - "@queueClearAll": { - "description": "Button - clear all queue items" - }, - "queueClearAllMessage": "Are you sure you want to clear all downloads?", - "@queueClearAllMessage": { - "description": "Clear queue confirmation" - }, - "albumFolderArtistAlbum": "Artist / Album", - "@albumFolderArtistAlbum": { - "description": "Album folder option" - }, - "albumFolderArtistAlbumSubtitle": "Albums/Artist Name/Album Name/", - "@albumFolderArtistAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistYearAlbum": "Artist / [Year] Album", - "@albumFolderArtistYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderArtistYearAlbumSubtitle": "Albums/Artist Name/[2005] Album Name/", - "@albumFolderArtistYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderAlbumOnly": "Album Only", - "@albumFolderAlbumOnly": { - "description": "Album folder option" - }, - "albumFolderAlbumOnlySubtitle": "Albums/Album Name/", - "@albumFolderAlbumOnlySubtitle": { - "description": "Folder structure example" - }, - "albumFolderYearAlbum": "[Year] Album", - "@albumFolderYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderYearAlbumSubtitle": "Albums/[2005] Album Name/", - "@albumFolderYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "downloadedAlbumDeleteSelected": "Delete Selected", - "@downloadedAlbumDeleteSelected": { - "description": "Button - delete selected tracks" - }, - "downloadedAlbumDeleteMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from this album?\n\nThis will also delete the files from storage.", - "@downloadedAlbumDeleteMessage": { - "description": "Delete confirmation with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectedCount": "{count} selected", - "@downloadedAlbumSelectedCount": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumTapToSelect": "Tap tracks to select", - "@downloadedAlbumTapToSelect": { - "description": "Selection hint" - }, - "downloadedAlbumDeleteCount": "Delete {count} {count, plural, =1{track} other{tracks}}", - "@downloadedAlbumDeleteCount": { - "description": "Delete button text with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectToDelete": "Select tracks to delete", - "@downloadedAlbumSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "downloadedAlbumDownloadedCount": "{count} downloaded", - "@downloadedAlbumDownloadedCount": { - "description": "Downloaded tracks count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "navLibrary": "Library", - "@navLibrary": { - "description": "Bottom navigation - Library tab" - }, - "historySearchHint": "Search history...", - "@historySearchHint": { - "description": "Search bar placeholder in history" - }, - "downloadSingleFilenameFormat": "Single Filename Format", - "@downloadSingleFilenameFormat": { - "description": "Setting for output filename pattern for singles/EPs" - }, - "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", - "@downloadSingleFilenameFormatDescription": { - "description": "Subtitle description for single filename format setting" - }, - "optionsDefaultSearchTab": "Default Search Tab", - "@optionsDefaultSearchTab": { - "description": "Title for the preferred default search tab setting" - }, - "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", - "@optionsDefaultSearchTabSubtitle": { - "description": "Subtitle for the preferred default search tab setting" - }, - "optionsReplayGain": "ReplayGain", - "@optionsReplayGain": { - "description": "Title for ReplayGain setting toggle" - }, - "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", - "@optionsReplayGainSubtitleOn": { - "description": "Subtitle when ReplayGain is enabled" - }, - "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", - "@optionsReplayGainSubtitleOff": { - "description": "Subtitle when ReplayGain is disabled" - }, - "optionsArtistTagMode": "Artist Tag Mode", - "@optionsArtistTagMode": { - "description": "Setting title for how artist metadata is written into files" - }, - "optionsArtistTagModeDescription": "Choose how multiple artists are written into embedded tags.", - "@optionsArtistTagModeDescription": { - "description": "Bottom-sheet description for artist tag mode setting" - }, - "optionsArtistTagModeJoined": "Single joined value", - "@optionsArtistTagModeJoined": { - "description": "Artist tag mode option that joins multiple artists into one value" - }, - "optionsArtistTagModeJoinedSubtitle": "Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.", - "@optionsArtistTagModeJoinedSubtitle": { - "description": "Subtitle for joined artist tag mode" - }, - "optionsArtistTagModeSplitVorbis": "Split tags for FLAC/Opus", - "@optionsArtistTagModeSplitVorbis": { - "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" - }, - "optionsArtistTagModeSplitVorbisSubtitle": "Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.", - "@optionsArtistTagModeSplitVorbisSubtitle": { - "description": "Subtitle for split Vorbis artist tag mode" - }, - "aboutTranslators": "Translators", - "@aboutTranslators": { - "description": "Section for translators" - }, - "aboutTelegramChannel": "Telegram Channel", - "@aboutTelegramChannel": { - "description": "Link to Telegram channel" - }, - "aboutTelegramChannelSubtitle": "Announcements and updates", - "@aboutTelegramChannelSubtitle": { - "description": "Subtitle for Telegram channel" - }, - "aboutTelegramChat": "Telegram Community", - "@aboutTelegramChat": { - "description": "Link to Telegram chat group" - }, - "aboutTelegramChatSubtitle": "Chat with other users", - "@aboutTelegramChatSubtitle": { - "description": "Subtitle for Telegram chat" - }, - "aboutSocial": "Social", - "@aboutSocial": { - "description": "Section for social links" - }, - "aboutSjdonadoDesc": "Creator of I Don't Have Spotify (IDHS). The fallback link resolver that saves the day!", - "@aboutSjdonadoDesc": { - "description": "Credit description for sjdonado" - }, - "artistPopular": "Popular", - "@artistPopular": { - "description": "Section header for popular/top tracks" - }, - "artistMonthlyListeners": "{count} monthly listeners", - "@artistMonthlyListeners": { - "description": "Monthly listener count display", - "placeholders": { - "count": { - "type": "String", - "description": "Formatted listener count" - } - } - }, - "setupIcloudNotSupported": "iCloud Drive is not supported. Please use the app Documents folder.", - "@setupIcloudNotSupported": { - "description": "Error when user selects iCloud Drive on iOS" - }, - "dialogDownload": "Download", - "@dialogDownload": { - "description": "Confirm button in Download All dialog" - }, - "csvImportTracks": "{count} tracks from CSV", - "@csvImportTracks": { - "description": "Label shown in quality picker for CSV import", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAlreadyInLibrary": "\"{trackName}\" already exists in your library", - "@snackbarAlreadyInLibrary": { - "description": "Snackbar - track already exists in local library", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "errorUrlNotRecognized": "Link not recognized", - "@errorUrlNotRecognized": { - "description": "Error title - URL not handled by any extension or service" - }, - "errorUrlNotRecognizedMessage": "This link is not supported. Make sure the URL is correct and a compatible extension is installed.", - "@errorUrlNotRecognizedMessage": { - "description": "Error message - URL not recognized explanation" - }, - "errorUrlFetchFailed": "Failed to load content from this link. Please try again.", - "@errorUrlFetchFailed": { - "description": "Error message - generic URL fetch failure" - }, - "searchSortTitle": "Sort Results", - "@searchSortTitle": { - "description": "Bottom sheet title for search sort options" - }, - "searchSortDefault": "Default", - "@searchSortDefault": { - "description": "Sort option - default API order" - }, - "searchSortTitleAZ": "Title (A-Z)", - "@searchSortTitleAZ": { - "description": "Sort option - title ascending" - }, - "searchSortTitleZA": "Title (Z-A)", - "@searchSortTitleZA": { - "description": "Sort option - title descending" - }, - "searchSortArtistAZ": "Artist (A-Z)", - "@searchSortArtistAZ": { - "description": "Sort option - artist ascending" - }, - "searchSortArtistZA": "Artist (Z-A)", - "@searchSortArtistZA": { - "description": "Sort option - artist descending" - }, - "searchSortDurationShort": "Duration (Shortest)", - "@searchSortDurationShort": { - "description": "Sort option - shortest duration first" - }, - "searchSortDurationLong": "Duration (Longest)", - "@searchSortDurationLong": { - "description": "Sort option - longest duration first" - }, - "searchSortDateOldest": "Release Date (Oldest)", - "@searchSortDateOldest": { - "description": "Sort option - oldest release first" - }, - "searchSortDateNewest": "Release Date (Newest)", - "@searchSortDateNewest": { - "description": "Sort option - newest release first" - }, - "filenameShowAdvancedTags": "Show advanced tags", - "@filenameShowAdvancedTags": { - "description": "Toggle label for showing advanced filename tags" - }, - "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", - "@filenameShowAdvancedTagsDescription": { - "description": "Description for advanced filename tag toggle" - }, - "folderOrganizationByPlaylist": "By Playlist", - "@folderOrganizationByPlaylist": { - "description": "Folder option - playlist folders" - }, - "folderOrganizationByPlaylistSubtitle": "Separate folder for each playlist", - "@folderOrganizationByPlaylistSubtitle": { - "description": "Subtitle for playlist folder option" - }, - "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", - "@providerPriorityFallbackExtensionsDescription": { - "description": "Section description for extension fallback selection" - }, - "providerPriorityFallbackExtensionsHint": "Only enabled extensions with download-provider capability are listed here.", - "@providerPriorityFallbackExtensionsHint": { - "description": "Hint below the extension fallback selection list" - }, - "sectionLyrics": "Lyrics", - "@sectionLyrics": { - "description": "Settings section header" - }, - "lyricsMode": "Lyrics Mode", - "@lyricsMode": { - "description": "Setting - how to save lyrics" - }, - "lyricsModeDescription": "Choose how lyrics are saved with your downloads", - "@lyricsModeDescription": { - "description": "Lyrics mode picker description" - }, - "lyricsModeEmbed": "Embed in file", - "@lyricsModeEmbed": { - "description": "Lyrics mode option - embed in audio file" - }, - "lyricsModeEmbedSubtitle": "Lyrics stored inside FLAC metadata", - "@lyricsModeEmbedSubtitle": { - "description": "Subtitle for embed option" - }, - "lyricsModeExternal": "External .lrc file", - "@lyricsModeExternal": { - "description": "Lyrics mode option - separate LRC file" - }, - "lyricsModeExternalSubtitle": "Separate .lrc file for players like Samsung Music", - "@lyricsModeExternalSubtitle": { - "description": "Subtitle for external option" - }, - "lyricsModeBoth": "Both", - "@lyricsModeBoth": { - "description": "Lyrics mode option - embed and external" - }, - "lyricsModeBothSubtitle": "Embed and save .lrc file", - "@lyricsModeBothSubtitle": { - "description": "Subtitle for both option" - }, - "trackGenre": "Genre", - "@trackGenre": { - "description": "Metadata label - music genre" - }, - "trackLabel": "Label", - "@trackLabel": { - "description": "Metadata label - record label" - }, - "trackCopyright": "Copyright", - "@trackCopyright": { - "description": "Metadata label - copyright information" - }, - "trackLyricsNotInFile": "No lyrics found in this file", - "@trackLyricsNotInFile": { - "description": "Message when no embedded lyrics in audio file" - }, - "trackFetchOnlineLyrics": "Fetch from Online", - "@trackFetchOnlineLyrics": { - "description": "Action - fetch lyrics from online providers" - }, - "trackEmbedLyrics": "Embed Lyrics", - "@trackEmbedLyrics": { - "description": "Action - embed lyrics into audio file" - }, - "trackLyricsEmbedded": "Lyrics embedded successfully", - "@trackLyricsEmbedded": { - "description": "Snackbar - lyrics saved to file" - }, - "trackInstrumental": "Instrumental track", - "@trackInstrumental": { - "description": "Message when track is instrumental (no lyrics)" - }, - "storeAddRepoTitle": "Add Extension Repository", - "@storeAddRepoTitle": { - "description": "Store setup screen - heading when no repo is configured" - }, - "storeAddRepoDescription": "Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.", - "@storeAddRepoDescription": { - "description": "Store setup screen - explanatory text" - }, - "storeRepoUrlLabel": "Repository URL", - "@storeRepoUrlLabel": { - "description": "Label for the repository URL input field" - }, - "storeRepoUrlHint": "https://github.com/user/repo", - "@storeRepoUrlHint": { - "description": "Hint/placeholder for the repository URL input field" - }, - "storeAddRepoButton": "Add Repository", - "@storeAddRepoButton": { - "description": "Button to submit a new repository URL" - }, - "storeChangeRepoTooltip": "Change repository", - "@storeChangeRepoTooltip": { - "description": "Tooltip for the change-repository icon button in the app bar" - }, - "storeRepoDialogTitle": "Extension Repository", - "@storeRepoDialogTitle": { - "description": "Title of the change/remove repository dialog" - }, - "storeRepoDialogCurrent": "Current repository:", - "@storeRepoDialogCurrent": { - "description": "Label shown above the current repository URL in the dialog" - }, - "storeNewRepoUrlLabel": "New Repository URL", - "@storeNewRepoUrlLabel": { - "description": "Label for the new repository URL field inside the dialog" - }, - "storeLoadError": "Failed to load repository", - "@storeLoadError": { - "description": "Error heading when the store cannot be loaded" - }, - "storeEmptyNoExtensions": "No extensions available", - "@storeEmptyNoExtensions": { - "description": "Message when store has no extensions" - }, - "storeEmptyNoResults": "No extensions found", - "@storeEmptyNoResults": { - "description": "Message when search/filter returns no results" - }, - "extensionsFallbackTitle": "Fallback Extensions", - "@extensionsFallbackTitle": { - "description": "Setting and page title for choosing which download extensions can be used during fallback" - }, - "extensionsFallbackSubtitle": "Choose which installed download extensions can be used as fallback", - "@extensionsFallbackSubtitle": { - "description": "Subtitle for download fallback extensions menu" - }, - "downloadLossy320": "Lossy 320kbps", - "@downloadLossy320": { - "description": "Quality option label for lossy 320kbps" - }, - "downloadLossyFormat": "Lossy Format", - "@downloadLossyFormat": { - "description": "Setting title to pick output format for lossy downloads" - }, - "downloadLossy320Format": "Lossy 320kbps Format", - "@downloadLossy320Format": { - "description": "Title of the lossy format picker bottom sheet" - }, - "downloadLossy320FormatDesc": "Choose the output format for 320kbps lossy downloads. The original stream will be converted to your selected format when needed.", - "@downloadLossy320FormatDesc": { - "description": "Description in the lossy format picker" - }, - "downloadLossyMp3": "MP3 320kbps", - "@downloadLossyMp3": { - "description": "lossy format option - MP3 320kbps" - }, - "downloadLossyMp3Subtitle": "Best compatibility, ~10MB per track", - "@downloadLossyMp3Subtitle": { - "description": "Subtitle for MP3 320kbps lossy option" - }, - "downloadLossyOpus256": "Opus 256kbps", - "@downloadLossyOpus256": { - "description": "lossy format option - Opus 256kbps" - }, - "downloadLossyOpus256Subtitle": "Best quality Opus, ~8MB per track", - "@downloadLossyOpus256Subtitle": { - "description": "Subtitle for Opus 256kbps lossy option" - }, - "downloadLossyOpus128": "Opus 128kbps", - "@downloadLossyOpus128": { - "description": "lossy format option - Opus 128kbps" - }, - "downloadLossyOpus128Subtitle": "Smallest size, ~4MB per track", - "@downloadLossyOpus128Subtitle": { - "description": "Subtitle for Opus 128kbps lossy option" - }, - "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", - "@downloadUseAlbumArtistForFolders": { - "description": "Setting - choose whether artist folders use Album Artist or Track Artist" - }, - "downloadUsePrimaryArtistOnly": "Primary artist only for folders", - "@downloadUsePrimaryArtistOnly": { - "description": "Setting - strip featured artists from folder name" - }, - "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", - "@downloadUsePrimaryArtistOnlyEnabled": { - "description": "Subtitle when primary artist only is enabled" - }, - "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", - "@downloadUsePrimaryArtistOnlyDisabled": { - "description": "Subtitle when primary artist only is disabled" - }, - "settingsAutoExportFailed": "Auto-export failed downloads", - "@settingsAutoExportFailed": { - "description": "Setting toggle for auto-export" - }, - "settingsAutoExportFailedSubtitle": "Save failed downloads to TXT file automatically", - "@settingsAutoExportFailedSubtitle": { - "description": "Subtitle for auto-export setting" - }, - "settingsDownloadNetwork": "Download Network", - "@settingsDownloadNetwork": { - "description": "Setting for network type preference" - }, - "settingsDownloadNetworkAny": "WiFi + Mobile Data", - "@settingsDownloadNetworkAny": { - "description": "Network option - use any connection" - }, - "settingsDownloadNetworkWifiOnly": "WiFi Only", - "@settingsDownloadNetworkWifiOnly": { - "description": "Network option - only use WiFi" - }, - "settingsDownloadNetworkSubtitle": "Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.", - "@settingsDownloadNetworkSubtitle": { - "description": "Subtitle explaining network preference" - }, - "albumFolderArtistAlbumSingles": "Artist / Album + Singles", - "@albumFolderArtistAlbumSingles": { - "description": "Album folder option with singles inside artist" - }, - "albumFolderArtistAlbumSinglesSubtitle": "Artist/Album/ and Artist/Singles/", - "@albumFolderArtistAlbumSinglesSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", - "@albumFolderArtistAlbumFlat": { - "description": "Album folder option with singles directly in artist folder" - }, - "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", - "@albumFolderArtistAlbumFlatSubtitle": { - "description": "Folder structure example for flat singles" - }, - "downloadedAlbumDiscHeader": "Disc {discNumber}", - "@downloadedAlbumDiscHeader": { - "description": "Header for disc separator in multi-disc albums", - "placeholders": { - "discNumber": { - "type": "int", - "example": "1" - } - } - }, - "recentTypeArtist": "Artist", - "@recentTypeArtist": { - "description": "Recent access item type - artist" - }, - "recentTypeAlbum": "Album", - "@recentTypeAlbum": { - "description": "Recent access item type - album" - }, - "recentTypeSong": "Song", - "@recentTypeSong": { - "description": "Recent access item type - song/track" - }, - "recentTypePlaylist": "Playlist", - "@recentTypePlaylist": { - "description": "Recent access item type - playlist" - }, - "recentEmpty": "No recent items yet", - "@recentEmpty": { - "description": "Empty state text for recent access list" - }, - "recentShowAllDownloads": "Show All Downloads", - "@recentShowAllDownloads": { - "description": "Button label to unhide hidden downloads in recent access" - }, - "recentPlaylistInfo": "Playlist: {name}", - "@recentPlaylistInfo": { - "description": "Snackbar message when tapping playlist in recent access", - "placeholders": { - "name": { - "type": "String", - "description": "Playlist name" - } - } - }, - "discographyDownload": "Download Discography", - "@discographyDownload": { - "description": "Button - download artist discography" - }, - "discographyDownloadAll": "Download All", - "@discographyDownloadAll": { - "description": "Option - download entire discography" - }, - "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", - "@discographyDownloadAllSubtitle": { - "description": "Subtitle showing total tracks and albums", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographyAlbumsOnly": "Albums Only", - "@discographyAlbumsOnly": { - "description": "Option - download only albums" - }, - "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", - "@discographyAlbumsOnlySubtitle": { - "description": "Subtitle showing album tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySinglesOnly": "Singles & EPs Only", - "@discographySinglesOnly": { - "description": "Option - download only singles" - }, - "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", - "@discographySinglesOnlySubtitle": { - "description": "Subtitle showing singles tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySelectAlbums": "Select Albums...", - "@discographySelectAlbums": { - "description": "Option - manually select albums to download" - }, - "discographySelectAlbumsSubtitle": "Choose specific albums or singles", - "@discographySelectAlbumsSubtitle": { - "description": "Subtitle for select albums option" - }, - "discographyFetchingTracks": "Fetching tracks...", - "@discographyFetchingTracks": { - "description": "Progress - fetching album tracks" - }, - "discographyFetchingAlbum": "Fetching {current} of {total}...", - "@discographyFetchingAlbum": { - "description": "Progress - fetching specific album", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "discographySelectedCount": "{count} selected", - "@discographySelectedCount": { - "description": "Selection count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographyDownloadSelected": "Download Selected", - "@discographyDownloadSelected": { - "description": "Button - download selected albums" - }, - "discographyAddedToQueue": "Added {count} tracks to queue", - "@discographyAddedToQueue": { - "description": "Snackbar - tracks added from discography", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", - "@discographySkippedDownloaded": { - "description": "Snackbar - with skipped tracks count", - "placeholders": { - "added": { - "type": "int" - }, - "skipped": { - "type": "int" - } - } - }, - "discographyNoAlbums": "No albums available", - "@discographyNoAlbums": { - "description": "Error - no albums found for artist" - }, - "discographyFailedToFetch": "Failed to fetch some albums", - "@discographyFailedToFetch": { - "description": "Error - some albums failed to load" - }, - "sectionStorageAccess": "Storage Access", - "@sectionStorageAccess": { - "description": "Section header for storage access settings" - }, - "allFilesAccess": "All Files Access", - "@allFilesAccess": { - "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" - }, - "allFilesAccessEnabledSubtitle": "Can write to any folder", - "@allFilesAccessEnabledSubtitle": { - "description": "Subtitle when all files access is enabled" - }, - "allFilesAccessDisabledSubtitle": "Limited to media folders only", - "@allFilesAccessDisabledSubtitle": { - "description": "Subtitle when all files access is disabled" - }, - "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", - "@allFilesAccessDescription": { - "description": "Description explaining when to enable all files access" - }, - "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", - "@allFilesAccessDeniedMessage": { - "description": "Message when permission is permanently denied" - }, - "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", - "@allFilesAccessDisabledMessage": { - "description": "Snackbar message when user disables all files access" - }, - "settingsLocalLibrary": "Local Library", - "@settingsLocalLibrary": { - "description": "Settings menu item - local library" - }, - "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", - "@settingsLocalLibrarySubtitle": { - "description": "Subtitle for local library settings" - }, - "settingsCache": "Storage & Cache", - "@settingsCache": { - "description": "Settings menu item - cache management" - }, - "settingsCacheSubtitle": "View size and clear cached data", - "@settingsCacheSubtitle": { - "description": "Subtitle for cache management menu" - }, - "libraryTitle": "Local Library", - "@libraryTitle": { - "description": "Library settings page title" - }, - "libraryScanSettings": "Scan Settings", - "@libraryScanSettings": { - "description": "Section header for scan settings" - }, - "libraryEnableLocalLibrary": "Enable Local Library", - "@libraryEnableLocalLibrary": { - "description": "Toggle to enable library scanning" - }, - "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", - "@libraryEnableLocalLibrarySubtitle": { - "description": "Subtitle for enable toggle" - }, - "libraryFolder": "Library Folder", - "@libraryFolder": { - "description": "Folder selection setting" - }, - "libraryFolderHint": "Tap to select folder", - "@libraryFolderHint": { - "description": "Placeholder when no folder selected" - }, - "libraryShowDuplicateIndicator": "Show Duplicate Indicator", - "@libraryShowDuplicateIndicator": { - "description": "Toggle for duplicate indicator in search" - }, - "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", - "@libraryShowDuplicateIndicatorSubtitle": { - "description": "Subtitle for duplicate indicator toggle" - }, - "libraryAutoScan": "Auto Scan", - "@libraryAutoScan": { - "description": "Setting for automatic library scanning" - }, - "libraryAutoScanSubtitle": "Automatically scan your library for new files", - "@libraryAutoScanSubtitle": { - "description": "Subtitle for auto scan setting" - }, - "libraryAutoScanOff": "Off", - "@libraryAutoScanOff": { - "description": "Auto scan disabled" - }, - "libraryAutoScanOnOpen": "Every app open", - "@libraryAutoScanOnOpen": { - "description": "Auto scan when app opens" - }, - "libraryAutoScanDaily": "Daily", - "@libraryAutoScanDaily": { - "description": "Auto scan once per day" - }, - "libraryAutoScanWeekly": "Weekly", - "@libraryAutoScanWeekly": { - "description": "Auto scan once per week" - }, - "libraryActions": "Actions", - "@libraryActions": { - "description": "Section header for library actions" - }, - "libraryScan": "Scan Library", - "@libraryScan": { - "description": "Button to start library scan" - }, - "libraryScanSubtitle": "Scan for audio files", - "@libraryScanSubtitle": { - "description": "Subtitle for scan button" - }, - "libraryScanSelectFolderFirst": "Select a folder first", - "@libraryScanSelectFolderFirst": { - "description": "Message when trying to scan without folder" - }, - "libraryCleanupMissingFiles": "Cleanup Missing Files", - "@libraryCleanupMissingFiles": { - "description": "Button to remove entries for missing files" - }, - "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", - "@libraryCleanupMissingFilesSubtitle": { - "description": "Subtitle for cleanup button" - }, - "libraryClear": "Clear Library", - "@libraryClear": { - "description": "Button to clear all library entries" - }, - "libraryClearSubtitle": "Remove all scanned tracks", - "@libraryClearSubtitle": { - "description": "Subtitle for clear button" - }, - "libraryClearConfirmTitle": "Clear Library", - "@libraryClearConfirmTitle": { - "description": "Dialog title for clear confirmation" - }, - "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", - "@libraryClearConfirmMessage": { - "description": "Dialog message for clear confirmation" - }, - "libraryAbout": "About Local Library", - "@libraryAbout": { - "description": "Section header for about info" - }, - "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", - "@libraryAboutDescription": { - "description": "Description of local library feature" - }, - "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", - "@libraryTracksUnit": { - "description": "Unit label for tracks count (without the number itself)", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryFilesUnit": "{count, plural, =1{file} other{files}}", - "@libraryFilesUnit": { - "description": "Unit label for files count during library scanning", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryLastScanned": "Last scanned: {time}", - "@libraryLastScanned": { - "description": "Last scan time display", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "libraryLastScannedNever": "Never", - "@libraryLastScannedNever": { - "description": "Shown when library has never been scanned" - }, - "libraryScanning": "Scanning...", - "@libraryScanning": { - "description": "Status during scan" - }, - "libraryScanFinalizing": "Finalizing library...", - "@libraryScanFinalizing": { - "description": "Status shown after file scanning finishes but library persistence is still running" - }, - "libraryScanProgress": "{progress}% of {total} files", - "@libraryScanProgress": { - "description": "Scan progress display", - "placeholders": { - "progress": { - "type": "String" - }, - "total": { - "type": "int" - } - } - }, - "libraryInLibrary": "In Library", - "@libraryInLibrary": { - "description": "Badge shown on tracks that exist in local library" - }, - "libraryRemovedMissingFiles": "Removed {count} missing files from library", - "@libraryRemovedMissingFiles": { - "description": "Snackbar after cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryCleared": "Library cleared", - "@libraryCleared": { - "description": "Snackbar after clearing library" - }, - "libraryStorageAccessRequired": "Storage Access Required", - "@libraryStorageAccessRequired": { - "description": "Dialog title for storage permission" - }, - "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", - "@libraryStorageAccessMessage": { - "description": "Dialog message for storage permission" - }, - "libraryFolderNotExist": "Selected folder does not exist", - "@libraryFolderNotExist": { - "description": "Error when folder doesn't exist" - }, - "librarySourceDownloaded": "Downloaded", - "@librarySourceDownloaded": { - "description": "Badge for tracks downloaded via SpotiFLAC" - }, - "librarySourceLocal": "Local", - "@librarySourceLocal": { - "description": "Badge for tracks from local library scan" - }, - "libraryFilterAll": "All", - "@libraryFilterAll": { - "description": "Filter chip - show all library items" - }, - "libraryFilterDownloaded": "Downloaded", - "@libraryFilterDownloaded": { - "description": "Filter chip - show only downloaded items" - }, - "libraryFilterLocal": "Local", - "@libraryFilterLocal": { - "description": "Filter chip - show only local library items" - }, - "libraryFilterTitle": "Filters", - "@libraryFilterTitle": { - "description": "Filter bottom sheet title" - }, - "libraryFilterReset": "Reset", - "@libraryFilterReset": { - "description": "Reset all filters button" - }, - "libraryFilterApply": "Apply", - "@libraryFilterApply": { - "description": "Apply filters button" - }, - "libraryFilterSource": "Source", - "@libraryFilterSource": { - "description": "Filter section - source type" - }, - "libraryFilterQuality": "Quality", - "@libraryFilterQuality": { - "description": "Filter section - audio quality" - }, - "libraryFilterQualityHiRes": "Hi-Res (24bit)", - "@libraryFilterQualityHiRes": { - "description": "Filter option - high resolution audio" - }, - "libraryFilterQualityCD": "CD (16bit)", - "@libraryFilterQualityCD": { - "description": "Filter option - CD quality audio" - }, - "libraryFilterQualityLossy": "Lossy", - "@libraryFilterQualityLossy": { - "description": "Filter option - lossy compressed audio" - }, - "libraryFilterFormat": "Format", - "@libraryFilterFormat": { - "description": "Filter section - file format" - }, - "libraryFilterMetadata": "Metadata", - "@libraryFilterMetadata": { - "description": "Filter section - metadata completeness" - }, - "libraryFilterMetadataComplete": "Complete metadata", - "@libraryFilterMetadataComplete": { - "description": "Filter option - items with complete metadata" - }, - "libraryFilterMetadataMissingAny": "Missing any metadata", - "@libraryFilterMetadataMissingAny": { - "description": "Filter option - items missing any tracked metadata field" - }, - "libraryFilterMetadataMissingYear": "Missing year", - "@libraryFilterMetadataMissingYear": { - "description": "Filter option - items missing release year/date" - }, - "libraryFilterMetadataMissingGenre": "Missing genre", - "@libraryFilterMetadataMissingGenre": { - "description": "Filter option - items missing genre" - }, - "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", - "@libraryFilterMetadataMissingAlbumArtist": { - "description": "Filter option - items missing album artist" - }, - "libraryFilterSort": "Sort", - "@libraryFilterSort": { - "description": "Filter section - sort order" - }, - "libraryFilterSortLatest": "Latest", - "@libraryFilterSortLatest": { - "description": "Sort option - newest first" - }, - "libraryFilterSortOldest": "Oldest", - "@libraryFilterSortOldest": { - "description": "Sort option - oldest first" - }, - "libraryFilterSortAlbumAsc": "Album (A-Z)", - "@libraryFilterSortAlbumAsc": { - "description": "Sort option - album ascending" - }, - "libraryFilterSortAlbumDesc": "Album (Z-A)", - "@libraryFilterSortAlbumDesc": { - "description": "Sort option - album descending" - }, - "libraryFilterSortGenreAsc": "Genre (A-Z)", - "@libraryFilterSortGenreAsc": { - "description": "Sort option - genre ascending" - }, - "libraryFilterSortGenreDesc": "Genre (Z-A)", - "@libraryFilterSortGenreDesc": { - "description": "Sort option - genre descending" - }, - "timeJustNow": "Just now", - "@timeJustNow": { - "description": "Relative time - less than a minute ago" - }, - "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", - "@timeMinutesAgo": { - "description": "Relative time - minutes ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", - "@timeHoursAgo": { - "description": "Relative time - hours ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC!", - "@tutorialWelcomeTitle": { - "description": "Tutorial welcome page title" - }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", - "@tutorialWelcomeDesc": { - "description": "Tutorial welcome page description" - }, - "tutorialWelcomeTip1": "Download music from Spotify, Deezer, or paste any supported URL", - "@tutorialWelcomeTip1": { - "description": "Tutorial welcome tip 1" - }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", - "@tutorialWelcomeTip2": { - "description": "Tutorial welcome tip 2" - }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", - "@tutorialWelcomeTip3": { - "description": "Tutorial welcome tip 3" - }, - "tutorialSearchTitle": "Finding Music", - "@tutorialSearchTitle": { - "description": "Tutorial search page title" - }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", - "@tutorialSearchDesc": { - "description": "Tutorial search page description" - }, - "tutorialDownloadTitle": "Downloading Music", - "@tutorialDownloadTitle": { - "description": "Tutorial download page title" - }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", - "@tutorialDownloadDesc": { - "description": "Tutorial download page description" - }, - "tutorialLibraryTitle": "Your Library", - "@tutorialLibraryTitle": { - "description": "Tutorial library page title" - }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", - "@tutorialLibraryDesc": { - "description": "Tutorial library page description" - }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", - "@tutorialLibraryTip1": { - "description": "Tutorial library tip 1" - }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", - "@tutorialLibraryTip2": { - "description": "Tutorial library tip 2" - }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", - "@tutorialLibraryTip3": { - "description": "Tutorial library tip 3" - }, - "tutorialExtensionsTitle": "Extensions", - "@tutorialExtensionsTitle": { - "description": "Tutorial extensions page title" - }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", - "@tutorialExtensionsDesc": { - "description": "Tutorial extensions page description" - }, - "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", - "@tutorialExtensionsTip1": { - "description": "Tutorial extensions tip 1" - }, - "tutorialExtensionsTip2": "Add new download providers or search sources", - "@tutorialExtensionsTip2": { - "description": "Tutorial extensions tip 2" - }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", - "@tutorialExtensionsTip3": { - "description": "Tutorial extensions tip 3" - }, - "tutorialSettingsTitle": "Customize Your Experience", - "@tutorialSettingsTitle": { - "description": "Tutorial settings page title" - }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", - "@tutorialSettingsDesc": { - "description": "Tutorial settings page description" - }, - "tutorialSettingsTip1": "Change download location and folder organization", - "@tutorialSettingsTip1": { - "description": "Tutorial settings tip 1" - }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", - "@tutorialSettingsTip2": { - "description": "Tutorial settings tip 2" - }, - "tutorialSettingsTip3": "Customize app theme and appearance", - "@tutorialSettingsTip3": { - "description": "Tutorial settings tip 3" - }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", - "@tutorialReadyMessage": { - "description": "Tutorial completion message" - }, - "libraryForceFullScan": "Force Full Scan", - "@libraryForceFullScan": { - "description": "Button to force a complete rescan of library" - }, - "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", - "@libraryForceFullScanSubtitle": { - "description": "Subtitle for force full scan button" - }, - "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", - "@cleanupOrphanedDownloads": { - "description": "Button to remove history entries for deleted files" - }, - "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", - "@cleanupOrphanedDownloadsSubtitle": { - "description": "Subtitle for orphaned cleanup button" - }, - "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", - "@cleanupOrphanedDownloadsResult": { - "description": "Snackbar after orphan cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cleanupOrphanedDownloadsNone": "No orphaned entries found", - "@cleanupOrphanedDownloadsNone": { - "description": "Snackbar when no orphans found" - }, - "cacheTitle": "Storage & Cache", - "@cacheTitle": { - "description": "Cache management page title" - }, - "cacheSummaryTitle": "Cache overview", - "@cacheSummaryTitle": { - "description": "Heading for cache summary card" - }, - "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", - "@cacheSummarySubtitle": { - "description": "Helper text for cache summary card" - }, - "cacheEstimatedTotal": "Estimated cache usage: {size}", - "@cacheEstimatedTotal": { - "description": "Total cache size shown in summary", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheSectionStorage": "Cached Data", - "@cacheSectionStorage": { - "description": "Section header for cache entries" - }, - "cacheSectionMaintenance": "Maintenance", - "@cacheSectionMaintenance": { - "description": "Section header for cleanup actions" - }, - "cacheAppDirectory": "App cache directory", - "@cacheAppDirectory": { - "description": "Cache item title for app cache directory" - }, - "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", - "@cacheAppDirectoryDesc": { - "description": "Description of what app cache directory contains" - }, - "cacheTempDirectory": "Temporary directory", - "@cacheTempDirectory": { - "description": "Cache item title for temporary files directory" - }, - "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", - "@cacheTempDirectoryDesc": { - "description": "Description of what temporary directory contains" - }, - "cacheCoverImage": "Cover image cache", - "@cacheCoverImage": { - "description": "Cache item title for persistent cover images" - }, - "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", - "@cacheCoverImageDesc": { - "description": "Description of what cover image cache contains" - }, - "cacheLibraryCover": "Library cover cache", - "@cacheLibraryCover": { - "description": "Cache item title for local library cover art images" - }, - "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", - "@cacheLibraryCoverDesc": { - "description": "Description of what library cover cache contains" - }, - "cacheExploreFeed": "Explore feed cache", - "@cacheExploreFeed": { - "description": "Cache item title for explore home feed cache" - }, - "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", - "@cacheExploreFeedDesc": { - "description": "Description of what explore feed cache contains" - }, - "cacheTrackLookup": "Track lookup cache", - "@cacheTrackLookup": { - "description": "Cache item title for track ID lookup cache" - }, - "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", - "@cacheTrackLookupDesc": { - "description": "Description of what track lookup cache contains" - }, - "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", - "@cacheCleanupUnusedDesc": { - "description": "Description of what cleanup unused data does" - }, - "cacheNoData": "No cached data", - "@cacheNoData": { - "description": "Label when cache category has no data" - }, - "cacheSizeWithFiles": "{size} in {count} files", - "@cacheSizeWithFiles": { - "description": "Cache size and file count", - "placeholders": { - "size": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "cacheSizeOnly": "{size}", - "@cacheSizeOnly": { - "description": "Cache size only", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheEntries": "{count} entries", - "@cacheEntries": { - "description": "Track cache entry count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cacheClearSuccess": "Cleared: {target}", - "@cacheClearSuccess": { - "description": "Snackbar after clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearConfirmTitle": "Clear cache?", - "@cacheClearConfirmTitle": { - "description": "Dialog title before clearing one cache category" - }, - "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", - "@cacheClearConfirmMessage": { - "description": "Dialog message before clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearAllConfirmTitle": "Clear all cache?", - "@cacheClearAllConfirmTitle": { - "description": "Dialog title before clearing all caches" - }, - "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", - "@cacheClearAllConfirmMessage": { - "description": "Dialog message before clearing all caches" - }, - "cacheClearAll": "Clear all cache", - "@cacheClearAll": { - "description": "Button label to clear all caches" - }, - "cacheCleanupUnused": "Cleanup unused data", - "@cacheCleanupUnused": { - "description": "Action title for cleaning unused entries" - }, - "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", - "@cacheCleanupUnusedSubtitle": { - "description": "Subtitle for cleanup unused data action" - }, - "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", - "@cacheCleanupResult": { - "description": "Snackbar after unused data cleanup", - "placeholders": { - "downloadCount": { - "type": "int" - }, - "libraryCount": { - "type": "int" - } - } - }, - "cacheRefreshStats": "Refresh stats", - "@cacheRefreshStats": { - "description": "Button label to refresh cache statistics" - }, - "trackSaveCoverArt": "Save Cover Art", - "@trackSaveCoverArt": { - "description": "Menu action - save album cover art as file" - }, - "trackSaveLyrics": "Save Lyrics (.lrc)", - "@trackSaveLyrics": { - "description": "Menu action - save lyrics as .lrc file" - }, - "trackSaveLyricsProgress": "Saving lyrics...", - "@trackSaveLyricsProgress": { - "description": "Snackbar while saving lyrics to file" - }, - "trackReEnrich": "Re-enrich", - "@trackReEnrich": { - "description": "Menu action - re-embed metadata into audio file" - }, - "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", - "@trackReEnrichOnlineSubtitle": { - "description": "Subtitle for re-enrich metadata action for local items" - }, - "trackReEnrichFieldCover": "Cover Art", - "@trackReEnrichFieldCover": { - "description": "Checkbox label for cover art field in re-enrich" - }, - "trackReEnrichFieldLyrics": "Lyrics", - "@trackReEnrichFieldLyrics": { - "description": "Checkbox label for lyrics field in re-enrich" - }, - "trackReEnrichFieldBasicTags": "Album, Album Artist", - "@trackReEnrichFieldBasicTags": { - "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" - }, - "trackReEnrichFieldTrackInfo": "Track & Disc Number", - "@trackReEnrichFieldTrackInfo": { - "description": "Checkbox label for track info in re-enrich" - }, - "trackReEnrichFieldReleaseInfo": "Date & ISRC", - "@trackReEnrichFieldReleaseInfo": { - "description": "Checkbox label for release info in re-enrich" - }, - "trackReEnrichFieldExtra": "Genre, Label, Copyright", - "@trackReEnrichFieldExtra": { - "description": "Checkbox label for extra metadata in re-enrich" - }, - "trackReEnrichSelectAll": "Select All", - "@trackReEnrichSelectAll": { - "description": "Select all fields checkbox in re-enrich" - }, - "trackEditMetadata": "Edit Metadata", - "@trackEditMetadata": { - "description": "Menu action - edit embedded metadata" - }, - "trackCoverSaved": "Cover art saved to {fileName}", - "@trackCoverSaved": { - "description": "Snackbar after cover art saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackCoverNoSource": "No cover art source available", - "@trackCoverNoSource": { - "description": "Snackbar when no cover art URL or embedded cover" - }, - "trackLyricsSaved": "Lyrics saved to {fileName}", - "@trackLyricsSaved": { - "description": "Snackbar after lyrics saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackReEnrichProgress": "Re-enriching metadata...", - "@trackReEnrichProgress": { - "description": "Snackbar while re-enriching metadata" - }, - "trackReEnrichSearching": "Searching metadata online...", - "@trackReEnrichSearching": { - "description": "Snackbar while searching metadata from internet for local items" - }, - "trackReEnrichSuccess": "Metadata re-enriched successfully", - "@trackReEnrichSuccess": { - "description": "Snackbar after successful re-enrichment" - }, - "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", - "@trackReEnrichFfmpegFailed": { - "description": "Snackbar when FFmpeg embed fails for MP3/Opus" - }, - "queueFlacAction": "Queue FLAC", - "@queueFlacAction": { - "description": "Action/button label for queueing FLAC redownloads for local tracks" - }, - "queueFlacConfirmMessage": "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", - "@queueFlacConfirmMessage": { - "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueFlacNoReliableMatches": "No reliable online matches found for the selection", - "@queueFlacNoReliableMatches": { - "description": "Snackbar when no safe FLAC redownload matches were found" - }, - "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", - "@queueFlacQueuedWithSkipped": { - "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", - "placeholders": { - "addedCount": { - "type": "int" - }, - "skippedCount": { - "type": "int" - } - } - }, - "trackSaveFailed": "Failed: {error}", - "@trackSaveFailed": { - "description": "Snackbar when save operation fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "trackConvertFormat": "Convert Format", - "@trackConvertFormat": { - "description": "Menu item - convert audio format" - }, - "trackConvertTitle": "Convert Audio", - "@trackConvertTitle": { - "description": "Title of convert bottom sheet" - }, - "trackConvertTargetFormat": "Target Format", - "@trackConvertTargetFormat": { - "description": "Label for format selection" - }, - "trackConvertBitrate": "Bitrate", - "@trackConvertBitrate": { - "description": "Label for bitrate selection" - }, - "trackConvertConfirmTitle": "Confirm Conversion", - "@trackConvertConfirmTitle": { - "description": "Confirmation dialog title" - }, - "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", - "@trackConvertConfirmMessage": { - "description": "Confirmation dialog message", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", - "@trackConvertConfirmMessageLossless": { - "description": "Confirmation dialog message for lossless-to-lossless conversion", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - } - } - }, - "trackConvertLosslessHint": "Lossless conversion — no quality loss", - "@trackConvertLosslessHint": { - "description": "Hint shown when converting between lossless formats" - }, - "trackConvertConverting": "Converting audio...", - "@trackConvertConverting": { - "description": "Snackbar while converting" - }, - "trackConvertSuccess": "Converted to {format} successfully", - "@trackConvertSuccess": { - "description": "Snackbar after successful conversion", - "placeholders": { - "format": { - "type": "String" - } - } - }, - "trackConvertFailed": "Conversion failed", - "@trackConvertFailed": { - "description": "Snackbar when conversion fails" - }, - "cueSplitTitle": "Split CUE Sheet", - "@cueSplitTitle": { - "description": "Title for CUE split bottom sheet" - }, - "cueSplitAlbum": "Album: {album}", - "@cueSplitAlbum": { - "description": "Album name in CUE split sheet", - "placeholders": { - "album": { - "type": "String" - } - } - }, - "cueSplitArtist": "Artist: {artist}", - "@cueSplitArtist": { - "description": "Artist name in CUE split sheet", - "placeholders": { - "artist": { - "type": "String" - } - } - }, - "cueSplitTrackCount": "{count} tracks", - "@cueSplitTrackCount": { - "description": "Number of tracks in CUE sheet", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cueSplitConfirmTitle": "Split CUE Album", - "@cueSplitConfirmTitle": { - "description": "CUE split confirmation dialog title" - }, - "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", - "@cueSplitConfirmMessage": { - "description": "CUE split confirmation dialog message", - "placeholders": { - "album": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", - "@cueSplitSplitting": { - "description": "Snackbar while splitting CUE", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "cueSplitSuccess": "Split into {count} tracks successfully", - "@cueSplitSuccess": { - "description": "Snackbar after successful CUE split", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cueSplitFailed": "CUE split failed", - "@cueSplitFailed": { - "description": "Snackbar when CUE split fails" - }, - "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", - "@cueSplitNoAudioFile": { - "description": "Error when CUE audio file is missing" - }, - "cueSplitButton": "Split into Tracks", - "@cueSplitButton": { - "description": "Button text to start CUE splitting" - }, - "actionCreate": "Create", - "@actionCreate": { - "description": "Generic action button - create" - }, - "collectionFoldersTitle": "My folders", - "@collectionFoldersTitle": { - "description": "Library section title for custom folders" - }, - "collectionWishlist": "Wishlist", - "@collectionWishlist": { - "description": "Custom folder for saved tracks to download later" - }, - "collectionLoved": "Loved", - "@collectionLoved": { - "description": "Custom folder for favorite tracks" - }, - "collectionPlaylist": "Playlist", - "@collectionPlaylist": { - "description": "Single playlist label" - }, - "collectionAddToPlaylist": "Add to playlist", - "@collectionAddToPlaylist": { - "description": "Action to add a track to user playlist" - }, - "collectionCreatePlaylist": "Create playlist", - "@collectionCreatePlaylist": { - "description": "Action to create a new playlist" - }, - "collectionNoPlaylistsYet": "No playlists yet", - "@collectionNoPlaylistsYet": { - "description": "Empty state title when user has no playlists" - }, - "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", - "@collectionPlaylistTracks": { - "description": "Track count label for custom playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionAddedToPlaylist": "Added to \"{playlistName}\"", - "@collectionAddedToPlaylist": { - "description": "Snackbar after adding track to playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", - "@collectionAlreadyInPlaylist": { - "description": "Snackbar when track already exists in playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistNameHint": "Playlist name", - "@collectionPlaylistNameHint": { - "description": "Hint text for playlist name input" - }, - "collectionPlaylistNameRequired": "Playlist name is required", - "@collectionPlaylistNameRequired": { - "description": "Validation error for empty playlist name" - }, - "collectionRenamePlaylist": "Rename playlist", - "@collectionRenamePlaylist": { - "description": "Action to rename playlist" - }, - "collectionDeletePlaylist": "Delete playlist", - "@collectionDeletePlaylist": { - "description": "Action to delete playlist" - }, - "collectionPlaylistRenamed": "Playlist renamed", - "@collectionPlaylistRenamed": { - "description": "Snackbar after renaming playlist" - }, - "collectionWishlistEmptyTitle": "Wishlist is empty", - "@collectionWishlistEmptyTitle": { - "description": "Wishlist empty state title" - }, - "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", - "@collectionWishlistEmptySubtitle": { - "description": "Wishlist empty state subtitle" - }, - "collectionLovedEmptyTitle": "Loved folder is empty", - "@collectionLovedEmptyTitle": { - "description": "Loved empty state title" - }, - "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", - "@collectionLovedEmptySubtitle": { - "description": "Loved empty state subtitle" - }, - "collectionPlaylistEmptyTitle": "Playlist is empty", - "@collectionPlaylistEmptyTitle": { - "description": "Playlist empty state title" - }, - "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", - "@collectionPlaylistEmptySubtitle": { - "description": "Playlist empty state subtitle" - }, - "collectionRemoveFromPlaylist": "Remove from playlist", - "@collectionRemoveFromPlaylist": { - "description": "Tooltip for removing track from playlist" - }, - "collectionRemoveFromFolder": "Remove from folder", - "@collectionRemoveFromFolder": { - "description": "Tooltip for removing track from wishlist/loved folder" - }, - "collectionAddedToLoved": "\"{trackName}\" added to Loved", - "@collectionAddedToLoved": { - "description": "Snackbar after adding track to loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", - "@collectionRemovedFromLoved": { - "description": "Snackbar after removing track from loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", - "@collectionAddedToWishlist": { - "description": "Snackbar after adding track to wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", - "@collectionRemovedFromWishlist": { - "description": "Snackbar after removing track from wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "trackOptionAddToLoved": "Add to Loved", - "@trackOptionAddToLoved": { - "description": "Bottom sheet action label - add track to loved folder" - }, - "trackOptionRemoveFromLoved": "Remove from Loved", - "@trackOptionRemoveFromLoved": { - "description": "Bottom sheet action label - remove track from loved folder" - }, - "trackOptionAddToWishlist": "Add to Wishlist", - "@trackOptionAddToWishlist": { - "description": "Bottom sheet action label - add track to wishlist" - }, - "trackOptionRemoveFromWishlist": "Remove from Wishlist", - "@trackOptionRemoveFromWishlist": { - "description": "Bottom sheet action label - remove track from wishlist" - }, - "collectionPlaylistChangeCover": "Change cover image", - "@collectionPlaylistChangeCover": { - "description": "Bottom sheet action to pick a custom cover image for a playlist" - }, - "collectionPlaylistRemoveCover": "Remove cover image", - "@collectionPlaylistRemoveCover": { - "description": "Bottom sheet action to remove custom cover image from a playlist" - }, - "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", - "@selectionShareCount": { - "description": "Share button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionShareNoFiles": "No shareable files found", - "@selectionShareNoFiles": { - "description": "Snackbar when no selected files exist on disk" - }, - "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", - "@selectionConvertCount": { - "description": "Convert button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionConvertNoConvertible": "No convertible tracks selected", - "@selectionConvertNoConvertible": { - "description": "Snackbar when no selected tracks support conversion" - }, - "selectionBatchConvertConfirmTitle": "Batch Convert", - "@selectionBatchConvertConfirmTitle": { - "description": "Confirmation dialog title for batch conversion" - }, - "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessage": { - "description": "Confirmation dialog message for batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessageLossless": { - "description": "Confirmation dialog message for lossless batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", - "@selectionBatchConvertSuccess": { - "description": "Snackbar after batch conversion completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", - "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { - "description": "Subtitle when album artist is used for folder names" - }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", - "@downloadUseAlbumArtistForFoldersTrackSubtitle": { - "description": "Subtitle when track artist is used for folder names" - }, - "lyricsProvidersTitle": "Lyrics Provider Priority", - "@lyricsProvidersTitle": { - "description": "Settings item title for lyrics provider order" - }, - "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", - "@lyricsProvidersDescription": { - "description": "Description on the lyrics provider priority page" - }, - "lyricsProvidersInfoText": "Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.", - "@lyricsProvidersInfoText": { - "description": "Info tip on lyrics provider priority page" - }, - "lyricsProvidersEnabledSection": "Enabled ({count})", - "@lyricsProvidersEnabledSection": { - "description": "Section header for enabled providers", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "lyricsProvidersDisabledSection": "Disabled ({count})", - "@lyricsProvidersDisabledSection": { - "description": "Section header for disabled providers", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", - "@lyricsProvidersAtLeastOne": { - "description": "Snackbar when user tries to disable the last enabled provider" - }, - "lyricsProvidersSaved": "Lyrics provider priority saved", - "@lyricsProvidersSaved": { - "description": "Snackbar after saving lyrics provider priority" - }, - "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", - "@lyricsProvidersDiscardContent": { - "description": "Body text of the discard-changes dialog on lyrics provider page" - }, - "lyricsProviderLrclibDesc": "Open-source synced lyrics database", - "@lyricsProviderLrclibDesc": { - "description": "Description for LRCLIB provider" - }, - "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", - "@lyricsProviderNeteaseDesc": { - "description": "Description for Netease provider" - }, - "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", - "@lyricsProviderMusixmatchDesc": { - "description": "Description for Musixmatch provider" - }, - "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", - "@lyricsProviderAppleMusicDesc": { - "description": "Description for Apple Music provider" - }, - "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", - "@lyricsProviderQqMusicDesc": { - "description": "Description for QQ Music provider" - }, - "lyricsProviderExtensionDesc": "Extension provider", - "@lyricsProviderExtensionDesc": { - "description": "Generic description for extension-based lyrics providers" - }, - "safMigrationTitle": "Storage Update Required", - "@safMigrationTitle": { - "description": "Title of SAF migration dialog" - }, - "safMigrationMessage1": "SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.", - "@safMigrationMessage1": { - "description": "First paragraph of SAF migration dialog" - }, - "safMigrationMessage2": "Please select your download folder again to switch to the new storage system.", - "@safMigrationMessage2": { - "description": "Second paragraph of SAF migration dialog" - }, - "safMigrationSuccess": "Download folder updated to SAF mode", - "@safMigrationSuccess": { - "description": "Snackbar after successfully migrating to SAF" - }, - "settingsDonate": "Support Development", - "@settingsDonate": { - "description": "Settings menu item - donate page" - }, - "settingsDonateSubtitle": "Buy the developer a coffee", - "@settingsDonateSubtitle": { - "description": "Subtitle for donate menu item" - }, - "tooltipLoveAll": "Love All", - "@tooltipLoveAll": { - "description": "Tooltip for the Love All button on album/playlist screens" - }, - "tooltipAddToPlaylist": "Add to Playlist", - "@tooltipAddToPlaylist": { - "description": "Tooltip for the Add to Playlist button" - }, - "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", - "@snackbarRemovedTracksFromLoved": { - "description": "Snackbar after removing multiple tracks from Loved folder", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", - "@snackbarAddedTracksToLoved": { - "description": "Snackbar after adding multiple tracks to Loved folder", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogDownloadAllTitle": "Download All", - "@dialogDownloadAllTitle": { - "description": "Dialog title for bulk download confirmation" - }, - "dialogDownloadAllMessage": "Download {count} tracks?", - "@dialogDownloadAllMessage": { - "description": "Body of the Download All confirmation dialog", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "homeSkipAlreadyDownloaded": "Skip already downloaded songs", - "@homeSkipAlreadyDownloaded": { - "description": "Checkbox label in import dialog to skip already-downloaded songs" - }, - "homeGoToAlbum": "Go to Album", - "@homeGoToAlbum": { - "description": "Context menu item to navigate to the album page" - }, - "homeAlbumInfoUnavailable": "Album info not available", - "@homeAlbumInfoUnavailable": { - "description": "Snackbar when album info cannot be loaded" - }, - "snackbarLoadingCueSheet": "Loading CUE sheet...", - "@snackbarLoadingCueSheet": { - "description": "Snackbar while loading a CUE sheet file" - }, - "snackbarMetadataSaved": "Metadata saved successfully", - "@snackbarMetadataSaved": { - "description": "Snackbar after successfully saving track metadata" - }, - "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", - "@snackbarFailedToEmbedLyrics": { - "description": "Snackbar when lyrics embedding fails" - }, - "snackbarFailedToWriteStorage": "Failed to write back to storage", - "@snackbarFailedToWriteStorage": { - "description": "Snackbar when writing metadata back to file fails" - }, - "snackbarError": "Error: {error}", - "@snackbarError": { - "description": "Generic error snackbar with error detail", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "snackbarNoActionDefined": "No action defined for this button", - "@snackbarNoActionDefined": { - "description": "Snackbar when an extension button has no action configured" - }, - "noTracksFoundForAlbum": "No tracks found for this album", - "@noTracksFoundForAlbum": { - "description": "Empty state message when an album has no tracks" - }, - "downloadLocationSubtitle": "Choose where to save your downloaded tracks", - "@downloadLocationSubtitle": { - "description": "Subtitle shown in the download location picker sheet" - }, - "storageModeAppFolder": "App Folder (Recommended)", - "@storageModeAppFolder": { - "description": "Storage mode option - app-managed folder" - }, - "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", - "@storageModeAppFolderSubtitle": { - "description": "Subtitle for app folder storage mode" - }, - "storageModeSaf": "Custom Folder (SAF)", - "@storageModeSaf": { - "description": "Storage mode option - Storage Access Framework" - }, - "storageModeSafSubtitle": "Pick any folder, including SD card", - "@storageModeSafSubtitle": { - "description": "Subtitle for SAF storage mode" - }, - "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", - "@downloadFilenameDescription": { - "description": "Description shown in filename format editor" - }, - "downloadFilenameInsertTag": "Tap to insert tag:", - "@downloadFilenameInsertTag": { - "description": "Label above filename tag chips" - }, - "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", - "@downloadSeparateSinglesEnabled": { - "description": "Subtitle when separate singles folder is on" - }, - "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", - "@downloadSeparateSinglesDisabled": { - "description": "Subtitle when separate singles folder is off" - }, - "downloadArtistNameFilters": "Artist Name Filters", - "@downloadArtistNameFilters": { - "description": "Setting title for artist folder filter options" - }, - "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", - "@downloadCreatePlaylistSourceFolder": { - "description": "Setting to create a subfolder per playlist source" - }, - "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", - "@downloadCreatePlaylistSourceFolderEnabled": { - "description": "Subtitle when playlist folder is enabled" - }, - "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", - "@downloadCreatePlaylistSourceFolderDisabled": { - "description": "Subtitle when playlist folder is disabled" - }, - "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", - "@downloadCreatePlaylistSourceFolderRedundant": { - "description": "Subtitle when folder organization is already set to playlist" - }, - "downloadSongLinkRegion": "SongLink Region", - "@downloadSongLinkRegion": { - "description": "Setting for SongLink region used during fallback resolution" - }, - "downloadNetworkCompatibilityMode": "Network Compatibility Mode", - "@downloadNetworkCompatibilityMode": { - "description": "Setting for legacy TLS/network handling" - }, - "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", - "@downloadNetworkCompatibilityModeEnabled": { - "description": "Subtitle when network compatibility mode is on" - }, - "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", - "@downloadNetworkCompatibilityModeDisabled": { - "description": "Subtitle when network compatibility mode is off" - }, - "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", - "@downloadSelectServiceToEnable": { - "description": "Subtitle when quality picker is disabled due to extension service" - }, - "downloadEmbedLyricsDisabled": "Enable metadata embedding first", - "@downloadEmbedLyricsDisabled": { - "description": "Subtitle when lyrics embedding is blocked by metadata toggle" - }, - "downloadNeteaseIncludeTranslation": "Netease: Include Translation", - "@downloadNeteaseIncludeTranslation": { - "description": "Setting to include translated lyrics from Netease" - }, - "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", - "@downloadNeteaseIncludeTranslationEnabled": { - "description": "Subtitle when Netease translation is on" - }, - "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", - "@downloadNeteaseIncludeTranslationDisabled": { - "description": "Subtitle when Netease translation is off" - }, - "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", - "@downloadNeteaseIncludeRomanization": { - "description": "Setting to include romanized lyrics from Netease" - }, - "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", - "@downloadNeteaseIncludeRomanizationEnabled": { - "description": "Subtitle when Netease romanization is on" - }, - "downloadNeteaseIncludeRomanizationDisabled": "No romanization", - "@downloadNeteaseIncludeRomanizationDisabled": { - "description": "Subtitle when Netease romanization is off" - }, - "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", - "@downloadAppleQqMultiPerson": { - "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" - }, - "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", - "@downloadAppleQqMultiPersonEnabled": { - "description": "Subtitle when multi-person lyrics is on" - }, - "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", - "@downloadAppleQqMultiPersonDisabled": { - "description": "Subtitle when multi-person lyrics is off" - }, - "downloadMusixmatchLanguage": "Musixmatch Language", - "@downloadMusixmatchLanguage": { - "description": "Setting for Musixmatch lyrics translation language" - }, - "downloadMusixmatchLanguageAuto": "Auto (original language)", - "@downloadMusixmatchLanguageAuto": { - "description": "Subtitle when no language is set" - }, - "downloadFilterContributing": "Filter Contributing Artists", - "@downloadFilterContributing": { - "description": "Setting to strip contributing artists from Album Artist folder name" - }, - "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", - "@downloadFilterContributingEnabled": { - "description": "Subtitle when contributing artist filter is on" - }, - "downloadFilterContributingDisabled": "Full Album Artist string used", - "@downloadFilterContributingDisabled": { - "description": "Subtitle when contributing artist filter is off" - }, - "downloadProvidersNoneEnabled": "No providers enabled", - "@downloadProvidersNoneEnabled": { - "description": "Shown when no lyrics providers are active" - }, - "downloadMusixmatchLanguageCode": "Language code", - "@downloadMusixmatchLanguageCode": { - "description": "Label for Musixmatch language input field" - }, - "downloadMusixmatchLanguageHint": "e.g. en, de, ja", - "@downloadMusixmatchLanguageHint": { - "description": "Placeholder for Musixmatch language input" - }, - "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", - "@downloadMusixmatchLanguageDesc": { - "description": "Description in Musixmatch language picker" - }, - "downloadMusixmatchAuto": "Auto", - "@downloadMusixmatchAuto": { - "description": "Button to clear Musixmatch language (use auto)" - }, - "downloadNetworkAnySubtitle": "Use WiFi or mobile data", - "@downloadNetworkAnySubtitle": { - "description": "Subtitle for any-network option in picker" - }, - "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", - "@downloadNetworkWifiOnlySubtitle": { - "description": "Subtitle for WiFi-only option in picker" - }, - "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", - "@downloadSongLinkRegionDesc": { - "description": "Description in SongLink region picker" - }, - "snackbarUnsupportedAudioFormat": "Unsupported audio format", - "@snackbarUnsupportedAudioFormat": { - "description": "Snackbar when the audio format is not supported for the requested operation" - }, - "cacheRefresh": "Refresh", - "@cacheRefresh": { - "description": "Tooltip for refresh button on cache management page" - }, - "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", - "@dialogDownloadPlaylistsMessage": { - "description": "Dialog message for bulk playlist download confirmation", - "placeholders": { - "trackCount": { - "type": "int" - }, - "playlistCount": { - "type": "int" - } - } - }, - "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", - "@bulkDownloadPlaylistsButton": { - "description": "Button label for bulk downloading selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "bulkDownloadSelectPlaylists": "Select playlists to download", - "@bulkDownloadSelectPlaylists": { - "description": "Button label when no playlists are selected for download" - }, - "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", - "@snackbarSelectedPlaylistsEmpty": { - "description": "Snackbar when selected playlists contain no tracks" - }, - "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", - "@playlistsCount": { - "description": "Playlist count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "editMetadataAutoFill": "Auto-fill from online", - "@editMetadataAutoFill": { - "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" - }, - "editMetadataAutoFillDesc": "Select fields to fill automatically from online metadata", - "@editMetadataAutoFillDesc": { - "description": "Description for the auto-fill section" - }, - "editMetadataAutoFillFetch": "Fetch & Fill", - "@editMetadataAutoFillFetch": { - "description": "Button label to fetch online metadata and fill selected fields" - }, - "editMetadataAutoFillSearching": "Searching online...", - "@editMetadataAutoFillSearching": { - "description": "Snackbar shown while searching for online metadata" - }, - "editMetadataAutoFillNoResults": "No matching metadata found online", - "@editMetadataAutoFillNoResults": { - "description": "Snackbar when online metadata search returns no results" - }, - "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", - "@editMetadataAutoFillDone": { - "description": "Snackbar confirming how many fields were auto-filled", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", - "@editMetadataAutoFillNoneSelected": { - "description": "Snackbar when user taps Fetch without selecting any fields" - }, - "editMetadataFieldTitle": "Title", - "@editMetadataFieldTitle": { - "description": "Chip label for title field in auto-fill selector" - }, - "editMetadataFieldArtist": "Artist", - "@editMetadataFieldArtist": { - "description": "Chip label for artist field in auto-fill selector" - }, - "editMetadataFieldAlbum": "Album", - "@editMetadataFieldAlbum": { - "description": "Chip label for album field in auto-fill selector" - }, - "editMetadataFieldAlbumArtist": "Album Artist", - "@editMetadataFieldAlbumArtist": { - "description": "Chip label for album artist field in auto-fill selector" - }, - "editMetadataFieldDate": "Date", - "@editMetadataFieldDate": { - "description": "Chip label for date field in auto-fill selector" - }, - "editMetadataFieldTrackNum": "Track #", - "@editMetadataFieldTrackNum": { - "description": "Chip label for track number field in auto-fill selector" - }, - "editMetadataFieldDiscNum": "Disc #", - "@editMetadataFieldDiscNum": { - "description": "Chip label for disc number field in auto-fill selector" - }, - "editMetadataFieldGenre": "Genre", - "@editMetadataFieldGenre": { - "description": "Chip label for genre field in auto-fill selector" - }, - "editMetadataFieldIsrc": "ISRC", - "@editMetadataFieldIsrc": { - "description": "Chip label for ISRC field in auto-fill selector" - }, - "editMetadataFieldLabel": "Label", - "@editMetadataFieldLabel": { - "description": "Chip label for label field in auto-fill selector" - }, - "editMetadataFieldCopyright": "Copyright", - "@editMetadataFieldCopyright": { - "description": "Chip label for copyright field in auto-fill selector" - }, - "editMetadataFieldCover": "Cover Art", - "@editMetadataFieldCover": { - "description": "Chip label for cover art field in auto-fill selector" - }, - "editMetadataSelectAll": "All", - "@editMetadataSelectAll": { - "description": "Button to select all fields for auto-fill" - }, - "editMetadataSelectEmpty": "Empty only", - "@editMetadataSelectEmpty": { - "description": "Button to select only fields that are currently empty" - }, - "queueDownloadingCount": "Downloading ({count})", - "@queueDownloadingCount": { - "description": "Header for active downloads section with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueFilteringIndicator": "Filtering...", - "@queueFilteringIndicator": { - "description": "Shown while filter results are being computed" - }, - "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", - "@queueTrackCount": { - "description": "Track count label with plural support", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueAlbumCount": "{count, plural, =1{1 album} other{{count} albums}}", - "@queueAlbumCount": { - "description": "Album count label with plural support", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueEmptyAlbums": "No album downloads", - "@queueEmptyAlbums": { - "description": "Empty state title when no album downloads exist" - }, - "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", - "@queueEmptyAlbumsSubtitle": { - "description": "Empty state subtitle for album downloads" - }, - "queueEmptySingles": "No single downloads", - "@queueEmptySingles": { - "description": "Empty state title when no single track downloads exist" - }, - "queueEmptySinglesSubtitle": "Single track downloads will appear here", - "@queueEmptySinglesSubtitle": { - "description": "Empty state subtitle for single track downloads" - }, - "queueEmptyHistory": "No download history", - "@queueEmptyHistory": { - "description": "Empty state title when download history is empty" - }, - "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", - "@queueEmptyHistorySubtitle": { - "description": "Empty state subtitle for download history" - }, - "selectionAllPlaylistsSelected": "All playlists selected", - "@selectionAllPlaylistsSelected": { - "description": "Shown when all playlists are selected in selection mode" - }, - "selectionTapPlaylistsToSelect": "Tap playlists to select", - "@selectionTapPlaylistsToSelect": { - "description": "Hint shown in playlist selection mode" - }, - "selectionSelectPlaylistsToDelete": "Select playlists to delete", - "@selectionSelectPlaylistsToDelete": { - "description": "Hint shown when no playlists are selected for deletion" - }, - "audioAnalysisTitle": "Audio Quality Analysis", - "@audioAnalysisTitle": { - "description": "Title for audio analysis section" - }, - "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", - "@audioAnalysisDescription": { - "description": "Description for audio analysis tap-to-analyze prompt" - }, - "audioAnalysisAnalyzing": "Analyzing audio...", - "@audioAnalysisAnalyzing": { - "description": "Loading text while analyzing audio" - }, - "audioAnalysisSampleRate": "Sample Rate", - "@audioAnalysisSampleRate": { - "description": "Sample rate metric label" - }, - "audioAnalysisBitDepth": "Bit Depth", - "@audioAnalysisBitDepth": { - "description": "Bit depth metric label" - }, - "audioAnalysisChannels": "Channels", - "@audioAnalysisChannels": { - "description": "Channels metric label" - }, - "audioAnalysisDuration": "Duration", - "@audioAnalysisDuration": { - "description": "Duration metric label" - }, - "audioAnalysisNyquist": "Nyquist", - "@audioAnalysisNyquist": { - "description": "Nyquist frequency metric label" - }, - "audioAnalysisFileSize": "Size", - "@audioAnalysisFileSize": { - "description": "File size metric label" - }, - "audioAnalysisDynamicRange": "Dynamic Range", - "@audioAnalysisDynamicRange": { - "description": "Dynamic range metric label" - }, - "audioAnalysisPeak": "Peak", - "@audioAnalysisPeak": { - "description": "Peak amplitude metric label" - }, - "audioAnalysisRms": "RMS", - "@audioAnalysisRms": { - "description": "RMS level metric label" - }, - "audioAnalysisSamples": "Samples", - "@audioAnalysisSamples": { - "description": "Total samples metric label" - }, - "audioAnalysisRescan": "Re-analyze", - "@audioAnalysisRescan": { - "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" - }, - "audioAnalysisRescanning": "Re-analyzing audio...", - "@audioAnalysisRescanning": { - "description": "Loading text while audio is being re-analyzed after an explicit refresh" - }, - "extensionsHomeFeedProvider": "Home Feed Provider", - "@extensionsHomeFeedProvider": { - "description": "Extensions page - label for home feed provider selector" - }, - "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", - "@extensionsHomeFeedDescription": { - "description": "Extensions page - description for home feed provider picker" - }, - "extensionsHomeFeedAuto": "Auto", - "@extensionsHomeFeedAuto": { - "description": "Label for auto-selected search provider" - }, - "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", - "@extensionsHomeFeedAutoSubtitle": { - "description": "Extensions page - subtitle for auto home feed option" - }, - "extensionsHomeFeedUse": "Use {extensionName} home feed", - "@extensionsHomeFeedUse": { - "description": "Extensions page - subtitle for a specific extension home feed option", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "extensionsNoHomeFeedExtensions": "No extensions with home feed", - "@extensionsNoHomeFeedExtensions": { - "description": "Extensions page - shown when no installed extension has home feed" - }, - "cancelDownloadTitle": "Cancel download?", - "@cancelDownloadTitle": { - "description": "Dialog title when confirming cancellation of an active download" - }, - "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", - "@cancelDownloadContent": { - "description": "Dialog body when confirming cancellation of an active download", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "cancelDownloadKeep": "Keep", - "@cancelDownloadKeep": { - "description": "Dialog button - keep the active download (do not cancel)" - }, - "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", - "@metadataSaveFailedFfmpeg": { - "description": "Snackbar error when FFmpeg fails to write metadata" - }, - "metadataSaveFailedStorage": "Failed to write metadata back to storage", - "@metadataSaveFailedStorage": { - "description": "Snackbar error when writing metadata file back to storage fails" - }, - "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", - "@snackbarFolderPickerFailed": { - "description": "Snackbar shown when folder picker fails to open", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "notifDownloadingTrack": "Downloading {trackName}", - "@notifDownloadingTrack": { - "description": "Notification title while downloading a track", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "notifFinalizingTrack": "Finalizing {trackName}", - "@notifFinalizingTrack": { - "description": "Notification title while finalizing (embedding metadata) a track", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "notifEmbeddingMetadata": "Embedding metadata...", - "@notifEmbeddingMetadata": { - "description": "Notification body while embedding metadata into a downloaded track" - }, - "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", - "@notifAlreadyInLibraryCount": { - "description": "Notification title when track is already in library, with count", - "placeholders": { - "completed": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "notifAlreadyInLibrary": "Already in Library", - "@notifAlreadyInLibrary": { - "description": "Notification title when track is already in library" - }, - "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", - "@notifDownloadCompleteCount": { - "description": "Notification title when download is complete, with count", - "placeholders": { - "completed": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "notifDownloadComplete": "Download Complete", - "@notifDownloadComplete": { - "description": "Notification title when a single download is complete" - }, - "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", - "@notifDownloadsFinished": { - "description": "Notification title when queue finishes with some failures", - "placeholders": { - "completed": { - "type": "int" - }, - "failed": { - "type": "int" - } - } - }, - "notifAllDownloadsComplete": "All Downloads Complete", - "@notifAllDownloadsComplete": { - "description": "Notification title when all downloads finish successfully" - }, - "notifTracksDownloadedSuccess": "{count} tracks downloaded successfully", - "@notifTracksDownloadedSuccess": { - "description": "Notification body for queue complete - how many tracks were downloaded", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifScanningLibrary": "Scanning local library", - "@notifScanningLibrary": { - "description": "Notification title while scanning local library" - }, - "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", - "@notifLibraryScanProgressWithTotal": { - "description": "Notification body for library scan progress when total is known", - "placeholders": { - "scanned": { - "type": "int" - }, - "total": { - "type": "int" - }, - "percentage": { - "type": "int" - } - } - }, - "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", - "@notifLibraryScanProgressNoTotal": { - "description": "Notification body for library scan progress when total is unknown", - "placeholders": { - "scanned": { - "type": "int" - }, - "percentage": { - "type": "int" - } - } - }, - "notifLibraryScanComplete": "Library scan complete", - "@notifLibraryScanComplete": { - "description": "Notification title when library scan finishes" - }, - "notifLibraryScanCompleteBody": "{count} tracks indexed", - "@notifLibraryScanCompleteBody": { - "description": "Notification body for library scan complete - number of indexed tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanExcluded": "{count} excluded", - "@notifLibraryScanExcluded": { - "description": "Library scan complete suffix - excluded track count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanErrors": "{count} errors", - "@notifLibraryScanErrors": { - "description": "Library scan complete suffix - error count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanFailed": "Library scan failed", - "@notifLibraryScanFailed": { - "description": "Notification title when library scan fails" - }, - "notifLibraryScanCancelled": "Library scan cancelled", - "@notifLibraryScanCancelled": { - "description": "Notification title when library scan is cancelled by the user" - }, - "notifLibraryScanStopped": "Scan stopped before completion.", - "@notifLibraryScanStopped": { - "description": "Notification body when library scan is cancelled" - }, - "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", - "@notifDownloadingUpdate": { - "description": "Notification title while downloading an app update", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "notifUpdateProgress": "{received} / {total} MB • {percentage}%", - "@notifUpdateProgress": { - "description": "Notification body showing update download progress", - "placeholders": { - "received": { - "type": "String" - }, - "total": { - "type": "String" - }, - "percentage": { - "type": "int" - } - } - }, - "notifUpdateReady": "Update Ready", - "@notifUpdateReady": { - "description": "Notification title when app update download is complete" - }, - "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", - "@notifUpdateReadyBody": { - "description": "Notification body when app update is ready to install", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "notifUpdateFailed": "Update Failed", - "@notifUpdateFailed": { - "description": "Notification title when app update download fails" - }, - "notifUpdateFailedBody": "Could not download update. Try again later.", - "@notifUpdateFailedBody": { - "description": "Notification body when app update download fails" - }, - "settingsFiles": "Files & Folders", - "@settingsFiles": { - "description": "Settings menu item - file and folder settings" - }, - "settingsFilesSubtitle": "Download location, filename, folder structure", - "@settingsFilesSubtitle": { - "description": "Subtitle for files & folders settings" - }, - "settingsMetadata": "Metadata", - "@settingsMetadata": { - "description": "Settings menu item - metadata settings" - }, - "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", - "@settingsMetadataSubtitle": { - "description": "Subtitle for metadata settings" - }, - "settingsLyrics": "Lyrics", - "@settingsLyrics": { - "description": "Settings menu item - lyrics settings" - }, - "settingsLyricsSubtitle": "Embed, mode, providers, language options", - "@settingsLyricsSubtitle": { - "description": "Subtitle for lyrics settings" - }, - "settingsApp": "App", - "@settingsApp": { - "description": "Settings menu item - app settings" - }, - "settingsAppSubtitle": "Updates, data, extension repo, debug", - "@settingsAppSubtitle": { - "description": "Subtitle for app settings" - }, - "sectionMetadataProviders": "Providers", - "@sectionMetadataProviders": { - "description": "Settings section header for metadata providers" - }, - "sectionDuplicates": "Duplicates", - "@sectionDuplicates": { - "description": "Settings section header for deduplication" - }, - "sectionLyricsProviderOptions": "Provider Options", - "@sectionLyricsProviderOptions": { - "description": "Settings section header for per-provider lyrics options" - }, - "metadataProvidersTitle": "Metadata Provider Priority", - "@metadataProvidersTitle": { - "description": "Settings item title for metadata provider order" - }, - "metadataProvidersSubtitle": "Drag to set search and metadata source order", - "@metadataProvidersSubtitle": { - "description": "Subtitle for metadata provider priority item" - }, - "downloadDeduplication": "Skip Duplicate Downloads", - "@downloadDeduplication": { - "description": "Setting - skip tracks already in download history" - }, - "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", - "@downloadDeduplicationEnabled": { - "description": "Subtitle when deduplication is on" - }, - "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", - "@downloadDeduplicationDisabled": { - "description": "Subtitle when deduplication is off" - }, - "downloadFallbackExtensions": "Fallback Extensions", - "@downloadFallbackExtensions": { - "description": "Settings item for configuring fallback extension providers" - }, - "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", - "@downloadFallbackExtensionsSubtitle": { - "description": "Subtitle for fallback extensions item" - } -} diff --git a/lib/l10n/arb/app_zh_CN.arb b/lib/l10n/arb/app_zh_CN.arb deleted file mode 100644 index 5a4859f0..00000000 --- a/lib/l10n/arb/app_zh_CN.arb +++ /dev/null @@ -1,5887 +0,0 @@ -{ - "@@locale": "zh_CN", - "@@last_modified": "2026-04-28", - "appName": "SpotiFLAC 移动版", - "@appName": { - "description": "App name - DO NOT TRANSLATE" - }, - "navHome": "主页", - "@navHome": { - "description": "Bottom navigation - Home tab" - }, - "navLibrary": "乐库", - "@navLibrary": { - "description": "Bottom navigation - Library tab" - }, - "navSettings": "设置", - "@navSettings": { - "description": "Bottom navigation - Settings tab" - }, - "navStore": "仓库", - "@navStore": { - "description": "Bottom navigation - Extension store tab" - }, - "homeTitle": "主页", - "@homeTitle": { - "description": "Home screen title" - }, - "homeSubtitle": "粘贴支持的 URL 或按名称搜索", - "@homeSubtitle": { - "description": "Subtitle shown below search box" - }, - "homeEmptyTitle": "暂无搜索提供商", - "@homeEmptyTitle": { - "description": "Title shown on home when no providers are available yet" - }, - "homeEmptySubtitle": "安装一个拓展以继续。", - "@homeEmptySubtitle": { - "description": "Subtitle shown on home when no providers are available yet" - }, - "homeSupports": "支持:歌曲、专辑、播放列表、艺人网址", - "@homeSupports": { - "description": "Info text about supported URL types" - }, - "homeRecent": "最近", - "@homeRecent": { - "description": "Section header for recent searches" - }, - "historyFilterAll": "全部", - "@historyFilterAll": { - "description": "Filter chip - show all items" - }, - "historyFilterAlbums": "专辑", - "@historyFilterAlbums": { - "description": "Filter chip - show albums only" - }, - "historyFilterSingles": "单曲", - "@historyFilterSingles": { - "description": "Filter chip - show singles only" - }, - "historySearchHint": "搜索历史……", - "@historySearchHint": { - "description": "Search bar placeholder in history" - }, - "settingsTitle": "设置", - "@settingsTitle": { - "description": "Settings screen title" - }, - "settingsDownload": "下载", - "@settingsDownload": { - "description": "Settings section - download options" - }, - "settingsAppearance": "外观", - "@settingsAppearance": { - "description": "Settings section - visual customization" - }, - "settingsExtensions": "扩展", - "@settingsExtensions": { - "description": "Settings section - extension management" - }, - "settingsAbout": "关于", - "@settingsAbout": { - "description": "Settings section - app info" - }, - "downloadTitle": "下载", - "@downloadTitle": { - "description": "Download settings page title" - }, - "downloadAskQualitySubtitle": "为每次下载显示质量选择器", - "@downloadAskQualitySubtitle": { - "description": "Subtitle for ask quality toggle" - }, - "downloadFilenameFormat": "文件名格式", - "@downloadFilenameFormat": { - "description": "Setting for output filename pattern" - }, - "downloadSingleFilenameFormat": "单曲文件名格式", - "@downloadSingleFilenameFormat": { - "description": "Setting for output filename pattern for singles/EPs" - }, - "downloadSingleFilenameFormatDescription": "单曲和EP的文件名格式。使用与专辑格式相同的标签。", - "@downloadSingleFilenameFormatDescription": { - "description": "Subtitle description for single filename format setting" - }, - "downloadFolderOrganization": "文件夹结构", - "@downloadFolderOrganization": { - "description": "Title of the folder organization picker bottom sheet" - }, - "appearanceTitle": "外观", - "@appearanceTitle": { - "description": "Appearance settings page title" - }, - "appearanceThemeSystem": "系统", - "@appearanceThemeSystem": { - "description": "Follow system theme" - }, - "appearanceThemeLight": "浅色", - "@appearanceThemeLight": { - "description": "Light theme" - }, - "appearanceThemeDark": "深色", - "@appearanceThemeDark": { - "description": "Dark theme" - }, - "appearanceDynamicColor": "动态色彩", - "@appearanceDynamicColor": { - "description": "Material You dynamic colors" - }, - "appearanceDynamicColorSubtitle": "使用壁纸的颜色", - "@appearanceDynamicColorSubtitle": { - "description": "Subtitle for dynamic color" - }, - "appearanceHistoryView": "历史记录", - "@appearanceHistoryView": { - "description": "Layout style for history" - }, - "appearanceHistoryViewList": "列表", - "@appearanceHistoryViewList": { - "description": "List layout option" - }, - "appearanceHistoryViewGrid": "网格", - "@appearanceHistoryViewGrid": { - "description": "Grid layout option" - }, - "optionsPrimaryProvider": "主要提供者", - "@optionsPrimaryProvider": { - "description": "Main search provider setting" - }, - "optionsPrimaryProviderSubtitle": "用于按曲目或专辑名称搜索的服务", - "@optionsPrimaryProviderSubtitle": { - "description": "Subtitle for primary provider" - }, - "optionsUsingExtension": "使用扩展:{extensionName}", - "@optionsUsingExtension": { - "description": "Shows active extension name", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "optionsDefaultSearchTab": "默认搜索栏", - "@optionsDefaultSearchTab": { - "description": "Title for the preferred default search tab setting" - }, - "optionsDefaultSearchTabSubtitle": "选择新搜索结果首先打开的标签页。", - "@optionsDefaultSearchTabSubtitle": { - "description": "Subtitle for the preferred default search tab setting" - }, - "optionsAutoFallback": "自动回退", - "@optionsAutoFallback": { - "description": "Auto-retry with other services" - }, - "optionsAutoFallbackSubtitle": "如果下载失败,请尝试其他服务", - "@optionsAutoFallbackSubtitle": { - "description": "Subtitle for auto fallback" - }, - "optionsEmbedLyrics": "内嵌歌词", - "@optionsEmbedLyrics": { - "description": "Embed lyrics in audio files" - }, - "optionsEmbedLyricsSubtitle": "将同步的歌词与你下载的音轨一起保存", - "@optionsEmbedLyricsSubtitle": { - "description": "Subtitle for embed lyrics" - }, - "optionsMaxQualityCover": "最高质量封面", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "下载最高分辨率封面", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, - "optionsReplayGain": "回放增益", - "@optionsReplayGain": { - "description": "Title for ReplayGain setting toggle" - }, - "optionsReplayGainSubtitleOn": "扫描响度并嵌入 ReplayGain 标签(EBU R128)", - "@optionsReplayGainSubtitleOn": { - "description": "Subtitle when ReplayGain is enabled" - }, - "optionsReplayGainSubtitleOff": "已禁用:不添加响度标准化标签", - "@optionsReplayGainSubtitleOff": { - "description": "Subtitle when ReplayGain is disabled" - }, - "trackReplayGain": "重新扫描ReplayGain ", - "@trackReplayGain": { - "description": "Three-dot menu option to scan loudness and write ReplayGain tags" - }, - "trackReplayGainScanning": "正在分析声音……", - "@trackReplayGainScanning": { - "description": "Snackbar/progress message while scanning ReplayGain for a single track" - }, - "trackReplayGainSuccess": "ReplayGain标签已添加", - "@trackReplayGainSuccess": { - "description": "Snackbar message after ReplayGain tags written for a single track" - }, - "trackReplayGainFailed": "添加ReplayGain标签失败", - "@trackReplayGainFailed": { - "description": "Snackbar message when ReplayGain scan/write fails" - }, - "selectionReplayGainCount": "ReplayGain ({count})", - "@selectionReplayGainCount": { - "description": "Batch selection action button label for ReplayGain", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "replayGainBatchConfirmTitle": "添加ReplayGain", - "@replayGainBatchConfirmTitle": { - "description": "Title of the batch ReplayGain confirmation dialog" - }, - "replayGainBatchConfirmMessage": "要分析响度并向 {count} 首歌曲写入 ReplayGain 标签吗?", - "@replayGainBatchConfirmMessage": { - "description": "Message of the batch ReplayGain confirmation dialog", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "replayGainBatchAnalyzing": "正在分析ReplayGain...", - "@replayGainBatchAnalyzing": { - "description": "Progress dialog title while batch scanning ReplayGain" - }, - "replayGainBatchSuccess": "已为 {success}/{total} 首歌曲添加 ReplayGain", - "@replayGainBatchSuccess": { - "description": "Snackbar after batch ReplayGain completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "optionsArtistTagMode": "艺术家标签模式", - "@optionsArtistTagMode": { - "description": "Setting title for how artist metadata is written into files" - }, - "optionsArtistTagModeDescription": "选择将多位艺人写入嵌入标签的方式", - "@optionsArtistTagModeDescription": { - "description": "Bottom-sheet description for artist tag mode setting" - }, - "optionsArtistTagModeJoined": "合并为单个值", - "@optionsArtistTagModeJoined": { - "description": "Artist tag mode option that joins multiple artists into one value" - }, - "optionsArtistTagModeJoinedSubtitle": "写一个ARTIST 值,如“艺术家A,艺人B”,以实现最大兼容性。", - "@optionsArtistTagModeJoinedSubtitle": { - "description": "Subtitle for joined artist tag mode" - }, - "optionsArtistTagModeSplitVorbis": "用于 FLAC/Opus 的拆分标签", - "@optionsArtistTagModeSplitVorbis": { - "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" - }, - "optionsArtistTagModeSplitVorbisSubtitle": "为 FLAC 和 Opus 的每位艺人各写入一个艺人标签;MP3 和 M4A 保持合并", - "@optionsArtistTagModeSplitVorbisSubtitle": { - "description": "Subtitle for split Vorbis artist tag mode" - }, - "optionsExtensionStore": "扩展仓库", - "@optionsExtensionStore": { - "description": "Show/hide store tab" - }, - "optionsExtensionStoreSubtitle": "在导航中显示仓库标签页", - "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" - }, - "optionsCheckUpdates": "检查更新", - "@optionsCheckUpdates": { - "description": "Auto update check toggle" - }, - "optionsCheckUpdatesSubtitle": "当有新版本可用时通知", - "@optionsCheckUpdatesSubtitle": { - "description": "Subtitle for update check" - }, - "optionsUpdateChannel": "更新频道", - "@optionsUpdateChannel": { - "description": "Stable vs preview releases" - }, - "optionsUpdateChannelStable": "仅稳定版本", - "@optionsUpdateChannelStable": { - "description": "Only stable updates" - }, - "optionsUpdateChannelPreview": "获取预览版本", - "@optionsUpdateChannelPreview": { - "description": "Include beta/preview updates" - }, - "optionsUpdateChannelWarning": "预览版本可能包含错误或者尚未完善的功能", - "@optionsUpdateChannelWarning": { - "description": "Warning about preview channel" - }, - "optionsClearHistory": "清除下载历史记录", - "@optionsClearHistory": { - "description": "Delete all download history" - }, - "optionsClearHistorySubtitle": "从历史记录中清除所有已下载的曲目", - "@optionsClearHistorySubtitle": { - "description": "Subtitle for clear history" - }, - "optionsDetailedLogging": "详细日志", - "@optionsDetailedLogging": { - "description": "Enable verbose logs for debugging" - }, - "optionsDetailedLoggingOn": "正在记录详细日志", - "@optionsDetailedLoggingOn": { - "description": "Status when logging enabled" - }, - "optionsDetailedLoggingOff": "为错误报告启用", - "@optionsDetailedLoggingOff": { - "description": "Status when logging disabled" - }, - "extensionsTitle": "扩展", - "@extensionsTitle": { - "description": "Extensions page title" - }, - "extensionsDisabled": "禁用", - "@extensionsDisabled": { - "description": "Extension status - inactive" - }, - "extensionsVersion": "版本 {version}", - "@extensionsVersion": { - "description": "Extension version display", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "extensionsUninstall": "卸载", - "@extensionsUninstall": { - "description": "Uninstall extension button" - }, - "storeTitle": "扩展仓库地址", - "@storeTitle": { - "description": "Store screen title" - }, - "storeSearch": "搜索扩展……", - "@storeSearch": { - "description": "Store search placeholder" - }, - "storeInstall": "安装", - "@storeInstall": { - "description": "Install extension button" - }, - "storeInstalled": "已安装", - "@storeInstalled": { - "description": "Already installed badge" - }, - "storeUpdate": "更新", - "@storeUpdate": { - "description": "Update available button" - }, - "aboutTitle": "关于", - "@aboutTitle": { - "description": "About page title" - }, - "aboutContributors": "贡献者", - "@aboutContributors": { - "description": "Section for contributors" - }, - "aboutMobileDeveloper": "移动版本开发者", - "@aboutMobileDeveloper": { - "description": "Role description for mobile dev" - }, - "aboutOriginalCreator": "原 SpotiLDAC 创建者", - "@aboutOriginalCreator": { - "description": "Role description for original creator" - }, - "aboutLogoArtist": "有才华的艺术家创建了我们美丽的应用图标!", - "@aboutLogoArtist": { - "description": "Role description for logo artist" - }, - "aboutTranslators": "译者", - "@aboutTranslators": { - "description": "Section for translators" - }, - "aboutSpecialThanks": "特别鸣谢", - "@aboutSpecialThanks": { - "description": "Section for special thanks" - }, - "aboutLinks": "相关链接", - "@aboutLinks": { - "description": "Section for external links" - }, - "aboutMobileSource": "移动版本源代码", - "@aboutMobileSource": { - "description": "Link to mobile GitHub repo" - }, - "aboutPCSource": "桌面版本源代码", - "@aboutPCSource": { - "description": "Link to PC GitHub repo" - }, - "aboutKeepAndroidOpen": "Keep Android Open(保持安卓开放)", - "@aboutKeepAndroidOpen": { - "description": "Link to Keep Android Open campaign website" - }, - "aboutReportIssue": "报告一个问题", - "@aboutReportIssue": { - "description": "Link to report bugs" - }, - "aboutReportIssueSubtitle": "报告您遇到的任何问题", - "@aboutReportIssueSubtitle": { - "description": "Subtitle for report issue" - }, - "aboutFeatureRequest": "功能建议", - "@aboutFeatureRequest": { - "description": "Link to suggest features" - }, - "aboutFeatureRequestSubtitle": "为应用建议新功能", - "@aboutFeatureRequestSubtitle": { - "description": "Subtitle for feature request" - }, - "aboutTelegramChannel": "Telegram 频道", - "@aboutTelegramChannel": { - "description": "Link to Telegram channel" - }, - "aboutTelegramChannelSubtitle": "公告和更新", - "@aboutTelegramChannelSubtitle": { - "description": "Subtitle for Telegram channel" - }, - "aboutTelegramChat": "Telegram 社区", - "@aboutTelegramChat": { - "description": "Link to Telegram chat group" - }, - "aboutTelegramChatSubtitle": "与其他用户聊天", - "@aboutTelegramChatSubtitle": { - "description": "Subtitle for Telegram chat" - }, - "aboutSocial": "社交", - "@aboutSocial": { - "description": "Section for social links" - }, - "aboutApp": "App", - "@aboutApp": { - "description": "Section for app info" - }, - "aboutVersion": "版本", - "@aboutVersion": { - "description": "Version info label" - }, - "aboutBinimumDesc": "QQDL 和 HiFi API 的创建者。本项目帮助完善了无损下载支持。", - "@aboutBinimumDesc": { - "description": "Credit description for binimum" - }, - "aboutSachinsenalDesc": "原 HiFi 项目创建者,为无损来源集成奠定了基础。", - "@aboutSachinsenalDesc": { - "description": "Credit description for sachinsenal0x64" - }, - "aboutSjdonadoDesc": "I Don't Have Spotify (IDHS) 的创建者。备用链接解析器很有帮助!", - "@aboutSjdonadoDesc": { - "description": "Credit description for sjdonado" - }, - "aboutAppDescription": "搜索音乐元数据、管理扩展并整理你的乐库。", - "@aboutAppDescription": { - "description": "App description in header card" - }, - "artistAlbums": "专辑", - "@artistAlbums": { - "description": "Section header for artist albums" - }, - "artistSingles": "单曲 & EP", - "@artistSingles": { - "description": "Section header for singles/EPs" - }, - "artistCompilations": "合辑", - "@artistCompilations": { - "description": "Section header for compilations" - }, - "artistPopular": "热门", - "@artistPopular": { - "description": "Section header for popular/top tracks" - }, - "artistMonthlyListeners": "{count} 位月听众", - "@artistMonthlyListeners": { - "description": "Monthly listener count display", - "placeholders": { - "count": { - "type": "String", - "description": "Formatted listener count" - } - } - }, - "trackMetadataService": "服务商", - "@trackMetadataService": { - "description": "Metadata field - download service used" - }, - "trackMetadataPlay": "播放", - "@trackMetadataPlay": { - "description": "Action button - play track" - }, - "trackMetadataShare": "分享", - "@trackMetadataShare": { - "description": "Action button - share track" - }, - "trackMetadataDelete": "删除", - "@trackMetadataDelete": { - "description": "Action button - delete track" - }, - "setupGrantPermission": "授予权限", - "@setupGrantPermission": { - "description": "Button to request permission" - }, - "setupSkip": "暂时跳过", - "@setupSkip": { - "description": "Skip current step button" - }, - "setupStorageAccessRequired": "需要存储访问权限", - "@setupStorageAccessRequired": { - "description": "Title when storage access needed" - }, - "setupStorageAccessMessageAndroid11": "Android 11+ 需要“所有文件访问权限”才能将文件保存到你选择的下载文件夹。", - "@setupStorageAccessMessageAndroid11": { - "description": "Android 11+ specific explanation" - }, - "setupOpenSettings": "打开设置", - "@setupOpenSettings": { - "description": "Button to open system settings" - }, - "setupPermissionDeniedMessage": "权限被拒绝。请授予所有权限以继续。", - "@setupPermissionDeniedMessage": { - "description": "Error when permission denied" - }, - "setupPermissionRequired": "需要 {permissionType} 权限", - "@setupPermissionRequired": { - "description": "Generic permission required title", - "placeholders": { - "permissionType": { - "type": "String", - "description": "Type of permission (Storage/Notification)" - } - } - }, - "setupPermissionRequiredMessage": "为了获得最佳体验,需要 {permissionType} 权限。你可以稍后在设置中更改。", - "@setupPermissionRequiredMessage": { - "description": "Generic permission required message", - "placeholders": { - "permissionType": { - "type": "String" - } - } - }, - "setupUseDefaultFolder": "使用默认文件夹?", - "@setupUseDefaultFolder": { - "description": "Dialog title for default folder" - }, - "setupNoFolderSelected": "未选择文件夹。要使用默认音乐文件夹吗?", - "@setupNoFolderSelected": { - "description": "Prompt when no folder selected" - }, - "setupUseDefault": "使用默认", - "@setupUseDefault": { - "description": "Button to use default folder" - }, - "setupDownloadLocationTitle": "下载位置", - "@setupDownloadLocationTitle": { - "description": "Download location dialog title" - }, - "setupDownloadLocationIosMessage": "在 iOS 上,下载内容会保存到应用的 Documents 文件夹。你可以通过“文件”应用访问。", - "@setupDownloadLocationIosMessage": { - "description": "iOS-specific folder info" - }, - "setupAppDocumentsFolder": "应用程序文档文件夹", - "@setupAppDocumentsFolder": { - "description": "iOS documents folder option" - }, - "setupAppDocumentsFolderSubtitle": "推荐 - 可通过“文件”应用访问", - "@setupAppDocumentsFolderSubtitle": { - "description": "Subtitle for documents folder" - }, - "setupChooseFromFiles": "从“文件”中选择", - "@setupChooseFromFiles": { - "description": "iOS file picker option" - }, - "setupChooseFromFilesSubtitle": "选择 iCloud 或其他位置", - "@setupChooseFromFilesSubtitle": { - "description": "Subtitle for file picker" - }, - "setupIosEmptyFolderWarning": "iOS 限制:无法选择空文件夹。请选择至少包含一个文件的文件夹。", - "@setupIosEmptyFolderWarning": { - "description": "iOS folder selection warning" - }, - "setupIcloudNotSupported": "不支持 iCloud Drive。请使用应用 Documents 文件夹。", - "@setupIcloudNotSupported": { - "description": "Error when user selects iCloud Drive on iOS" - }, - "setupDownloadInFlac": "以 FLAC 下载 Spotify 曲目", - "@setupDownloadInFlac": { - "description": "App tagline in setup" - }, - "setupStorageGranted": "已授予存储权限!", - "@setupStorageGranted": { - "description": "Success message for storage permission" - }, - "setupStorageRequired": "需要存储权限", - "@setupStorageRequired": { - "description": "Title when storage permission needed" - }, - "setupStorageDescription": "SpotiFLAC 需要存储权限来保存下载的音乐文件。", - "@setupStorageDescription": { - "description": "Explanation for storage permission" - }, - "setupNotificationGranted": "已授予通知权限!", - "@setupNotificationGranted": { - "description": "Success message for notification permission" - }, - "setupNotificationEnable": "启用通知", - "@setupNotificationEnable": { - "description": "Button to enable notifications" - }, - "setupFolderChoose": "选择下载文件夹", - "@setupFolderChoose": { - "description": "Button to choose folder" - }, - "setupFolderDescription": "选择保存您下载的音乐的文件夹。", - "@setupFolderDescription": { - "description": "Explanation for folder selection" - }, - "setupSelectFolder": "选择文件夹", - "@setupSelectFolder": { - "description": "Button to select folder" - }, - "setupEnableNotifications": "启用通知", - "@setupEnableNotifications": { - "description": "Button to enable notifications" - }, - "setupNotificationBackgroundDescription": "接收下载进度和完成通知,方便你在应用后台时跟踪下载。", - "@setupNotificationBackgroundDescription": { - "description": "Detailed notification explanation" - }, - "setupSkipForNow": "暂时跳过", - "@setupSkipForNow": { - "description": "Skip button text" - }, - "setupNext": "下一步", - "@setupNext": { - "description": "Next button text" - }, - "setupGetStarted": "开始使用", - "@setupGetStarted": { - "description": "Final setup button" - }, - "setupAllowAccessToManageFiles": "请在下一个屏幕中启用“允许管理所有文件”。", - "@setupAllowAccessToManageFiles": { - "description": "Instruction for file access permission" - }, - "setupLanguageTitle": "选择语言", - "@setupLanguageTitle": { - "description": "Title for the language selection step in setup" - }, - "setupLanguageDescription": "选择应用的首选语言。你可以稍后在设置中更改。", - "@setupLanguageDescription": { - "description": "Description for the language selection step in setup" - }, - "setupLanguageSystemDefault": "跟随系统", - "@setupLanguageSystemDefault": { - "description": "Option to use the system language" - }, - "dialogCancel": "取消", - "@dialogCancel": { - "description": "Dialog button - cancel action" - }, - "dialogSave": "保存", - "@dialogSave": { - "description": "Dialog button - save changes" - }, - "dialogDelete": "删除", - "@dialogDelete": { - "description": "Dialog button - delete item" - }, - "dialogRetry": "重试", - "@dialogRetry": { - "description": "Dialog button - retry action" - }, - "dialogClear": "清空", - "@dialogClear": { - "description": "Dialog button - clear items" - }, - "dialogDone": "完成", - "@dialogDone": { - "description": "Dialog button - action completed" - }, - "dialogImport": "导入", - "@dialogImport": { - "description": "Dialog button - import data" - }, - "dialogDownload": "下载", - "@dialogDownload": { - "description": "Confirm button in Download All dialog" - }, - "previewPlay": "Play preview", - "@previewPlay": { - "description": "Tooltip for the button that plays a short track preview snippet" - }, - "previewStop": "Stop preview", - "@previewStop": { - "description": "Tooltip for the button that stops the playing track preview snippet" - }, - "previewUnavailable": "Preview unavailable", - "@previewUnavailable": { - "description": "Snackbar shown when a track preview snippet cannot be played" - }, - "dialogDiscard": "放弃", - "@dialogDiscard": { - "description": "Dialog button - discard changes" - }, - "dialogRemove": "移除", - "@dialogRemove": { - "description": "Dialog button - remove item" - }, - "dialogUninstall": "卸载", - "@dialogUninstall": { - "description": "Dialog button - uninstall extension" - }, - "dialogDiscardChanges": "放弃更改?", - "@dialogDiscardChanges": { - "description": "Dialog title - unsaved changes warning" - }, - "dialogUnsavedChanges": "您有未保存的更改,要放弃它们吗?", - "@dialogUnsavedChanges": { - "description": "Dialog message - unsaved changes" - }, - "dialogClearAll": "全部清除", - "@dialogClearAll": { - "description": "Dialog title - clear all items" - }, - "dialogRemoveExtension": "移除扩展", - "@dialogRemoveExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogRemoveExtensionMessage": "确定要移除此扩展吗?此操作无法撤销。", - "@dialogRemoveExtensionMessage": { - "description": "Dialog message - uninstall confirmation" - }, - "dialogUninstallExtension": "卸载扩展?", - "@dialogUninstallExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogUninstallExtensionMessage": "确定要移除 {extensionName} 吗?", - "@dialogUninstallExtensionMessage": { - "description": "Dialog message - uninstall specific extension", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "dialogClearHistoryTitle": "清除历史", - "@dialogClearHistoryTitle": { - "description": "Dialog title - clear download history" - }, - "dialogClearHistoryMessage": "您确定要清除所有下载记录吗?此操作无法撤销!", - "@dialogClearHistoryMessage": { - "description": "Dialog message - clear history confirmation" - }, - "dialogDeleteSelectedTitle": "删除所选项", - "@dialogDeleteSelectedTitle": { - "description": "Dialog title - delete selected items" - }, - "dialogDeleteSelectedMessage": "确定要从历史记录中删除 {count} {count, plural, =1{首歌曲} other{首歌曲}}吗?\n\n这也会从存储中删除文件。", - "@dialogDeleteSelectedMessage": { - "description": "Dialog message - delete selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogImportPlaylistTitle": "导入播放列表", - "@dialogImportPlaylistTitle": { - "description": "Dialog title - import CSV playlist" - }, - "dialogImportPlaylistMessage": "在 CSV 中找到 {count} 首歌曲。要将它们加入下载队列吗?", - "csvImportTracks": "CSV 中的 {count} 首歌曲", - "@csvImportTracks": { - "description": "Label shown in quality picker for CSV import", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@dialogImportPlaylistMessage": { - "description": "Dialog message - import playlist confirmation", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedToQueue": "已将“{trackName}”加入队列", - "@snackbarAddedToQueue": { - "description": "Snackbar - track added to download queue", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAddedTracksToQueue": "已将 {count} 首歌曲加入队列", - "@snackbarAddedTracksToQueue": { - "description": "Snackbar - multiple tracks added to queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAlreadyDownloaded": "“{trackName}”已下载", - "@snackbarAlreadyDownloaded": { - "description": "Snackbar - track already exists", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAlreadyInLibrary": "“{trackName}”已存在于你的乐库中", - "@snackbarAlreadyInLibrary": { - "description": "Snackbar - track already exists in local library", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarHistoryCleared": "历史记录已清除", - "@snackbarHistoryCleared": { - "description": "Snackbar - history deleted" - }, - "snackbarDeletedTracks": "已删除 {count} {count, plural, =1{首歌曲} other{首歌曲}}", - "@snackbarDeletedTracks": { - "description": "Snackbar - tracks deleted", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarCannotOpenFile": "无法打开文件:{error}", - "@snackbarCannotOpenFile": { - "description": "Snackbar - file open error", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "snackbarViewQueue": "查看队列", - "@snackbarViewQueue": { - "description": "Snackbar action - view download queue" - }, - "snackbarUrlCopied": "{platform} URL copied to clipboard", - "@snackbarUrlCopied": { - "description": "Snackbar - URL copied", - "placeholders": { - "platform": { - "type": "String", - "description": "Platform name (Spotify/Deezer)" - } - } - }, - "snackbarFileNotFound": "File not found", - "@snackbarFileNotFound": { - "description": "Snackbar - file doesn't exist" - }, - "snackbarSelectExtFile": "Please select a .spotiflac-ext file", - "@snackbarSelectExtFile": { - "description": "Snackbar - wrong file type selected" - }, - "snackbarProviderPrioritySaved": "Provider priority saved", - "@snackbarProviderPrioritySaved": { - "description": "Snackbar - provider order saved" - }, - "snackbarMetadataProviderSaved": "Metadata provider priority saved", - "@snackbarMetadataProviderSaved": { - "description": "Snackbar - metadata provider order saved" - }, - "snackbarExtensionInstalled": "{extensionName} installed.", - "@snackbarExtensionInstalled": { - "description": "Snackbar - extension installed successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarExtensionUpdated": "{extensionName} updated.", - "@snackbarExtensionUpdated": { - "description": "Snackbar - extension updated successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarFailedToInstall": "Failed to install extension", - "@snackbarFailedToInstall": { - "description": "Snackbar - extension install error" - }, - "snackbarFailedToUpdate": "Failed to update extension", - "@snackbarFailedToUpdate": { - "description": "Snackbar - extension update error" - }, - "errorRateLimited": "Rate Limited", - "@errorRateLimited": { - "description": "Error title - too many requests" - }, - "errorRateLimitedMessage": "请求过多。请等一会再搜索。", - "@errorRateLimitedMessage": { - "description": "Error message - rate limit explanation" - }, - "errorNoTracksFound": "未找到曲目", - "@errorNoTracksFound": { - "description": "Error - search returned no results" - }, - "searchEmptyResultSubtitle": "Try another keyword", - "@searchEmptyResultSubtitle": { - "description": "Subtitle shown under the empty search result state on the home screen" - }, - "errorUrlNotRecognized": "Link not recognized", - "@errorUrlNotRecognized": { - "description": "Error title - URL not handled by any extension or service" - }, - "errorUrlNotRecognizedMessage": "This link is not supported. Make sure the URL is correct and a compatible extension is installed.", - "@errorUrlNotRecognizedMessage": { - "description": "Error message - URL not recognized explanation" - }, - "errorUrlFetchFailed": "Failed to load content from this link. Please try again.", - "@errorUrlFetchFailed": { - "description": "Error message - generic URL fetch failure" - }, - "errorMissingExtensionSource": "Cannot load {item}: missing extension source", - "@errorMissingExtensionSource": { - "description": "Error - extension source not available", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "actionPause": "Pause", - "@actionPause": { - "description": "Action button - pause download" - }, - "actionResume": "Resume", - "@actionResume": { - "description": "Action button - resume download" - }, - "actionCancel": "Cancel", - "@actionCancel": { - "description": "Action button - cancel operation" - }, - "actionSelectAll": "Select All", - "@actionSelectAll": { - "description": "Action button - select all items" - }, - "actionDeselect": "Deselect", - "@actionDeselect": { - "description": "Action button - deselect all" - }, - "selectionSelected": "{count} selected", - "@selectionSelected": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionAllSelected": "All tracks selected", - "@selectionAllSelected": { - "description": "Status - all items selected" - }, - "selectionSelectToDelete": "Select tracks to delete", - "@selectionSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "progressFetchingMetadata": "Fetching metadata... {current}/{total}", - "@progressFetchingMetadata": { - "description": "Progress indicator - loading track info", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "progressReadingCsv": "Reading CSV...", - "@progressReadingCsv": { - "description": "Progress indicator - parsing CSV file" - }, - "searchSongs": "Songs", - "@searchSongs": { - "description": "Search result category - songs" - }, - "searchArtists": "Artists", - "@searchArtists": { - "description": "Search result category - artists" - }, - "searchAlbums": "Albums", - "@searchAlbums": { - "description": "Search result category - albums" - }, - "searchPlaylists": "Playlists", - "@searchPlaylists": { - "description": "Search result category - playlists" - }, - "searchSortTitle": "Sort Results", - "@searchSortTitle": { - "description": "Bottom sheet title for search sort options" - }, - "searchSortDefault": "Default", - "@searchSortDefault": { - "description": "Sort option - default API order" - }, - "searchSortTitleAZ": "Title (A-Z)", - "@searchSortTitleAZ": { - "description": "Sort option - title ascending" - }, - "searchSortTitleZA": "Title (Z-A)", - "@searchSortTitleZA": { - "description": "Sort option - title descending" - }, - "searchSortArtistAZ": "Artist (A-Z)", - "@searchSortArtistAZ": { - "description": "Sort option - artist ascending" - }, - "searchSortArtistZA": "Artist (Z-A)", - "@searchSortArtistZA": { - "description": "Sort option - artist descending" - }, - "searchSortDurationShort": "Duration (Shortest)", - "@searchSortDurationShort": { - "description": "Sort option - shortest duration first" - }, - "searchSortDurationLong": "Duration (Longest)", - "@searchSortDurationLong": { - "description": "Sort option - longest duration first" - }, - "searchSortDateOldest": "Release Date (Oldest)", - "@searchSortDateOldest": { - "description": "Sort option - oldest release first" - }, - "searchSortDateNewest": "Release Date (Newest)", - "@searchSortDateNewest": { - "description": "Sort option - newest release first" - }, - "tooltipPlay": "Play", - "@tooltipPlay": { - "description": "Tooltip - play button" - }, - "filenameFormat": "Filename Format", - "@filenameFormat": { - "description": "Setting title - filename pattern" - }, - "filenameShowAdvancedTags": "Show advanced tags", - "@filenameShowAdvancedTags": { - "description": "Toggle label for showing advanced filename tags" - }, - "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", - "@filenameShowAdvancedTagsDescription": { - "description": "Description for advanced filename tag toggle" - }, - "folderOrganizationNone": "No organization", - "@folderOrganizationNone": { - "description": "Folder option - flat structure" - }, - "folderOrganizationByPlaylist": "By Playlist", - "@folderOrganizationByPlaylist": { - "description": "Folder option - playlist folders" - }, - "folderOrganizationByPlaylistSubtitle": "Separate folder for each playlist", - "@folderOrganizationByPlaylistSubtitle": { - "description": "Subtitle for playlist folder option" - }, - "folderOrganizationByArtist": "By Artist", - "@folderOrganizationByArtist": { - "description": "Folder option - artist folders" - }, - "folderOrganizationByAlbum": "By Album", - "@folderOrganizationByAlbum": { - "description": "Folder option - album folders" - }, - "folderOrganizationByArtistAlbum": "Artist/Album", - "@folderOrganizationByArtistAlbum": { - "description": "Folder option - nested folders" - }, - "folderOrganizationDescription": "Organize downloaded files into folders", - "@folderOrganizationDescription": { - "description": "Folder organization sheet description" - }, - "folderOrganizationNoneSubtitle": "All files in download folder", - "@folderOrganizationNoneSubtitle": { - "description": "Subtitle for no organization option" - }, - "folderOrganizationByArtistSubtitle": "Separate folder for each artist", - "@folderOrganizationByArtistSubtitle": { - "description": "Subtitle for artist folder option" - }, - "folderOrganizationByAlbumSubtitle": "Separate folder for each album", - "@folderOrganizationByAlbumSubtitle": { - "description": "Subtitle for album folder option" - }, - "folderOrganizationByArtistAlbumSubtitle": "Nested folders for artist and album", - "@folderOrganizationByArtistAlbumSubtitle": { - "description": "Subtitle for nested folder option" - }, - "updateAvailable": "Update Available", - "@updateAvailable": { - "description": "Update dialog title" - }, - "updateLater": "Later", - "@updateLater": { - "description": "Update button - dismiss" - }, - "updateStartingDownload": "Starting download...", - "@updateStartingDownload": { - "description": "Update status - initializing" - }, - "updateDownloadFailed": "Download failed", - "@updateDownloadFailed": { - "description": "Update error title" - }, - "updateFailedMessage": "Failed to download update", - "@updateFailedMessage": { - "description": "Update error message" - }, - "updateNewVersionReady": "A new version is ready", - "@updateNewVersionReady": { - "description": "Update subtitle" - }, - "updateCurrent": "Current", - "@updateCurrent": { - "description": "Label for current version" - }, - "updateNew": "New", - "@updateNew": { - "description": "Label for new version" - }, - "updateDownloading": "Downloading...", - "@updateDownloading": { - "description": "Update status - downloading" - }, - "updateWhatsNew": "What's New", - "@updateWhatsNew": { - "description": "Changelog section title" - }, - "updateDownloadInstall": "Download & Install", - "@updateDownloadInstall": { - "description": "Update button - download and install" - }, - "updateDontRemind": "Don't remind", - "@updateDontRemind": { - "description": "Update button - skip this version" - }, - "providerPriorityTitle": "Provider Priority", - "@providerPriorityTitle": { - "description": "Provider priority page title" - }, - "providerPriorityDescription": "Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.", - "@providerPriorityDescription": { - "description": "Provider priority page description" - }, - "providerPriorityInfo": "If a track is not available on the first provider, the app will automatically try the next one.", - "@providerPriorityInfo": { - "description": "Info tip about fallback behavior" - }, - "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", - "@providerPriorityFallbackExtensionsDescription": { - "description": "Section description for extension fallback selection" - }, - "providerPriorityFallbackExtensionsHint": "Only enabled extensions with download-provider capability are listed here.", - "@providerPriorityFallbackExtensionsHint": { - "description": "Hint below the extension fallback selection list" - }, - "providerExtension": "Extension", - "@providerExtension": { - "description": "Label for extension-provided providers" - }, - "metadataProviderPriorityTitle": "Metadata Priority", - "@metadataProviderPriorityTitle": { - "description": "Metadata priority page title" - }, - "metadataProviderPriorityDescription": "Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.", - "@metadataProviderPriorityDescription": { - "description": "Metadata priority page description" - }, - "metadataProviderPriorityInfo": "Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.", - "@metadataProviderPriorityInfo": { - "description": "Info tip about rate limits" - }, - "logTitle": "Logs", - "@logTitle": { - "description": "Logs screen title" - }, - "logCopied": "Logs copied to clipboard", - "@logCopied": { - "description": "Snackbar - logs copied" - }, - "logSearchHint": "Search logs...", - "@logSearchHint": { - "description": "Log search placeholder" - }, - "logFilterLevel": "Level", - "@logFilterLevel": { - "description": "Filter by log level" - }, - "logFilterSection": "Filter", - "@logFilterSection": { - "description": "Filter section title" - }, - "logShareLogs": "Share logs", - "@logShareLogs": { - "description": "Share button tooltip" - }, - "logClearLogs": "Clear logs", - "@logClearLogs": { - "description": "Clear button tooltip" - }, - "logClearLogsTitle": "Clear Logs", - "@logClearLogsTitle": { - "description": "Clear logs dialog title" - }, - "logClearLogsMessage": "Are you sure you want to clear all logs?", - "@logClearLogsMessage": { - "description": "Clear logs confirmation message" - }, - "logFilterBySeverity": "Filter logs by severity", - "@logFilterBySeverity": { - "description": "Filter dialog title" - }, - "logNoLogsYet": "No logs yet", - "@logNoLogsYet": { - "description": "Empty state title" - }, - "logNoLogsYetSubtitle": "Logs will appear here as you use the app", - "@logNoLogsYetSubtitle": { - "description": "Empty state subtitle" - }, - "logEntriesFiltered": "Entries ({count} filtered)", - "@logEntriesFiltered": { - "description": "Log count with filter active", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "logEntries": "Entries ({count})", - "@logEntries": { - "description": "Total log count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "channelStable": "Stable", - "@channelStable": { - "description": "Update channel - stable releases" - }, - "channelPreview": "Preview", - "@channelPreview": { - "description": "Update channel - beta/preview releases" - }, - "sectionSearchSource": "Search Source", - "@sectionSearchSource": { - "description": "Settings section header" - }, - "sectionDownload": "Download", - "@sectionDownload": { - "description": "Settings section header" - }, - "sectionPerformance": "Performance", - "@sectionPerformance": { - "description": "Settings section header" - }, - "sectionApp": "App", - "@sectionApp": { - "description": "Settings section header" - }, - "sectionData": "Data", - "@sectionData": { - "description": "Settings section header" - }, - "sectionDebug": "Debug", - "@sectionDebug": { - "description": "Settings section header" - }, - "sectionService": "Service", - "@sectionService": { - "description": "Settings section header" - }, - "sectionAudioQuality": "Audio Quality", - "@sectionAudioQuality": { - "description": "Settings section header" - }, - "sectionFileSettings": "File Settings", - "@sectionFileSettings": { - "description": "Settings section header" - }, - "sectionLyrics": "Lyrics", - "@sectionLyrics": { - "description": "Settings section header" - }, - "lyricsMode": "Lyrics Mode", - "@lyricsMode": { - "description": "Setting - how to save lyrics" - }, - "lyricsModeDescription": "Choose how lyrics are saved with your downloads", - "@lyricsModeDescription": { - "description": "Lyrics mode picker description" - }, - "lyricsModeEmbed": "Embed in file", - "@lyricsModeEmbed": { - "description": "Lyrics mode option - embed in audio file" - }, - "lyricsModeEmbedSubtitle": "Lyrics stored inside FLAC metadata", - "@lyricsModeEmbedSubtitle": { - "description": "Subtitle for embed option" - }, - "lyricsModeExternal": "External .lrc file", - "@lyricsModeExternal": { - "description": "Lyrics mode option - separate LRC file" - }, - "lyricsModeExternalSubtitle": "Separate .lrc file for players like Samsung Music", - "@lyricsModeExternalSubtitle": { - "description": "Subtitle for external option" - }, - "lyricsModeBoth": "Both", - "@lyricsModeBoth": { - "description": "Lyrics mode option - embed and external" - }, - "lyricsModeBothSubtitle": "Embed and save .lrc file", - "@lyricsModeBothSubtitle": { - "description": "Subtitle for both option" - }, - "sectionColor": "Color", - "@sectionColor": { - "description": "Settings section header" - }, - "sectionTheme": "Theme", - "@sectionTheme": { - "description": "Settings section header" - }, - "sectionLayout": "Layout", - "@sectionLayout": { - "description": "Settings section header" - }, - "sectionLanguage": "Language", - "@sectionLanguage": { - "description": "Settings section header for language" - }, - "appearanceLanguage": "App Language", - "@appearanceLanguage": { - "description": "Language setting title" - }, - "settingsAppearanceSubtitle": "Theme, colors, display", - "@settingsAppearanceSubtitle": { - "description": "Appearance settings description" - }, - "settingsDownloadSubtitle": "Service, quality, fallback", - "@settingsDownloadSubtitle": { - "description": "Download settings description" - }, - "settingsExtensionsSubtitle": "Manage download providers", - "@settingsExtensionsSubtitle": { - "description": "Extensions settings description" - }, - "settingsLogsSubtitle": "View app logs for debugging", - "@settingsLogsSubtitle": { - "description": "Logs settings description" - }, - "loadingSharedLink": "Loading shared link...", - "@loadingSharedLink": { - "description": "Status when opening shared URL" - }, - "pressBackAgainToExit": "Press back again to exit", - "@pressBackAgainToExit": { - "description": "Exit confirmation message" - }, - "downloadAllCount": "Download All ({count})", - "@downloadAllCount": { - "description": "Download all button with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tracksCount": "{count, plural, =1{1 track} other{{count} tracks}}", - "@tracksCount": { - "description": "Track count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackCopyFilePath": "Copy file path", - "@trackCopyFilePath": { - "description": "Action - copy file path" - }, - "trackRemoveFromDevice": "Remove from device", - "@trackRemoveFromDevice": { - "description": "Action - delete downloaded file" - }, - "trackLoadLyrics": "Load Lyrics", - "@trackLoadLyrics": { - "description": "Action - fetch lyrics" - }, - "trackMetadata": "Metadata", - "@trackMetadata": { - "description": "Tab title - track metadata" - }, - "trackFileInfo": "File Info", - "@trackFileInfo": { - "description": "Tab title - file information" - }, - "trackLyrics": "Lyrics", - "@trackLyrics": { - "description": "Tab title - lyrics" - }, - "trackFileNotFound": "File not found", - "@trackFileNotFound": { - "description": "Error - file doesn't exist" - }, - "trackOpenInDeezer": "Open in Deezer", - "@trackOpenInDeezer": { - "description": "Action - open track in Deezer app" - }, - "trackOpenInSpotify": "Open in Spotify", - "@trackOpenInSpotify": { - "description": "Action - open track in Spotify app" - }, - "trackTrackName": "Track name", - "@trackTrackName": { - "description": "Metadata label - track title" - }, - "trackArtist": "Artist", - "@trackArtist": { - "description": "Metadata label - artist name" - }, - "trackAlbumArtist": "Album artist", - "@trackAlbumArtist": { - "description": "Metadata label - album artist" - }, - "trackAlbum": "Album", - "@trackAlbum": { - "description": "Metadata label - album name" - }, - "trackTrackNumber": "Track number", - "@trackTrackNumber": { - "description": "Metadata label - track number" - }, - "trackDiscNumber": "Disc number", - "@trackDiscNumber": { - "description": "Metadata label - disc number" - }, - "trackDuration": "Duration", - "@trackDuration": { - "description": "Metadata label - track length" - }, - "trackAudioQuality": "Audio quality", - "@trackAudioQuality": { - "description": "Metadata label - audio quality" - }, - "trackReleaseDate": "Release date", - "@trackReleaseDate": { - "description": "Metadata label - release date" - }, - "trackGenre": "Genre", - "@trackGenre": { - "description": "Metadata label - music genre" - }, - "trackLabel": "Label", - "@trackLabel": { - "description": "Metadata label - record label" - }, - "trackCopyright": "Copyright", - "@trackCopyright": { - "description": "Metadata label - copyright information" - }, - "trackDownloaded": "Downloaded", - "@trackDownloaded": { - "description": "Metadata label - download date" - }, - "trackCopyLyrics": "Copy lyrics", - "@trackCopyLyrics": { - "description": "Action - copy lyrics to clipboard" - }, - "trackLyricsSource": "Source: {source}", - "@trackLyricsSource": { - "description": "Label showing the lyrics source/provider", - "placeholders": { - "source": { - "type": "String" - } - } - }, - "trackLyricsNotAvailable": "Lyrics not available for this track", - "@trackLyricsNotAvailable": { - "description": "Message when lyrics not found" - }, - "trackLyricsNotInFile": "No lyrics found in this file", - "@trackLyricsNotInFile": { - "description": "Message when no embedded lyrics in audio file" - }, - "trackFetchOnlineLyrics": "Fetch from Online", - "@trackFetchOnlineLyrics": { - "description": "Action - fetch lyrics from online providers" - }, - "trackLyricsTimeout": "Request timed out. Try again later.", - "@trackLyricsTimeout": { - "description": "Message when lyrics request times out" - }, - "trackLyricsLoadFailed": "Failed to load lyrics", - "@trackLyricsLoadFailed": { - "description": "Message when lyrics loading fails" - }, - "trackEmbedLyrics": "Embed Lyrics", - "@trackEmbedLyrics": { - "description": "Action - embed lyrics into audio file" - }, - "trackLyricsEmbedded": "Lyrics embedded successfully", - "@trackLyricsEmbedded": { - "description": "Snackbar - lyrics saved to file" - }, - "trackInstrumental": "Instrumental track", - "@trackInstrumental": { - "description": "Message when track is instrumental (no lyrics)" - }, - "trackCopiedToClipboard": "Copied to clipboard", - "@trackCopiedToClipboard": { - "description": "Snackbar - content copied" - }, - "trackDeleteConfirmTitle": "Remove from device?", - "@trackDeleteConfirmTitle": { - "description": "Delete confirmation title" - }, - "trackDeleteConfirmMessage": "This will permanently delete the downloaded file and remove it from your history.", - "@trackDeleteConfirmMessage": { - "description": "Delete confirmation message" - }, - "dateToday": "Today", - "@dateToday": { - "description": "Relative date - today" - }, - "dateYesterday": "Yesterday", - "@dateYesterday": { - "description": "Relative date - yesterday" - }, - "dateDaysAgo": "{count} days ago", - "@dateDaysAgo": { - "description": "Relative date - days ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateWeeksAgo": "{count} weeks ago", - "@dateWeeksAgo": { - "description": "Relative date - weeks ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateMonthsAgo": "{count} months ago", - "@dateMonthsAgo": { - "description": "Relative date - months ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "storeFilterAll": "All", - "@storeFilterAll": { - "description": "Store filter - all extensions" - }, - "storeFilterMetadata": "Metadata", - "@storeFilterMetadata": { - "description": "Store filter - metadata providers" - }, - "storeFilterDownload": "Download", - "@storeFilterDownload": { - "description": "Store filter - download providers" - }, - "storeFilterUtility": "Utility", - "@storeFilterUtility": { - "description": "Store filter - utility extensions" - }, - "storeFilterLyrics": "Lyrics", - "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" - }, - "storeFilterIntegration": "Integration", - "@storeFilterIntegration": { - "description": "Store filter - integrations" - }, - "storeClearFilters": "Clear filters", - "@storeClearFilters": { - "description": "Button to clear all filters" - }, - "storeAddRepoTitle": "Add Extension Repository", - "@storeAddRepoTitle": { - "description": "Store setup screen - heading when no repo is configured" - }, - "storeAddRepoDescription": "Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.", - "@storeAddRepoDescription": { - "description": "Store setup screen - explanatory text" - }, - "storeRepoUrlLabel": "Repository URL", - "@storeRepoUrlLabel": { - "description": "Label for the repository URL input field" - }, - "storeRepoUrlHint": "https://github.com/user/repo", - "@storeRepoUrlHint": { - "description": "Hint/placeholder for the repository URL input field" - }, - "storeAddRepoButton": "Add Repository", - "@storeAddRepoButton": { - "description": "Button to submit a new repository URL" - }, - "storeChangeRepoTooltip": "Change repository", - "@storeChangeRepoTooltip": { - "description": "Tooltip for the change-repository icon button in the app bar" - }, - "storeRepoDialogTitle": "Extension Repository", - "@storeRepoDialogTitle": { - "description": "Title of the change/remove repository dialog" - }, - "storeRepoDialogCurrent": "Current repository:", - "@storeRepoDialogCurrent": { - "description": "Label shown above the current repository URL in the dialog" - }, - "storeNewRepoUrlLabel": "New Repository URL", - "@storeNewRepoUrlLabel": { - "description": "Label for the new repository URL field inside the dialog" - }, - "storeLoadError": "Failed to load repository", - "@storeLoadError": { - "description": "Error heading when the store cannot be loaded" - }, - "storeEmptyNoExtensions": "No extensions available", - "@storeEmptyNoExtensions": { - "description": "Message when store has no extensions" - }, - "storeEmptyNoResults": "No extensions found", - "@storeEmptyNoResults": { - "description": "Message when search/filter returns no results" - }, - "extensionId": "ID", - "@extensionId": { - "description": "Extension detail - unique ID" - }, - "extensionError": "Error", - "@extensionError": { - "description": "Extension detail - error message" - }, - "extensionCapabilities": "Capabilities", - "@extensionCapabilities": { - "description": "Section header - extension features" - }, - "extensionMetadataProvider": "Metadata Provider", - "@extensionMetadataProvider": { - "description": "Capability - provides metadata" - }, - "extensionDownloadProvider": "Download Provider", - "@extensionDownloadProvider": { - "description": "Capability - provides downloads" - }, - "extensionLyricsProvider": "Lyrics Provider", - "@extensionLyricsProvider": { - "description": "Capability - provides lyrics" - }, - "extensionUrlHandler": "URL Handler", - "@extensionUrlHandler": { - "description": "Capability - handles URLs" - }, - "extensionQualityOptions": "Quality Options", - "@extensionQualityOptions": { - "description": "Capability - quality selection" - }, - "extensionPostProcessingHooks": "Post-Processing Hooks", - "@extensionPostProcessingHooks": { - "description": "Capability - post-processing" - }, - "extensionPermissions": "Permissions", - "@extensionPermissions": { - "description": "Section header - required permissions" - }, - "extensionSettings": "Settings", - "@extensionSettings": { - "description": "Section header - extension settings" - }, - "extensionRemoveButton": "Remove Extension", - "@extensionRemoveButton": { - "description": "Button to uninstall extension" - }, - "extensionUpdated": "Updated", - "@extensionUpdated": { - "description": "Extension detail - last update" - }, - "extensionMinAppVersion": "Min App Version", - "@extensionMinAppVersion": { - "description": "Extension detail - minimum app version" - }, - "extensionCustomTrackMatching": "Custom Track Matching", - "@extensionCustomTrackMatching": { - "description": "Capability - custom track matching algorithm" - }, - "extensionPostProcessing": "Post-Processing", - "@extensionPostProcessing": { - "description": "Capability - post-download processing" - }, - "extensionHooksAvailable": "{count} hook(s) available", - "@extensionHooksAvailable": { - "description": "Post-processing hooks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionPatternsCount": "{count} pattern(s)", - "@extensionPatternsCount": { - "description": "URL patterns count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionStrategy": "Strategy: {strategy}", - "@extensionStrategy": { - "description": "Track matching strategy name", - "placeholders": { - "strategy": { - "type": "String" - } - } - }, - "extensionsProviderPrioritySection": "Provider Priority", - "@extensionsProviderPrioritySection": { - "description": "Section header - provider priority" - }, - "extensionsInstalledSection": "Installed Extensions", - "@extensionsInstalledSection": { - "description": "Section header - installed extensions" - }, - "extensionsNoExtensions": "No extensions installed", - "@extensionsNoExtensions": { - "description": "Empty state - no extensions" - }, - "extensionsNoExtensionsSubtitle": "Install .spotiflac-ext files to add new providers", - "@extensionsNoExtensionsSubtitle": { - "description": "Empty state subtitle" - }, - "extensionsInstallButton": "Install Extension", - "@extensionsInstallButton": { - "description": "Button to install extension from file" - }, - "extensionsInfoTip": "Extensions can add new metadata and download providers. Only install extensions from trusted sources.", - "@extensionsInfoTip": { - "description": "Security warning about extensions" - }, - "extensionsInstalledSuccess": "Extension installed successfully", - "@extensionsInstalledSuccess": { - "description": "Success message after install" - }, - "extensionsInstalledCount": "{count} extensions installed successfully", - "@extensionsInstalledCount": { - "description": "Success message after installing multiple extensions", - "placeholders": { - "count": { - "type": "int", - "description": "Number of installed extensions" - } - } - }, - "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", - "@extensionsInstallPartialSuccess": { - "description": "Message when installing multiple extensions partially succeeds", - "placeholders": { - "installed": { - "type": "int", - "description": "Number of successfully installed extensions" - }, - "attempted": { - "type": "int", - "description": "Number of selected extensions" - } - } - }, - "extensionsDownloadPriority": "Download Priority", - "@extensionsDownloadPriority": { - "description": "Setting - download provider order" - }, - "extensionsDownloadPrioritySubtitle": "Set download service order", - "@extensionsDownloadPrioritySubtitle": { - "description": "Subtitle for download priority" - }, - "extensionsFallbackTitle": "Fallback Extensions", - "@extensionsFallbackTitle": { - "description": "Setting and page title for choosing which download extensions can be used during fallback" - }, - "extensionsFallbackSubtitle": "Choose which installed download extensions can be used as fallback", - "@extensionsFallbackSubtitle": { - "description": "Subtitle for download fallback extensions menu" - }, - "extensionsNoDownloadProvider": "No extensions with download provider", - "@extensionsNoDownloadProvider": { - "description": "Empty state - no download providers" - }, - "extensionsMetadataPriority": "Metadata Priority", - "@extensionsMetadataPriority": { - "description": "Setting - metadata provider order" - }, - "extensionsMetadataPrioritySubtitle": "Set search & metadata source order", - "@extensionsMetadataPrioritySubtitle": { - "description": "Subtitle for metadata priority" - }, - "extensionsNoMetadataProvider": "No extensions with metadata provider", - "@extensionsNoMetadataProvider": { - "description": "Empty state - no metadata providers" - }, - "extensionsSearchProvider": "Search Provider", - "@extensionsSearchProvider": { - "description": "Setting - search provider selection" - }, - "extensionsNoCustomSearch": "No extensions with custom search", - "@extensionsNoCustomSearch": { - "description": "Empty state - no search providers" - }, - "extensionsSearchProviderDescription": "Choose which service to use for searching tracks", - "@extensionsSearchProviderDescription": { - "description": "Search provider setting description" - }, - "extensionsCustomSearch": "Custom search", - "@extensionsCustomSearch": { - "description": "Label for custom search provider" - }, - "extensionsErrorLoading": "Error loading extension", - "@extensionsErrorLoading": { - "description": "Error message when extension fails to load" - }, - "qualityFlacLossless": "FLAC Lossless", - "@qualityFlacLossless": { - "description": "Quality option - CD quality FLAC" - }, - "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", - "@qualityFlacLosslessSubtitle": { - "description": "Technical spec for lossless" - }, - "qualityHiResFlac": "Hi-Res FLAC", - "@qualityHiResFlac": { - "description": "Quality option - high resolution FLAC" - }, - "qualityHiResFlacSubtitle": "24-bit / up to 96kHz", - "@qualityHiResFlacSubtitle": { - "description": "Technical spec for hi-res" - }, - "qualityHiResFlacMax": "Hi-Res FLAC Max", - "@qualityHiResFlacMax": { - "description": "Quality option - maximum resolution FLAC" - }, - "qualityHiResFlacMaxSubtitle": "24-bit / up to 192kHz", - "@qualityHiResFlacMaxSubtitle": { - "description": "Technical spec for hi-res max" - }, - "downloadLossy320": "Lossy 320kbps", - "@downloadLossy320": { - "description": "Quality option label for lossy 320kbps" - }, - "downloadLossyFormat": "Lossy Format", - "@downloadLossyFormat": { - "description": "Setting title to pick output format for lossy downloads" - }, - "downloadLossy320Format": "Lossy 320kbps Format", - "@downloadLossy320Format": { - "description": "Title of the lossy format picker bottom sheet" - }, - "downloadLossy320FormatDesc": "Choose the output format for 320kbps lossy downloads. The original stream will be converted to your selected format when needed.", - "@downloadLossy320FormatDesc": { - "description": "Description in the lossy format picker" - }, - "downloadLossyMp3": "MP3 320kbps", - "@downloadLossyMp3": { - "description": "Lossy format option - MP3 320kbps" - }, - "downloadLossyMp3Subtitle": "Best compatibility, ~10MB per track", - "@downloadLossyMp3Subtitle": { - "description": "Subtitle for MP3 320kbps lossy option" - }, - "downloadLossyAac": "AAC/M4A 320kbps", - "@downloadLossyAac": { - "description": "Lossy format option - AAC in M4A container at 320kbps" - }, - "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", - "@downloadLossyAacSubtitle": { - "description": "Subtitle for AAC/M4A 320kbps lossy option" - }, - "downloadLossyOpus256": "Opus 256kbps", - "@downloadLossyOpus256": { - "description": "Lossy format option - Opus 256kbps" - }, - "downloadLossyOpus256Subtitle": "Best quality Opus, ~8MB per track", - "@downloadLossyOpus256Subtitle": { - "description": "Subtitle for Opus 256kbps lossy option" - }, - "downloadLossyOpus128": "Opus 128kbps", - "@downloadLossyOpus128": { - "description": "Lossy format option - Opus 128kbps" - }, - "downloadLossyOpus128Subtitle": "Smallest size, ~4MB per track", - "@downloadLossyOpus128Subtitle": { - "description": "Subtitle for Opus 128kbps lossy option" - }, - "downloadAskBeforeDownload": "Ask Before Download", - "@downloadAskBeforeDownload": { - "description": "Setting - show quality picker" - }, - "downloadDirectory": "Download Directory", - "@downloadDirectory": { - "description": "Setting - download folder" - }, - "downloadSeparateSinglesFolder": "Separate Singles Folder", - "@downloadSeparateSinglesFolder": { - "description": "Setting - separate folder for singles" - }, - "downloadAlbumFolderStructure": "Album Folder Structure", - "@downloadAlbumFolderStructure": { - "description": "Setting - album folder organization" - }, - "albumFolderStructureDescription": "Choose how album folders are structured", - "@albumFolderStructureDescription": { - "description": "Album folder structure picker description" - }, - "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", - "@downloadUseAlbumArtistForFolders": { - "description": "Setting - choose whether artist folders use Album Artist or Track Artist" - }, - "downloadUsePrimaryArtistOnly": "Primary artist only for folders", - "@downloadUsePrimaryArtistOnly": { - "description": "Setting - strip featured artists from folder name" - }, - "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", - "@downloadUsePrimaryArtistOnlyEnabled": { - "description": "Subtitle when primary artist only is enabled" - }, - "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", - "@downloadUsePrimaryArtistOnlyDisabled": { - "description": "Subtitle when primary artist only is disabled" - }, - "downloadSelectQuality": "Select Quality", - "@downloadSelectQuality": { - "description": "Dialog title - choose audio quality" - }, - "downloadFrom": "Download From", - "@downloadFrom": { - "description": "Label - download source" - }, - "appearanceAmoledDark": "AMOLED Dark", - "@appearanceAmoledDark": { - "description": "Theme option - pure black" - }, - "appearanceAmoledDarkSubtitle": "Pure black background", - "@appearanceAmoledDarkSubtitle": { - "description": "Subtitle for AMOLED dark" - }, - "queueClearAll": "Clear All", - "@queueClearAll": { - "description": "Button - clear all queue items" - }, - "queueClearAllMessage": "Are you sure you want to clear all downloads?", - "@queueClearAllMessage": { - "description": "Clear queue confirmation" - }, - "settingsAutoExportFailed": "Auto-export failed downloads", - "@settingsAutoExportFailed": { - "description": "Setting toggle for auto-export" - }, - "settingsAutoExportFailedSubtitle": "Save failed downloads to TXT file automatically", - "@settingsAutoExportFailedSubtitle": { - "description": "Subtitle for auto-export setting" - }, - "settingsDownloadNetwork": "Download Network", - "@settingsDownloadNetwork": { - "description": "Setting for network type preference" - }, - "settingsDownloadNetworkAny": "WiFi + Mobile Data", - "@settingsDownloadNetworkAny": { - "description": "Network option - use any connection" - }, - "settingsDownloadNetworkWifiOnly": "WiFi Only", - "@settingsDownloadNetworkWifiOnly": { - "description": "Network option - only use WiFi" - }, - "settingsDownloadNetworkSubtitle": "Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.", - "@settingsDownloadNetworkSubtitle": { - "description": "Subtitle explaining network preference" - }, - "albumFolderArtistAlbum": "Artist / Album", - "@albumFolderArtistAlbum": { - "description": "Album folder option" - }, - "albumFolderArtistAlbumSubtitle": "Albums/Artist Name/Album Name/", - "@albumFolderArtistAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistYearAlbum": "Artist / [Year] Album", - "@albumFolderArtistYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderArtistYearAlbumSubtitle": "Albums/Artist Name/[2005] Album Name/", - "@albumFolderArtistYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderAlbumOnly": "Album Only", - "@albumFolderAlbumOnly": { - "description": "Album folder option" - }, - "albumFolderAlbumOnlySubtitle": "Albums/Album Name/", - "@albumFolderAlbumOnlySubtitle": { - "description": "Folder structure example" - }, - "albumFolderYearAlbum": "[Year] Album", - "@albumFolderYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderYearAlbumSubtitle": "Albums/[2005] Album Name/", - "@albumFolderYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistAlbumSingles": "Artist / Album + Singles", - "@albumFolderArtistAlbumSingles": { - "description": "Album folder option with singles inside artist" - }, - "albumFolderArtistAlbumSinglesSubtitle": "Artist/Album/ and Artist/Singles/", - "@albumFolderArtistAlbumSinglesSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", - "@albumFolderArtistAlbumFlat": { - "description": "Album folder option with singles directly in artist folder" - }, - "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", - "@albumFolderArtistAlbumFlatSubtitle": { - "description": "Folder structure example for flat singles" - }, - "downloadedAlbumDeleteSelected": "Delete Selected", - "@downloadedAlbumDeleteSelected": { - "description": "Button - delete selected tracks" - }, - "downloadedAlbumDeleteMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from this album?\n\nThis will also delete the files from storage.", - "@downloadedAlbumDeleteMessage": { - "description": "Delete confirmation with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectedCount": "{count} selected", - "@downloadedAlbumSelectedCount": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumTapToSelect": "Tap tracks to select", - "@downloadedAlbumTapToSelect": { - "description": "Selection hint" - }, - "downloadedAlbumDeleteCount": "Delete {count} {count, plural, =1{track} other{tracks}}", - "@downloadedAlbumDeleteCount": { - "description": "Delete button text with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectToDelete": "Select tracks to delete", - "@downloadedAlbumSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "downloadedAlbumDiscHeader": "Disc {discNumber}", - "@downloadedAlbumDiscHeader": { - "description": "Header for disc separator in multi-disc albums", - "placeholders": { - "discNumber": { - "type": "int", - "example": "1" - } - } - }, - "recentTypeArtist": "Artist", - "@recentTypeArtist": { - "description": "Recent access item type - artist" - }, - "recentTypeAlbum": "Album", - "@recentTypeAlbum": { - "description": "Recent access item type - album" - }, - "recentTypeSong": "Song", - "@recentTypeSong": { - "description": "Recent access item type - song/track" - }, - "recentTypePlaylist": "Playlist", - "@recentTypePlaylist": { - "description": "Recent access item type - playlist" - }, - "recentEmpty": "No recent items yet", - "@recentEmpty": { - "description": "Empty state text for recent access list" - }, - "recentShowAllDownloads": "Show All Downloads", - "@recentShowAllDownloads": { - "description": "Button label to unhide hidden downloads in recent access" - }, - "recentPlaylistInfo": "Playlist: {name}", - "@recentPlaylistInfo": { - "description": "Snackbar message when tapping playlist in recent access", - "placeholders": { - "name": { - "type": "String", - "description": "Playlist name" - } - } - }, - "discographyDownload": "Download Discography", - "@discographyDownload": { - "description": "Button - download artist discography" - }, - "discographyDownloadAll": "Download All", - "@discographyDownloadAll": { - "description": "Option - download entire discography" - }, - "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", - "@discographyDownloadAllSubtitle": { - "description": "Subtitle showing total tracks and albums", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographyAlbumsOnly": "Albums Only", - "@discographyAlbumsOnly": { - "description": "Option - download only albums" - }, - "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", - "@discographyAlbumsOnlySubtitle": { - "description": "Subtitle showing album tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySinglesOnly": "Singles & EPs Only", - "@discographySinglesOnly": { - "description": "Option - download only singles" - }, - "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", - "@discographySinglesOnlySubtitle": { - "description": "Subtitle showing singles tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySelectAlbums": "Select Albums...", - "@discographySelectAlbums": { - "description": "Option - manually select albums to download" - }, - "discographySelectAlbumsSubtitle": "Choose specific albums or singles", - "@discographySelectAlbumsSubtitle": { - "description": "Subtitle for select albums option" - }, - "discographyFetchingTracks": "Fetching tracks...", - "@discographyFetchingTracks": { - "description": "Progress - fetching album tracks" - }, - "discographyFetchingAlbum": "Fetching {current} of {total}...", - "@discographyFetchingAlbum": { - "description": "Progress - fetching specific album", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "discographySelectedCount": "{count} selected", - "@discographySelectedCount": { - "description": "Selection count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographyDownloadSelected": "Download Selected", - "@discographyDownloadSelected": { - "description": "Button - download selected albums" - }, - "discographyAddedToQueue": "Added {count} tracks to queue", - "@discographyAddedToQueue": { - "description": "Snackbar - tracks added from discography", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", - "@discographySkippedDownloaded": { - "description": "Snackbar - with skipped tracks count", - "placeholders": { - "added": { - "type": "int" - }, - "skipped": { - "type": "int" - } - } - }, - "discographyNoAlbums": "No albums available", - "@discographyNoAlbums": { - "description": "Error - no albums found for artist" - }, - "discographyFailedToFetch": "Failed to fetch some albums", - "@discographyFailedToFetch": { - "description": "Error - some albums failed to load" - }, - "sectionStorageAccess": "Storage Access", - "@sectionStorageAccess": { - "description": "Section header for storage access settings" - }, - "allFilesAccess": "All Files Access", - "@allFilesAccess": { - "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" - }, - "allFilesAccessEnabledSubtitle": "Can write to any folder", - "@allFilesAccessEnabledSubtitle": { - "description": "Subtitle when all files access is enabled" - }, - "allFilesAccessDisabledSubtitle": "Limited to media folders only", - "@allFilesAccessDisabledSubtitle": { - "description": "Subtitle when all files access is disabled" - }, - "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", - "@allFilesAccessDescription": { - "description": "Description explaining when to enable all files access" - }, - "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", - "@allFilesAccessDeniedMessage": { - "description": "Message when permission is permanently denied" - }, - "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", - "@allFilesAccessDisabledMessage": { - "description": "Snackbar message when user disables all files access" - }, - "settingsLocalLibrary": "Local Library", - "@settingsLocalLibrary": { - "description": "Settings menu item - local library" - }, - "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", - "@settingsLocalLibrarySubtitle": { - "description": "Subtitle for local library settings" - }, - "settingsCache": "Storage & Cache", - "@settingsCache": { - "description": "Settings menu item - cache management" - }, - "settingsCacheSubtitle": "View size and clear cached data", - "@settingsCacheSubtitle": { - "description": "Subtitle for cache management menu" - }, - "libraryTitle": "Local Library", - "@libraryTitle": { - "description": "Library settings page title" - }, - "libraryScanSettings": "Scan Settings", - "@libraryScanSettings": { - "description": "Section header for scan settings" - }, - "libraryEnableLocalLibrary": "Enable Local Library", - "@libraryEnableLocalLibrary": { - "description": "Toggle to enable library scanning" - }, - "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", - "@libraryEnableLocalLibrarySubtitle": { - "description": "Subtitle for enable toggle" - }, - "libraryFolder": "Library Folder", - "@libraryFolder": { - "description": "Folder selection setting" - }, - "libraryFolderHint": "Tap to select folder", - "@libraryFolderHint": { - "description": "Placeholder when no folder selected" - }, - "libraryShowDuplicateIndicator": "Show Duplicate Indicator", - "@libraryShowDuplicateIndicator": { - "description": "Toggle for duplicate indicator in search" - }, - "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", - "@libraryShowDuplicateIndicatorSubtitle": { - "description": "Subtitle for duplicate indicator toggle" - }, - "libraryAutoScan": "Auto Scan", - "@libraryAutoScan": { - "description": "Setting for automatic library scanning" - }, - "libraryAutoScanSubtitle": "Automatically scan your library for new files", - "@libraryAutoScanSubtitle": { - "description": "Subtitle for auto scan setting" - }, - "libraryAutoScanOff": "Off", - "@libraryAutoScanOff": { - "description": "Auto scan disabled" - }, - "libraryAutoScanOnOpen": "Every app open", - "@libraryAutoScanOnOpen": { - "description": "Auto scan when app opens" - }, - "libraryAutoScanDaily": "Daily", - "@libraryAutoScanDaily": { - "description": "Auto scan once per day" - }, - "libraryAutoScanWeekly": "Weekly", - "@libraryAutoScanWeekly": { - "description": "Auto scan once per week" - }, - "libraryActions": "Actions", - "@libraryActions": { - "description": "Section header for library actions" - }, - "libraryScan": "Scan Library", - "@libraryScan": { - "description": "Button to start library scan" - }, - "libraryScanSubtitle": "Scan for audio files", - "@libraryScanSubtitle": { - "description": "Subtitle for scan button" - }, - "libraryScanSelectFolderFirst": "Select a folder first", - "@libraryScanSelectFolderFirst": { - "description": "Message when trying to scan without folder" - }, - "libraryCleanupMissingFiles": "Cleanup Missing Files", - "@libraryCleanupMissingFiles": { - "description": "Button to remove entries for missing files" - }, - "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", - "@libraryCleanupMissingFilesSubtitle": { - "description": "Subtitle for cleanup button" - }, - "libraryClear": "Clear Library", - "@libraryClear": { - "description": "Button to clear all library entries" - }, - "libraryClearSubtitle": "Remove all scanned tracks", - "@libraryClearSubtitle": { - "description": "Subtitle for clear button" - }, - "libraryClearConfirmTitle": "Clear Library", - "@libraryClearConfirmTitle": { - "description": "Dialog title for clear confirmation" - }, - "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", - "@libraryClearConfirmMessage": { - "description": "Dialog message for clear confirmation" - }, - "libraryAbout": "About Local Library", - "@libraryAbout": { - "description": "Section header for about info" - }, - "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", - "@libraryAboutDescription": { - "description": "Description of local library feature" - }, - "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", - "@libraryTracksUnit": { - "description": "Unit label for tracks count (without the number itself)", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryFilesUnit": "{count, plural, =1{file} other{files}}", - "@libraryFilesUnit": { - "description": "Unit label for files count during library scanning", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryLastScanned": "Last scanned: {time}", - "@libraryLastScanned": { - "description": "Last scan time display", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "libraryLastScannedNever": "Never", - "@libraryLastScannedNever": { - "description": "Shown when library has never been scanned" - }, - "libraryScanning": "Scanning...", - "@libraryScanning": { - "description": "Status during scan" - }, - "libraryScanFinalizing": "Finalizing library...", - "@libraryScanFinalizing": { - "description": "Status shown after file scanning finishes but library persistence is still running" - }, - "libraryScanProgress": "{progress}% of {total} files", - "@libraryScanProgress": { - "description": "Scan progress display", - "placeholders": { - "progress": { - "type": "String" - }, - "total": { - "type": "int" - } - } - }, - "libraryInLibrary": "In Library", - "@libraryInLibrary": { - "description": "Badge shown on tracks that exist in local library" - }, - "libraryRemovedMissingFiles": "Removed {count} missing files from library", - "@libraryRemovedMissingFiles": { - "description": "Snackbar after cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryCleared": "Library cleared", - "@libraryCleared": { - "description": "Snackbar after clearing library" - }, - "libraryStorageAccessRequired": "Storage Access Required", - "@libraryStorageAccessRequired": { - "description": "Dialog title for storage permission" - }, - "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", - "@libraryStorageAccessMessage": { - "description": "Dialog message for storage permission" - }, - "libraryFolderNotExist": "Selected folder does not exist", - "@libraryFolderNotExist": { - "description": "Error when folder doesn't exist" - }, - "librarySourceDownloaded": "Downloaded", - "@librarySourceDownloaded": { - "description": "Badge for tracks downloaded via SpotiFLAC" - }, - "librarySourceLocal": "Local", - "@librarySourceLocal": { - "description": "Badge for tracks from local library scan" - }, - "libraryFilterAll": "All", - "@libraryFilterAll": { - "description": "Filter chip - show all library items" - }, - "libraryFilterDownloaded": "Downloaded", - "@libraryFilterDownloaded": { - "description": "Filter chip - show only downloaded items" - }, - "libraryFilterLocal": "Local", - "@libraryFilterLocal": { - "description": "Filter chip - show only local library items" - }, - "libraryFilterTitle": "Filters", - "@libraryFilterTitle": { - "description": "Filter bottom sheet title" - }, - "libraryFilterReset": "Reset", - "@libraryFilterReset": { - "description": "Reset all filters button" - }, - "libraryFilterApply": "Apply", - "@libraryFilterApply": { - "description": "Apply filters button" - }, - "libraryFilterSource": "Source", - "@libraryFilterSource": { - "description": "Filter section - source type" - }, - "libraryFilterQuality": "Quality", - "@libraryFilterQuality": { - "description": "Filter section - audio quality" - }, - "libraryFilterQualityHiRes": "Hi-Res (24bit)", - "@libraryFilterQualityHiRes": { - "description": "Filter option - high resolution audio" - }, - "libraryFilterQualityCD": "CD (16bit)", - "@libraryFilterQualityCD": { - "description": "Filter option - CD quality audio" - }, - "libraryFilterQualityLossy": "Lossy", - "@libraryFilterQualityLossy": { - "description": "Filter option - lossy compressed audio" - }, - "libraryFilterFormat": "Format", - "@libraryFilterFormat": { - "description": "Filter section - file format" - }, - "libraryFilterMetadata": "Metadata", - "@libraryFilterMetadata": { - "description": "Filter section - metadata completeness" - }, - "libraryFilterMetadataComplete": "Complete metadata", - "@libraryFilterMetadataComplete": { - "description": "Filter option - items with complete metadata" - }, - "libraryFilterMetadataMissingAny": "Missing any metadata", - "@libraryFilterMetadataMissingAny": { - "description": "Filter option - items missing any tracked metadata field" - }, - "libraryFilterMetadataMissingYear": "Missing year", - "@libraryFilterMetadataMissingYear": { - "description": "Filter option - items missing release year/date" - }, - "libraryFilterMetadataMissingGenre": "Missing genre", - "@libraryFilterMetadataMissingGenre": { - "description": "Filter option - items missing genre" - }, - "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", - "@libraryFilterMetadataMissingAlbumArtist": { - "description": "Filter option - items missing album artist" - }, - "libraryFilterSort": "Sort", - "@libraryFilterSort": { - "description": "Filter section - sort order" - }, - "libraryFilterSortLatest": "Latest", - "@libraryFilterSortLatest": { - "description": "Sort option - newest first" - }, - "libraryFilterSortOldest": "Oldest", - "@libraryFilterSortOldest": { - "description": "Sort option - oldest first" - }, - "libraryFilterSortAlbumAsc": "Album (A-Z)", - "@libraryFilterSortAlbumAsc": { - "description": "Sort option - album ascending" - }, - "libraryFilterSortAlbumDesc": "Album (Z-A)", - "@libraryFilterSortAlbumDesc": { - "description": "Sort option - album descending" - }, - "libraryFilterSortGenreAsc": "Genre (A-Z)", - "@libraryFilterSortGenreAsc": { - "description": "Sort option - genre ascending" - }, - "libraryFilterSortGenreDesc": "Genre (Z-A)", - "@libraryFilterSortGenreDesc": { - "description": "Sort option - genre descending" - }, - "timeJustNow": "Just now", - "@timeJustNow": { - "description": "Relative time - less than a minute ago" - }, - "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", - "@timeMinutesAgo": { - "description": "Relative time - minutes ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", - "@timeHoursAgo": { - "description": "Relative time - hours ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC!", - "@tutorialWelcomeTitle": { - "description": "Tutorial welcome page title" - }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", - "@tutorialWelcomeDesc": { - "description": "Tutorial welcome page description" - }, - "tutorialWelcomeTip1": "Download music from Spotify, Deezer, or paste any supported URL", - "@tutorialWelcomeTip1": { - "description": "Tutorial welcome tip 1" - }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", - "@tutorialWelcomeTip2": { - "description": "Tutorial welcome tip 2" - }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", - "@tutorialWelcomeTip3": { - "description": "Tutorial welcome tip 3" - }, - "tutorialSearchTitle": "Finding Music", - "@tutorialSearchTitle": { - "description": "Tutorial search page title" - }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", - "@tutorialSearchDesc": { - "description": "Tutorial search page description" - }, - "tutorialDownloadTitle": "Downloading Music", - "@tutorialDownloadTitle": { - "description": "Tutorial download page title" - }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", - "@tutorialDownloadDesc": { - "description": "Tutorial download page description" - }, - "tutorialLibraryTitle": "Your Library", - "@tutorialLibraryTitle": { - "description": "Tutorial library page title" - }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", - "@tutorialLibraryDesc": { - "description": "Tutorial library page description" - }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", - "@tutorialLibraryTip1": { - "description": "Tutorial library tip 1" - }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", - "@tutorialLibraryTip2": { - "description": "Tutorial library tip 2" - }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", - "@tutorialLibraryTip3": { - "description": "Tutorial library tip 3" - }, - "tutorialExtensionsTitle": "Extensions", - "@tutorialExtensionsTitle": { - "description": "Tutorial extensions page title" - }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", - "@tutorialExtensionsDesc": { - "description": "Tutorial extensions page description" - }, - "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", - "@tutorialExtensionsTip1": { - "description": "Tutorial extensions tip 1" - }, - "tutorialExtensionsTip2": "Add new download providers or search sources", - "@tutorialExtensionsTip2": { - "description": "Tutorial extensions tip 2" - }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", - "@tutorialExtensionsTip3": { - "description": "Tutorial extensions tip 3" - }, - "tutorialSettingsTitle": "Customize Your Experience", - "@tutorialSettingsTitle": { - "description": "Tutorial settings page title" - }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", - "@tutorialSettingsDesc": { - "description": "Tutorial settings page description" - }, - "tutorialSettingsTip1": "Change download location and folder organization", - "@tutorialSettingsTip1": { - "description": "Tutorial settings tip 1" - }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", - "@tutorialSettingsTip2": { - "description": "Tutorial settings tip 2" - }, - "tutorialSettingsTip3": "Customize app theme and appearance", - "@tutorialSettingsTip3": { - "description": "Tutorial settings tip 3" - }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", - "@tutorialReadyMessage": { - "description": "Tutorial completion message" - }, - "libraryForceFullScan": "Force Full Scan", - "@libraryForceFullScan": { - "description": "Button to force a complete rescan of library" - }, - "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", - "@libraryForceFullScanSubtitle": { - "description": "Subtitle for force full scan button" - }, - "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", - "@cleanupOrphanedDownloads": { - "description": "Button to remove history entries for deleted files" - }, - "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", - "@cleanupOrphanedDownloadsSubtitle": { - "description": "Subtitle for orphaned cleanup button" - }, - "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", - "@cleanupOrphanedDownloadsResult": { - "description": "Snackbar after orphan cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cleanupOrphanedDownloadsNone": "No orphaned entries found", - "@cleanupOrphanedDownloadsNone": { - "description": "Snackbar when no orphans found" - }, - "cacheTitle": "Storage & Cache", - "@cacheTitle": { - "description": "Cache management page title" - }, - "cacheSummaryTitle": "Cache overview", - "@cacheSummaryTitle": { - "description": "Heading for cache summary card" - }, - "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", - "@cacheSummarySubtitle": { - "description": "Helper text for cache summary card" - }, - "cacheEstimatedTotal": "Estimated cache usage: {size}", - "@cacheEstimatedTotal": { - "description": "Total cache size shown in summary", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheSectionStorage": "Cached Data", - "@cacheSectionStorage": { - "description": "Section header for cache entries" - }, - "cacheSectionMaintenance": "Maintenance", - "@cacheSectionMaintenance": { - "description": "Section header for cleanup actions" - }, - "cacheAppDirectory": "App cache directory", - "@cacheAppDirectory": { - "description": "Cache item title for app cache directory" - }, - "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", - "@cacheAppDirectoryDesc": { - "description": "Description of what app cache directory contains" - }, - "cacheTempDirectory": "Temporary directory", - "@cacheTempDirectory": { - "description": "Cache item title for temporary files directory" - }, - "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", - "@cacheTempDirectoryDesc": { - "description": "Description of what temporary directory contains" - }, - "cacheCoverImage": "Cover image cache", - "@cacheCoverImage": { - "description": "Cache item title for persistent cover images" - }, - "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", - "@cacheCoverImageDesc": { - "description": "Description of what cover image cache contains" - }, - "cacheLibraryCover": "Library cover cache", - "@cacheLibraryCover": { - "description": "Cache item title for local library cover art images" - }, - "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", - "@cacheLibraryCoverDesc": { - "description": "Description of what library cover cache contains" - }, - "cacheExploreFeed": "Explore feed cache", - "@cacheExploreFeed": { - "description": "Cache item title for explore home feed cache" - }, - "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", - "@cacheExploreFeedDesc": { - "description": "Description of what explore feed cache contains" - }, - "cacheTrackLookup": "Track lookup cache", - "@cacheTrackLookup": { - "description": "Cache item title for track ID lookup cache" - }, - "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", - "@cacheTrackLookupDesc": { - "description": "Description of what track lookup cache contains" - }, - "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", - "@cacheCleanupUnusedDesc": { - "description": "Description of what cleanup unused data does" - }, - "cacheNoData": "No cached data", - "@cacheNoData": { - "description": "Label when cache category has no data" - }, - "cacheSizeWithFiles": "{size} in {count} files", - "@cacheSizeWithFiles": { - "description": "Cache size and file count", - "placeholders": { - "size": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "cacheSizeOnly": "{size}", - "@cacheSizeOnly": { - "description": "Cache size only", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheEntries": "{count} entries", - "@cacheEntries": { - "description": "Track cache entry count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cacheClearSuccess": "Cleared: {target}", - "@cacheClearSuccess": { - "description": "Snackbar after clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearConfirmTitle": "Clear cache?", - "@cacheClearConfirmTitle": { - "description": "Dialog title before clearing one cache category" - }, - "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", - "@cacheClearConfirmMessage": { - "description": "Dialog message before clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearAllConfirmTitle": "Clear all cache?", - "@cacheClearAllConfirmTitle": { - "description": "Dialog title before clearing all caches" - }, - "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", - "@cacheClearAllConfirmMessage": { - "description": "Dialog message before clearing all caches" - }, - "cacheClearAll": "Clear all cache", - "@cacheClearAll": { - "description": "Button label to clear all caches" - }, - "cacheCleanupUnused": "Cleanup unused data", - "@cacheCleanupUnused": { - "description": "Action title for cleaning unused entries" - }, - "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", - "@cacheCleanupUnusedSubtitle": { - "description": "Subtitle for cleanup unused data action" - }, - "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", - "@cacheCleanupResult": { - "description": "Snackbar after unused data cleanup", - "placeholders": { - "downloadCount": { - "type": "int" - }, - "libraryCount": { - "type": "int" - } - } - }, - "cacheRefreshStats": "Refresh stats", - "@cacheRefreshStats": { - "description": "Button label to refresh cache statistics" - }, - "trackSaveCoverArt": "Save Cover Art", - "@trackSaveCoverArt": { - "description": "Menu action - save album cover art as file" - }, - "trackSaveLyrics": "Save Lyrics (.lrc)", - "@trackSaveLyrics": { - "description": "Menu action - save lyrics as .lrc file" - }, - "trackSaveLyricsProgress": "Saving lyrics...", - "@trackSaveLyricsProgress": { - "description": "Snackbar while saving lyrics to file" - }, - "trackReEnrich": "Re-enrich", - "@trackReEnrich": { - "description": "Menu action - re-embed metadata into audio file" - }, - "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", - "@trackReEnrichOnlineSubtitle": { - "description": "Subtitle for re-enrich metadata action for local items" - }, - "trackReEnrichFieldCover": "Cover Art", - "@trackReEnrichFieldCover": { - "description": "Checkbox label for cover art field in re-enrich" - }, - "trackReEnrichFieldLyrics": "Lyrics", - "@trackReEnrichFieldLyrics": { - "description": "Checkbox label for lyrics field in re-enrich" - }, - "trackReEnrichFieldBasicTags": "Album, Album Artist", - "@trackReEnrichFieldBasicTags": { - "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" - }, - "trackReEnrichFieldTrackInfo": "Track & Disc Number", - "@trackReEnrichFieldTrackInfo": { - "description": "Checkbox label for track info in re-enrich" - }, - "trackReEnrichFieldReleaseInfo": "Date & ISRC", - "@trackReEnrichFieldReleaseInfo": { - "description": "Checkbox label for release info in re-enrich" - }, - "trackReEnrichFieldExtra": "Genre, Label, Copyright", - "@trackReEnrichFieldExtra": { - "description": "Checkbox label for extra metadata in re-enrich" - }, - "trackReEnrichSelectAll": "Select All", - "@trackReEnrichSelectAll": { - "description": "Select all fields checkbox in re-enrich" - }, - "trackEditMetadata": "Edit Metadata", - "@trackEditMetadata": { - "description": "Menu action - edit embedded metadata" - }, - "trackCoverSaved": "Cover art saved to {fileName}", - "@trackCoverSaved": { - "description": "Snackbar after cover art saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackCoverNoSource": "No cover art source available", - "@trackCoverNoSource": { - "description": "Snackbar when no cover art URL or embedded cover" - }, - "trackLyricsSaved": "Lyrics saved to {fileName}", - "@trackLyricsSaved": { - "description": "Snackbar after lyrics saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackReEnrichProgress": "Re-enriching metadata...", - "@trackReEnrichProgress": { - "description": "Snackbar while re-enriching metadata" - }, - "trackReEnrichSearching": "Searching metadata online...", - "@trackReEnrichSearching": { - "description": "Snackbar while searching metadata from internet for local items" - }, - "trackReEnrichSuccess": "Metadata re-enriched successfully", - "@trackReEnrichSuccess": { - "description": "Snackbar after successful re-enrichment" - }, - "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", - "@trackReEnrichFfmpegFailed": { - "description": "Snackbar when FFmpeg embed fails for MP3/Opus" - }, - "queueFlacAction": "Queue FLAC", - "@queueFlacAction": { - "description": "Action/button label for queueing FLAC redownloads for local tracks" - }, - "queueFlacConfirmMessage": "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", - "@queueFlacConfirmMessage": { - "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueFlacNoReliableMatches": "No reliable online matches found for the selection", - "@queueFlacNoReliableMatches": { - "description": "Snackbar when no safe FLAC redownload matches were found" - }, - "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", - "@queueFlacQueuedWithSkipped": { - "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", - "placeholders": { - "addedCount": { - "type": "int" - }, - "skippedCount": { - "type": "int" - } - } - }, - "trackSaveFailed": "Failed: {error}", - "@trackSaveFailed": { - "description": "Snackbar when save operation fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "trackConvertFormat": "Convert Format", - "@trackConvertFormat": { - "description": "Menu item - convert audio format" - }, - "trackConvertTitle": "Convert Audio", - "@trackConvertTitle": { - "description": "Title of convert bottom sheet" - }, - "trackConvertTargetFormat": "Target Format", - "@trackConvertTargetFormat": { - "description": "Label for format selection" - }, - "trackConvertBitrate": "Bitrate", - "@trackConvertBitrate": { - "description": "Label for bitrate selection" - }, - "trackConvertConfirmTitle": "Confirm Conversion", - "@trackConvertConfirmTitle": { - "description": "Confirmation dialog title" - }, - "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", - "@trackConvertConfirmMessage": { - "description": "Confirmation dialog message", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", - "@trackConvertConfirmMessageLossless": { - "description": "Confirmation dialog message for lossless-to-lossless conversion", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - } - } - }, - "trackConvertLosslessHint": "Lossless conversion — no quality loss", - "@trackConvertLosslessHint": { - "description": "Hint shown when converting between lossless formats" - }, - "trackConvertConverting": "Converting audio...", - "@trackConvertConverting": { - "description": "Snackbar while converting" - }, - "trackConvertSuccess": "Converted to {format} successfully", - "@trackConvertSuccess": { - "description": "Snackbar after successful conversion", - "placeholders": { - "format": { - "type": "String" - } - } - }, - "trackConvertFailed": "Conversion failed", - "@trackConvertFailed": { - "description": "Snackbar when conversion fails" - }, - "cueSplitTitle": "Split CUE Sheet", - "@cueSplitTitle": { - "description": "Title for CUE split bottom sheet" - }, - "cueSplitAlbum": "Album: {album}", - "@cueSplitAlbum": { - "description": "Album name in CUE split sheet", - "placeholders": { - "album": { - "type": "String" - } - } - }, - "cueSplitArtist": "Artist: {artist}", - "@cueSplitArtist": { - "description": "Artist name in CUE split sheet", - "placeholders": { - "artist": { - "type": "String" - } - } - }, - "cueSplitTrackCount": "{count} tracks", - "@cueSplitTrackCount": { - "description": "Number of tracks in CUE sheet", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cueSplitConfirmTitle": "Split CUE Album", - "@cueSplitConfirmTitle": { - "description": "CUE split confirmation dialog title" - }, - "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", - "@cueSplitConfirmMessage": { - "description": "CUE split confirmation dialog message", - "placeholders": { - "album": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", - "@cueSplitSplitting": { - "description": "Snackbar while splitting CUE", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "cueSplitSuccess": "Split into {count} tracks successfully", - "@cueSplitSuccess": { - "description": "Snackbar after successful CUE split", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cueSplitFailed": "CUE split failed", - "@cueSplitFailed": { - "description": "Snackbar when CUE split fails" - }, - "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", - "@cueSplitNoAudioFile": { - "description": "Error when CUE audio file is missing" - }, - "cueSplitButton": "Split into Tracks", - "@cueSplitButton": { - "description": "Button text to start CUE splitting" - }, - "actionCreate": "Create", - "@actionCreate": { - "description": "Generic action button - create" - }, - "collectionFoldersTitle": "My folders", - "@collectionFoldersTitle": { - "description": "Library section title for custom folders" - }, - "collectionWishlist": "Wishlist", - "@collectionWishlist": { - "description": "Custom folder for saved tracks to download later" - }, - "collectionLoved": "Loved", - "@collectionLoved": { - "description": "Custom folder for favorite tracks" - }, - "collectionFavoriteArtists": "Favorite Artists", - "@collectionFavoriteArtists": { - "description": "Custom folder for favorite artists" - }, - "collectionPlaylist": "Playlist", - "@collectionPlaylist": { - "description": "Single playlist label" - }, - "collectionAddToPlaylist": "Add to playlist", - "@collectionAddToPlaylist": { - "description": "Action to add a track to user playlist" - }, - "collectionCreatePlaylist": "Create playlist", - "@collectionCreatePlaylist": { - "description": "Action to create a new playlist" - }, - "collectionNoPlaylistsYet": "No playlists yet", - "@collectionNoPlaylistsYet": { - "description": "Empty state title when user has no playlists" - }, - "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", - "@collectionPlaylistTracks": { - "description": "Track count label for custom playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", - "@collectionArtistCount": { - "description": "Artist count label for favorite artists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionAddedToPlaylist": "Added to \"{playlistName}\"", - "@collectionAddedToPlaylist": { - "description": "Snackbar after adding track to playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", - "@collectionAlreadyInPlaylist": { - "description": "Snackbar when track already exists in playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistNameHint": "Playlist name", - "@collectionPlaylistNameHint": { - "description": "Hint text for playlist name input" - }, - "collectionPlaylistNameRequired": "Playlist name is required", - "@collectionPlaylistNameRequired": { - "description": "Validation error for empty playlist name" - }, - "collectionRenamePlaylist": "Rename playlist", - "@collectionRenamePlaylist": { - "description": "Action to rename playlist" - }, - "collectionDeletePlaylist": "Delete playlist", - "@collectionDeletePlaylist": { - "description": "Action to delete playlist" - }, - "collectionPlaylistRenamed": "Playlist renamed", - "@collectionPlaylistRenamed": { - "description": "Snackbar after renaming playlist" - }, - "collectionWishlistEmptyTitle": "Wishlist is empty", - "@collectionWishlistEmptyTitle": { - "description": "Wishlist empty state title" - }, - "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", - "@collectionWishlistEmptySubtitle": { - "description": "Wishlist empty state subtitle" - }, - "collectionLovedEmptyTitle": "Loved folder is empty", - "@collectionLovedEmptyTitle": { - "description": "Loved empty state title" - }, - "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", - "@collectionLovedEmptySubtitle": { - "description": "Loved empty state subtitle" - }, - "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", - "@collectionFavoriteArtistsEmptyTitle": { - "description": "Favorite artists empty state title" - }, - "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", - "@collectionFavoriteArtistsEmptySubtitle": { - "description": "Favorite artists empty state subtitle" - }, - "collectionPlaylistEmptyTitle": "Playlist is empty", - "@collectionPlaylistEmptyTitle": { - "description": "Playlist empty state title" - }, - "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", - "@collectionPlaylistEmptySubtitle": { - "description": "Playlist empty state subtitle" - }, - "collectionRemoveFromPlaylist": "Remove from playlist", - "@collectionRemoveFromPlaylist": { - "description": "Tooltip for removing track from playlist" - }, - "collectionRemoveFromFolder": "Remove from folder", - "@collectionRemoveFromFolder": { - "description": "Tooltip for removing track from wishlist/loved folder" - }, - "collectionAddedToLoved": "\"{trackName}\" added to Loved", - "@collectionAddedToLoved": { - "description": "Snackbar after adding track to loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", - "@collectionRemovedFromLoved": { - "description": "Snackbar after removing track from loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", - "@collectionAddedToWishlist": { - "description": "Snackbar after adding track to wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", - "@collectionRemovedFromWishlist": { - "description": "Snackbar after removing track from wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", - "@collectionAddedToFavoriteArtists": { - "description": "Snackbar after adding artist to favorite artists", - "placeholders": { - "artistName": { - "type": "String" - } - } - }, - "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", - "@collectionRemovedFromFavoriteArtists": { - "description": "Snackbar after removing artist from favorite artists", - "placeholders": { - "artistName": { - "type": "String" - } - } - }, - "trackOptionAddToLoved": "Add to Loved", - "@trackOptionAddToLoved": { - "description": "Bottom sheet action label - add track to loved folder" - }, - "trackOptionRemoveFromLoved": "Remove from Loved", - "@trackOptionRemoveFromLoved": { - "description": "Bottom sheet action label - remove track from loved folder" - }, - "trackOptionAddToWishlist": "Add to Wishlist", - "@trackOptionAddToWishlist": { - "description": "Bottom sheet action label - add track to wishlist" - }, - "trackOptionRemoveFromWishlist": "Remove from Wishlist", - "@trackOptionRemoveFromWishlist": { - "description": "Bottom sheet action label - remove track from wishlist" - }, - "artistOptionAddToFavorites": "Add to Favorite Artists", - "@artistOptionAddToFavorites": { - "description": "Action label - add artist to favorite artists" - }, - "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", - "@artistOptionRemoveFromFavorites": { - "description": "Action label - remove artist from favorite artists" - }, - "collectionPlaylistChangeCover": "Change cover image", - "@collectionPlaylistChangeCover": { - "description": "Bottom sheet action to pick a custom cover image for a playlist" - }, - "collectionPlaylistRemoveCover": "Remove cover image", - "@collectionPlaylistRemoveCover": { - "description": "Bottom sheet action to remove custom cover image from a playlist" - }, - "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", - "@selectionShareCount": { - "description": "Share button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionShareNoFiles": "No shareable files found", - "@selectionShareNoFiles": { - "description": "Snackbar when no selected files exist on disk" - }, - "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", - "@selectionConvertCount": { - "description": "Convert button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionConvertNoConvertible": "No convertible tracks selected", - "@selectionConvertNoConvertible": { - "description": "Snackbar when no selected tracks support conversion" - }, - "selectionBatchConvertConfirmTitle": "Batch Convert", - "@selectionBatchConvertConfirmTitle": { - "description": "Confirmation dialog title for batch conversion" - }, - "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessage": { - "description": "Confirmation dialog message for batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessageLossless": { - "description": "Confirmation dialog message for lossless batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", - "@selectionBatchConvertSuccess": { - "description": "Snackbar after batch conversion completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "downloadedAlbumDownloadedCount": "{count} downloaded", - "@downloadedAlbumDownloadedCount": { - "description": "Downloaded tracks count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", - "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { - "description": "Subtitle when album artist is used for folder names" - }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", - "@downloadUseAlbumArtistForFoldersTrackSubtitle": { - "description": "Subtitle when track artist is used for folder names" - }, - "lyricsProvidersTitle": "Lyrics Provider Priority", - "@lyricsProvidersTitle": { - "description": "Settings item title for lyrics provider order" - }, - "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", - "@lyricsProvidersDescription": { - "description": "Description on the lyrics provider priority page" - }, - "lyricsProvidersInfoText": "Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.", - "@lyricsProvidersInfoText": { - "description": "Info tip on lyrics provider priority page" - }, - "lyricsProvidersEnabledSection": "Enabled ({count})", - "@lyricsProvidersEnabledSection": { - "description": "Section header for enabled providers", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "lyricsProvidersDisabledSection": "Disabled ({count})", - "@lyricsProvidersDisabledSection": { - "description": "Section header for disabled providers", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", - "@lyricsProvidersAtLeastOne": { - "description": "Snackbar when user tries to disable the last enabled provider" - }, - "lyricsProvidersSaved": "Lyrics provider priority saved", - "@lyricsProvidersSaved": { - "description": "Snackbar after saving lyrics provider priority" - }, - "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", - "@lyricsProvidersDiscardContent": { - "description": "Body text of the discard-changes dialog on lyrics provider page" - }, - "lyricsProviderLrclibDesc": "Open-source synced lyrics database", - "@lyricsProviderLrclibDesc": { - "description": "Description for LRCLIB provider" - }, - "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", - "@lyricsProviderNeteaseDesc": { - "description": "Description for Netease provider" - }, - "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", - "@lyricsProviderMusixmatchDesc": { - "description": "Description for Musixmatch provider" - }, - "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", - "@lyricsProviderAppleMusicDesc": { - "description": "Description for Apple Music provider" - }, - "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", - "@lyricsProviderQqMusicDesc": { - "description": "Description for QQ Music provider" - }, - "lyricsProviderLyricsPlusDesc": "Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)", - "@lyricsProviderLyricsPlusDesc": { - "description": "Description for LyricsPlus provider" - }, - "lyricsProviderExtensionDesc": "Extension provider", - "@lyricsProviderExtensionDesc": { - "description": "Generic description for extension-based lyrics providers" - }, - "safMigrationTitle": "Storage Update Required", - "@safMigrationTitle": { - "description": "Title of SAF migration dialog" - }, - "safMigrationMessage1": "SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.", - "@safMigrationMessage1": { - "description": "First paragraph of SAF migration dialog" - }, - "safMigrationMessage2": "Please select your download folder again to switch to the new storage system.", - "@safMigrationMessage2": { - "description": "Second paragraph of SAF migration dialog" - }, - "safMigrationSuccess": "Download folder updated to SAF mode", - "@safMigrationSuccess": { - "description": "Snackbar after successfully migrating to SAF" - }, - "settingsDonate": "Support Development", - "@settingsDonate": { - "description": "Settings menu item - donate page" - }, - "settingsDonateSubtitle": "Buy the developer a coffee", - "@settingsDonateSubtitle": { - "description": "Subtitle for donate menu item" - }, - "settingsBackup": "Backup & Restore", - "@settingsBackup": { - "description": "Settings menu item - backup and restore page" - }, - "settingsBackupSubtitle": "Move your library, history and settings to a new device", - "@settingsBackupSubtitle": { - "description": "Subtitle for backup and restore settings item" - }, - "backupTitle": "Backup & Restore", - "@backupTitle": { - "description": "App bar title for the backup and restore page" - }, - "backupExportSectionTitle": "Create backup", - "@backupExportSectionTitle": { - "description": "Section title for the export/backup card" - }, - "backupExportSectionDescription": "Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.", - "@backupExportSectionDescription": { - "description": "Description of what a backup contains" - }, - "backupExportButton": "Create backup file", - "@backupExportButton": { - "description": "Button to create and share a backup file" - }, - "backupImportSectionTitle": "Restore backup", - "@backupImportSectionTitle": { - "description": "Section title for the import/restore card" - }, - "backupImportSectionDescription": "Pick a backup file to restore your data. This replaces the current settings, history and library on this device.", - "@backupImportSectionDescription": { - "description": "Description for the restore action" - }, - "backupImportButton": "Choose backup file", - "@backupImportButton": { - "description": "Button to pick a backup file to restore" - }, - "backupCreated": "Backup created", - "@backupCreated": { - "description": "Snackbar after a backup file is created" - }, - "backupCreateFailed": "Failed to create backup", - "@backupCreateFailed": { - "description": "Snackbar when backup creation fails" - }, - "backupRestoreConfirmTitle": "Restore this backup?", - "@backupRestoreConfirmTitle": { - "description": "Confirmation dialog title before restoring a backup" - }, - "backupRestoreConfirmMessage": "This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.", - "@backupRestoreConfirmMessage": { - "description": "Confirmation dialog message before restoring a backup" - }, - "backupRestoreConfirmButton": "Restore", - "@backupRestoreConfirmButton": { - "description": "Confirm button to proceed with restore" - }, - "backupRestored": "Backup restored successfully", - "@backupRestored": { - "description": "Snackbar after a successful restore" - }, - "backupRestoreFailed": "Failed to restore backup", - "@backupRestoreFailed": { - "description": "Snackbar when restore fails" - }, - "backupInvalidFile": "This file is not a valid SpotiFLAC backup", - "@backupInvalidFile": { - "description": "Snackbar when the chosen file is not a valid backup" - }, - "backupRestoreRestartHint": "Restart the app to make sure every change is applied.", - "@backupRestoreRestartHint": { - "description": "Hint shown after restoring that an app restart is recommended" - }, - "backupContentsTitle": "Backup contents", - "@backupContentsTitle": { - "description": "Header above the list summarizing what the backup contains" - }, - "backupContentsSettings": "App settings", - "@backupContentsSettings": { - "description": "Backup contents row label for settings" - }, - "backupContentsHistory": "{count} history {count, plural, =1{item} other{items}}", - "@backupContentsHistory": { - "description": "Backup contents row for history count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsLiked": "{count} liked {count, plural, =1{track} other{tracks}}", - "@backupContentsLiked": { - "description": "Backup contents row for liked tracks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsWishlist": "{count} wishlist {count, plural, =1{track} other{tracks}}", - "@backupContentsWishlist": { - "description": "Backup contents row for wishlist tracks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsPlaylists": "{count, plural, =1{1 playlist} other{{count} playlists}}", - "@backupContentsPlaylists": { - "description": "Backup contents row for playlist count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsArtists": "{count, plural, =1{1 favorite artist} other{{count} favorite artists}}", - "@backupContentsArtists": { - "description": "Backup contents row for favorite artists count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsExtensions": "{count, plural, =1{1 extension} other{{count} extensions}}", - "@backupContentsExtensions": { - "description": "Backup contents row for installed extensions count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupIncludeSecrets": "Include extension credentials", - "@backupIncludeSecrets": { - "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" - }, - "backupIncludeSecretsDescription": "Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.", - "@backupIncludeSecretsDescription": { - "description": "Explanation for the include-credentials toggle" - }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", - "@backupExtensionsRestoreFailed": { - "description": "Snackbar/hint when some extensions failed to reinstall during restore", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tooltipLoveAll": "Love All", - "@tooltipLoveAll": { - "description": "Tooltip for the Love All button on album/playlist screens" - }, - "tooltipAddToPlaylist": "Add to Playlist", - "@tooltipAddToPlaylist": { - "description": "Tooltip for the Add to Playlist button" - }, - "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", - "@snackbarRemovedTracksFromLoved": { - "description": "Snackbar after removing multiple tracks from Loved folder", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", - "@snackbarAddedTracksToLoved": { - "description": "Snackbar after adding multiple tracks to Loved folder", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogDownloadAllTitle": "Download All", - "@dialogDownloadAllTitle": { - "description": "Dialog title for bulk download confirmation" - }, - "dialogDownloadAllMessage": "Download {count} tracks?", - "@dialogDownloadAllMessage": { - "description": "Body of the Download All confirmation dialog", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "homeSkipAlreadyDownloaded": "Skip already downloaded songs", - "@homeSkipAlreadyDownloaded": { - "description": "Checkbox label in import dialog to skip already-downloaded songs" - }, - "homeGoToAlbum": "Go to Album", - "@homeGoToAlbum": { - "description": "Context menu item to navigate to the album page" - }, - "homeAlbumInfoUnavailable": "Album info not available", - "@homeAlbumInfoUnavailable": { - "description": "Snackbar when album info cannot be loaded" - }, - "snackbarLoadingCueSheet": "Loading CUE sheet...", - "@snackbarLoadingCueSheet": { - "description": "Snackbar while loading a CUE sheet file" - }, - "snackbarMetadataSaved": "Metadata saved successfully", - "@snackbarMetadataSaved": { - "description": "Snackbar after successfully saving track metadata" - }, - "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", - "@snackbarFailedToEmbedLyrics": { - "description": "Snackbar when lyrics embedding fails" - }, - "snackbarFailedToWriteStorage": "Failed to write back to storage", - "@snackbarFailedToWriteStorage": { - "description": "Snackbar when writing metadata back to file fails" - }, - "snackbarError": "Error: {error}", - "@snackbarError": { - "description": "Generic error snackbar with error detail", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "snackbarNoActionDefined": "No action defined for this button", - "@snackbarNoActionDefined": { - "description": "Snackbar when an extension button has no action configured" - }, - "noTracksFoundForAlbum": "No tracks found for this album", - "@noTracksFoundForAlbum": { - "description": "Empty state message when an album has no tracks" - }, - "downloadLocationSubtitle": "Choose where to save your downloaded tracks", - "@downloadLocationSubtitle": { - "description": "Subtitle shown in the download location picker sheet" - }, - "storageModeAppFolder": "App Folder (Recommended)", - "@storageModeAppFolder": { - "description": "Storage mode option - app-managed folder" - }, - "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", - "@storageModeAppFolderSubtitle": { - "description": "Subtitle for app folder storage mode" - }, - "storageModeSaf": "Custom Folder (SAF)", - "@storageModeSaf": { - "description": "Storage mode option - Storage Access Framework" - }, - "storageModeSafSubtitle": "Pick any folder, including SD card", - "@storageModeSafSubtitle": { - "description": "Subtitle for SAF storage mode" - }, - "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", - "@downloadFilenameDescription": { - "description": "Description shown in filename format editor" - }, - "downloadFilenameInsertTag": "Tap to insert tag:", - "@downloadFilenameInsertTag": { - "description": "Label above filename tag chips" - }, - "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", - "@downloadSeparateSinglesEnabled": { - "description": "Subtitle when separate singles folder is on" - }, - "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", - "@downloadSeparateSinglesDisabled": { - "description": "Subtitle when separate singles folder is off" - }, - "downloadArtistNameFilters": "Artist Name Filters", - "@downloadArtistNameFilters": { - "description": "Setting title for artist folder filter options" - }, - "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", - "@downloadCreatePlaylistSourceFolder": { - "description": "Setting to create a subfolder per playlist source" - }, - "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", - "@downloadCreatePlaylistSourceFolderEnabled": { - "description": "Subtitle when playlist folder is enabled" - }, - "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", - "@downloadCreatePlaylistSourceFolderDisabled": { - "description": "Subtitle when playlist folder is disabled" - }, - "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", - "@downloadCreatePlaylistSourceFolderRedundant": { - "description": "Subtitle when folder organization is already set to playlist" - }, - "downloadSongLinkRegion": "SongLink Region", - "@downloadSongLinkRegion": { - "description": "Setting for SongLink region used during fallback resolution" - }, - "downloadNetworkCompatibilityMode": "Network Compatibility Mode", - "@downloadNetworkCompatibilityMode": { - "description": "Setting for legacy TLS/network handling" - }, - "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", - "@downloadNetworkCompatibilityModeEnabled": { - "description": "Subtitle when network compatibility mode is on" - }, - "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", - "@downloadNetworkCompatibilityModeDisabled": { - "description": "Subtitle when network compatibility mode is off" - }, - "downloadAllowLocalNetwork": "Allow Local Network Access", - "@downloadAllowLocalNetwork": { - "description": "Setting title for allowing requests to private/local network targets" - }, - "downloadAllowLocalNetworkEnabled": "Requests to local/private addresses are allowed (for local proxy or custom DNS)", - "@downloadAllowLocalNetworkEnabled": { - "description": "Subtitle when allow local network access is on" - }, - "downloadAllowLocalNetworkDisabled": "Local/private addresses are blocked for security", - "@downloadAllowLocalNetworkDisabled": { - "description": "Subtitle when allow local network access is off" - }, - "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", - "@downloadSelectServiceToEnable": { - "description": "Subtitle when quality picker is disabled due to extension service" - }, - "downloadEmbedLyricsDisabled": "Enable metadata embedding first", - "@downloadEmbedLyricsDisabled": { - "description": "Subtitle when lyrics embedding is blocked by metadata toggle" - }, - "downloadNeteaseIncludeTranslation": "Netease: Include Translation", - "@downloadNeteaseIncludeTranslation": { - "description": "Setting to include translated lyrics from Netease" - }, - "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", - "@downloadNeteaseIncludeTranslationEnabled": { - "description": "Subtitle when Netease translation is on" - }, - "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", - "@downloadNeteaseIncludeTranslationDisabled": { - "description": "Subtitle when Netease translation is off" - }, - "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", - "@downloadNeteaseIncludeRomanization": { - "description": "Setting to include romanized lyrics from Netease" - }, - "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", - "@downloadNeteaseIncludeRomanizationEnabled": { - "description": "Subtitle when Netease romanization is on" - }, - "downloadNeteaseIncludeRomanizationDisabled": "No romanization", - "@downloadNeteaseIncludeRomanizationDisabled": { - "description": "Subtitle when Netease romanization is off" - }, - "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", - "@downloadAppleQqMultiPerson": { - "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" - }, - "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", - "@downloadAppleQqMultiPersonEnabled": { - "description": "Subtitle when multi-person lyrics is on" - }, - "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", - "@downloadAppleQqMultiPersonDisabled": { - "description": "Subtitle when multi-person lyrics is off" - }, - "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", - "@downloadAppleElrcWordSync": { - "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" - }, - "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", - "@downloadAppleElrcWordSyncEnabled": { - "description": "Subtitle when Apple Music eLRC word sync is enabled" - }, - "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", - "@downloadAppleElrcWordSyncDisabled": { - "description": "Subtitle when Apple Music eLRC word sync is disabled" - }, - "downloadMusixmatchLanguage": "Musixmatch Language", - "@downloadMusixmatchLanguage": { - "description": "Setting for Musixmatch lyrics translation language" - }, - "downloadMusixmatchLanguageAuto": "Auto (original language)", - "@downloadMusixmatchLanguageAuto": { - "description": "Subtitle when no language is set" - }, - "downloadFilterContributing": "Filter Contributing Artists", - "@downloadFilterContributing": { - "description": "Setting to strip contributing artists from Album Artist folder name" - }, - "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", - "@downloadFilterContributingEnabled": { - "description": "Subtitle when contributing artist filter is on" - }, - "downloadFilterContributingDisabled": "Full Album Artist string used", - "@downloadFilterContributingDisabled": { - "description": "Subtitle when contributing artist filter is off" - }, - "downloadProvidersNoneEnabled": "No providers enabled", - "@downloadProvidersNoneEnabled": { - "description": "Shown when no lyrics providers are active" - }, - "downloadMusixmatchLanguageCode": "Language code", - "@downloadMusixmatchLanguageCode": { - "description": "Label for Musixmatch language input field" - }, - "downloadMusixmatchLanguageHint": "e.g. en, de, ja", - "@downloadMusixmatchLanguageHint": { - "description": "Placeholder for Musixmatch language input" - }, - "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", - "@downloadMusixmatchLanguageDesc": { - "description": "Description in Musixmatch language picker" - }, - "downloadMusixmatchAuto": "Auto", - "@downloadMusixmatchAuto": { - "description": "Button to clear Musixmatch language (use auto)" - }, - "downloadNetworkAnySubtitle": "Use WiFi or mobile data", - "@downloadNetworkAnySubtitle": { - "description": "Subtitle for any-network option in picker" - }, - "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", - "@downloadNetworkWifiOnlySubtitle": { - "description": "Subtitle for WiFi-only option in picker" - }, - "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", - "@downloadSongLinkRegionDesc": { - "description": "Description in SongLink region picker" - }, - "snackbarUnsupportedAudioFormat": "Unsupported audio format", - "@snackbarUnsupportedAudioFormat": { - "description": "Snackbar when the audio format is not supported for the requested operation" - }, - "cacheRefresh": "Refresh", - "@cacheRefresh": { - "description": "Tooltip for refresh button on cache management page" - }, - "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", - "@dialogDownloadPlaylistsMessage": { - "description": "Dialog message for bulk playlist download confirmation", - "placeholders": { - "trackCount": { - "type": "int" - }, - "playlistCount": { - "type": "int" - } - } - }, - "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", - "@bulkDownloadPlaylistsButton": { - "description": "Button label for bulk downloading selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "bulkDownloadSelectPlaylists": "Select playlists to download", - "@bulkDownloadSelectPlaylists": { - "description": "Button label when no playlists are selected for download" - }, - "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", - "@snackbarSelectedPlaylistsEmpty": { - "description": "Snackbar when selected playlists contain no tracks" - }, - "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", - "@playlistsCount": { - "description": "Playlist count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "editMetadataAutoFill": "Auto-fill from online", - "@editMetadataAutoFill": { - "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" - }, - "editMetadataAutoFillDesc": "Select fields to fill automatically from online metadata", - "@editMetadataAutoFillDesc": { - "description": "Description for the auto-fill section" - }, - "editMetadataAutoFillFetch": "Fetch & Fill", - "@editMetadataAutoFillFetch": { - "description": "Button label to fetch online metadata and fill selected fields" - }, - "editMetadataAutoFillSearching": "Searching online...", - "@editMetadataAutoFillSearching": { - "description": "Snackbar shown while searching for online metadata" - }, - "editMetadataAutoFillNoResults": "No matching metadata found online", - "@editMetadataAutoFillNoResults": { - "description": "Snackbar when online metadata search returns no results" - }, - "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", - "@editMetadataAutoFillDone": { - "description": "Snackbar confirming how many fields were auto-filled", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", - "@editMetadataAutoFillNoneSelected": { - "description": "Snackbar when user taps Fetch without selecting any fields" - }, - "editMetadataFieldTitle": "Title", - "@editMetadataFieldTitle": { - "description": "Chip label for title field in auto-fill selector" - }, - "editMetadataFieldArtist": "Artist", - "@editMetadataFieldArtist": { - "description": "Chip label for artist field in auto-fill selector" - }, - "editMetadataFieldAlbum": "Album", - "@editMetadataFieldAlbum": { - "description": "Chip label for album field in auto-fill selector" - }, - "editMetadataFieldAlbumArtist": "Album Artist", - "@editMetadataFieldAlbumArtist": { - "description": "Chip label for album artist field in auto-fill selector" - }, - "editMetadataFieldDate": "Date", - "@editMetadataFieldDate": { - "description": "Chip label for date field in auto-fill selector" - }, - "editMetadataFieldTrackNum": "Track #", - "@editMetadataFieldTrackNum": { - "description": "Chip label for track number field in auto-fill selector" - }, - "editMetadataFieldDiscNum": "Disc #", - "@editMetadataFieldDiscNum": { - "description": "Chip label for disc number field in auto-fill selector" - }, - "editMetadataFieldGenre": "Genre", - "@editMetadataFieldGenre": { - "description": "Chip label for genre field in auto-fill selector" - }, - "editMetadataFieldIsrc": "ISRC", - "@editMetadataFieldIsrc": { - "description": "Chip label for ISRC field in auto-fill selector" - }, - "editMetadataFieldLabel": "Label", - "@editMetadataFieldLabel": { - "description": "Chip label for label field in auto-fill selector" - }, - "editMetadataFieldCopyright": "Copyright", - "@editMetadataFieldCopyright": { - "description": "Chip label for copyright field in auto-fill selector" - }, - "editMetadataFieldCover": "Cover Art", - "@editMetadataFieldCover": { - "description": "Chip label for cover art field in auto-fill selector" - }, - "editMetadataSelectAll": "All", - "@editMetadataSelectAll": { - "description": "Button to select all fields for auto-fill" - }, - "editMetadataSelectEmpty": "Empty only", - "@editMetadataSelectEmpty": { - "description": "Button to select only fields that are currently empty" - }, - "queueDownloadingCount": "Downloading ({count})", - "@queueDownloadingCount": { - "description": "Header for active downloads section with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueFilteringIndicator": "Filtering...", - "@queueFilteringIndicator": { - "description": "Shown while filter results are being computed" - }, - "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", - "@queueTrackCount": { - "description": "Track count label with plural support", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueAlbumCount": "{count, plural, =1{1 album} other{{count} albums}}", - "@queueAlbumCount": { - "description": "Album count label with plural support", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueEmptyAlbums": "No album downloads", - "@queueEmptyAlbums": { - "description": "Empty state title when no album downloads exist" - }, - "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", - "@queueEmptyAlbumsSubtitle": { - "description": "Empty state subtitle for album downloads" - }, - "queueEmptySingles": "No single downloads", - "@queueEmptySingles": { - "description": "Empty state title when no single track downloads exist" - }, - "queueEmptySinglesSubtitle": "Single track downloads will appear here", - "@queueEmptySinglesSubtitle": { - "description": "Empty state subtitle for single track downloads" - }, - "queueEmptyHistory": "No download history", - "@queueEmptyHistory": { - "description": "Empty state title when download history is empty" - }, - "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", - "@queueEmptyHistorySubtitle": { - "description": "Empty state subtitle for download history" - }, - "selectionAllPlaylistsSelected": "All playlists selected", - "@selectionAllPlaylistsSelected": { - "description": "Shown when all playlists are selected in selection mode" - }, - "selectionTapPlaylistsToSelect": "Tap playlists to select", - "@selectionTapPlaylistsToSelect": { - "description": "Hint shown in playlist selection mode" - }, - "selectionSelectPlaylistsToDelete": "Select playlists to delete", - "@selectionSelectPlaylistsToDelete": { - "description": "Hint shown when no playlists are selected for deletion" - }, - "audioAnalysisTitle": "Audio Quality Analysis", - "@audioAnalysisTitle": { - "description": "Title for audio analysis section" - }, - "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", - "@audioAnalysisDescription": { - "description": "Description for audio analysis tap-to-analyze prompt" - }, - "audioAnalysisAnalyzing": "Analyzing audio...", - "@audioAnalysisAnalyzing": { - "description": "Loading text while analyzing audio" - }, - "audioAnalysisSampleRate": "Sample Rate", - "@audioAnalysisSampleRate": { - "description": "Sample rate metric label" - }, - "audioAnalysisCodec": "Codec", - "@audioAnalysisCodec": { - "description": "Audio codec metric label" - }, - "audioAnalysisContainer": "Container", - "@audioAnalysisContainer": { - "description": "Audio container metric label" - }, - "audioAnalysisDecodedFormat": "Decoded Format", - "@audioAnalysisDecodedFormat": { - "description": "Decoded sample format metric label" - }, - "audioAnalysisBitDepth": "Bit Depth", - "@audioAnalysisBitDepth": { - "description": "Bit depth metric label" - }, - "audioAnalysisChannels": "Channels", - "@audioAnalysisChannels": { - "description": "Channels metric label" - }, - "audioAnalysisDuration": "Duration", - "@audioAnalysisDuration": { - "description": "Duration metric label" - }, - "audioAnalysisNyquist": "Nyquist", - "@audioAnalysisNyquist": { - "description": "Nyquist frequency metric label" - }, - "audioAnalysisFileSize": "Size", - "@audioAnalysisFileSize": { - "description": "File size metric label" - }, - "audioAnalysisDynamicRange": "Dynamic Range", - "@audioAnalysisDynamicRange": { - "description": "Dynamic range metric label" - }, - "audioAnalysisPeak": "Peak", - "@audioAnalysisPeak": { - "description": "Peak amplitude metric label" - }, - "audioAnalysisRms": "RMS", - "@audioAnalysisRms": { - "description": "RMS level metric label" - }, - "audioAnalysisLufs": "LUFS", - "@audioAnalysisLufs": { - "description": "Integrated loudness metric label" - }, - "audioAnalysisTruePeak": "True Peak", - "@audioAnalysisTruePeak": { - "description": "True peak metric label" - }, - "audioAnalysisClipping": "Clipping", - "@audioAnalysisClipping": { - "description": "Clipping metric label" - }, - "audioAnalysisNoClipping": "No clipping", - "@audioAnalysisNoClipping": { - "description": "Displayed when no clipped samples were detected" - }, - "audioAnalysisSpectralCutoff": "Spectral Cutoff", - "@audioAnalysisSpectralCutoff": { - "description": "Estimated spectral cutoff metric label" - }, - "audioAnalysisChannelStats": "Per-channel Stats", - "@audioAnalysisChannelStats": { - "description": "Per-channel audio analysis section label" - }, - "audioAnalysisSamples": "Samples", - "@audioAnalysisSamples": { - "description": "Total samples metric label" - }, - "audioAnalysisRescan": "Re-analyze", - "@audioAnalysisRescan": { - "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" - }, - "audioAnalysisRescanning": "Re-analyzing audio...", - "@audioAnalysisRescanning": { - "description": "Loading text while audio is being re-analyzed after an explicit refresh" - }, - "extensionsHomeFeedProvider": "Home Feed Provider", - "@extensionsHomeFeedProvider": { - "description": "Extensions page - label for home feed provider selector" - }, - "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", - "@extensionsHomeFeedDescription": { - "description": "Extensions page - description for home feed provider picker" - }, - "extensionsHomeFeedAuto": "Auto", - "@extensionsHomeFeedAuto": { - "description": "Label for auto-selected search provider" - }, - "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", - "@extensionsHomeFeedAutoSubtitle": { - "description": "Extensions page - subtitle for auto home feed option" - }, - "extensionsHomeFeedOff": "Off", - "@extensionsHomeFeedOff": { - "description": "Extensions page - home feed provider option: off" - }, - "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", - "@extensionsHomeFeedOffSubtitle": { - "description": "Extensions page - subtitle for off home feed option" - }, - "extensionsHomeFeedUse": "Use {extensionName} home feed", - "@extensionsHomeFeedUse": { - "description": "Extensions page - subtitle for a specific extension home feed option", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "extensionsNoHomeFeedExtensions": "No extensions with home feed", - "@extensionsNoHomeFeedExtensions": { - "description": "Extensions page - shown when no installed extension has home feed" - }, - "cancelDownloadTitle": "Cancel download?", - "@cancelDownloadTitle": { - "description": "Dialog title when confirming cancellation of an active download" - }, - "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", - "@cancelDownloadContent": { - "description": "Dialog body when confirming cancellation of an active download", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "cancelDownloadKeep": "Keep", - "@cancelDownloadKeep": { - "description": "Dialog button - keep the active download (do not cancel)" - }, - "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", - "@metadataSaveFailedFfmpeg": { - "description": "Snackbar error when FFmpeg fails to write metadata" - }, - "metadataSaveFailedStorage": "Failed to write metadata back to storage", - "@metadataSaveFailedStorage": { - "description": "Snackbar error when writing metadata file back to storage fails" - }, - "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", - "@snackbarFolderPickerFailed": { - "description": "Snackbar shown when folder picker fails to open", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "notifDownloadingTrack": "Downloading {trackName}", - "@notifDownloadingTrack": { - "description": "Notification title while downloading a track", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "notifFinalizingTrack": "Finalizing {trackName}", - "@notifFinalizingTrack": { - "description": "Notification title while finalizing (embedding metadata) a track", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "notifEmbeddingMetadata": "Embedding metadata...", - "@notifEmbeddingMetadata": { - "description": "Notification body while embedding metadata into a downloaded track" - }, - "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", - "@notifAlreadyInLibraryCount": { - "description": "Notification title when track is already in library, with count", - "placeholders": { - "completed": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "notifAlreadyInLibrary": "Already in Library", - "@notifAlreadyInLibrary": { - "description": "Notification title when track is already in library" - }, - "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", - "@notifDownloadCompleteCount": { - "description": "Notification title when download is complete, with count", - "placeholders": { - "completed": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "notifDownloadComplete": "Download Complete", - "@notifDownloadComplete": { - "description": "Notification title when a single download is complete" - }, - "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", - "@notifDownloadsFinished": { - "description": "Notification title when queue finishes with some failures", - "placeholders": { - "completed": { - "type": "int" - }, - "failed": { - "type": "int" - } - } - }, - "notifAllDownloadsComplete": "All Downloads Complete", - "@notifAllDownloadsComplete": { - "description": "Notification title when all downloads finish successfully" - }, - "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", - "@notifTracksDownloadedSuccess": { - "description": "Notification body for queue complete - how many tracks were downloaded", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", - "@notifDownloadsFinishedBody": { - "description": "Notification body when queue finishes with failures", - "placeholders": { - "completed": { - "type": "int" - }, - "failed": { - "type": "int" - } - } - }, - "notifDownloadsCanceledTitle": "Downloads canceled", - "@notifDownloadsCanceledTitle": { - "description": "Notification title when downloads are canceled by the user" - }, - "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", - "@notifDownloadsCanceledBody": { - "description": "Notification body when downloads are canceled by the user", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifScanningLibrary": "Scanning local library", - "@notifScanningLibrary": { - "description": "Notification title while scanning local library" - }, - "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", - "@notifLibraryScanProgressWithTotal": { - "description": "Notification body for library scan progress when total is known", - "placeholders": { - "scanned": { - "type": "int" - }, - "total": { - "type": "int" - }, - "percentage": { - "type": "int" - } - } - }, - "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", - "@notifLibraryScanProgressNoTotal": { - "description": "Notification body for library scan progress when total is unknown", - "placeholders": { - "scanned": { - "type": "int" - }, - "percentage": { - "type": "int" - } - } - }, - "notifLibraryScanComplete": "Library scan complete", - "@notifLibraryScanComplete": { - "description": "Notification title when library scan finishes" - }, - "notifLibraryScanCompleteBody": "{count} tracks indexed", - "@notifLibraryScanCompleteBody": { - "description": "Notification body for library scan complete - number of indexed tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanExcluded": "{count} excluded", - "@notifLibraryScanExcluded": { - "description": "Library scan complete suffix - excluded track count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanErrors": "{count} errors", - "@notifLibraryScanErrors": { - "description": "Library scan complete suffix - error count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanFailed": "Library scan failed", - "@notifLibraryScanFailed": { - "description": "Notification title when library scan fails" - }, - "notifLibraryScanCancelled": "Library scan cancelled", - "@notifLibraryScanCancelled": { - "description": "Notification title when library scan is cancelled by the user" - }, - "notifLibraryScanStopped": "Scan stopped before completion.", - "@notifLibraryScanStopped": { - "description": "Notification body when library scan is cancelled" - }, - "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", - "@notifDownloadingUpdate": { - "description": "Notification title while downloading an app update", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "notifUpdateProgress": "{received} / {total} MB • {percentage}%", - "@notifUpdateProgress": { - "description": "Notification body showing update download progress", - "placeholders": { - "received": { - "type": "String" - }, - "total": { - "type": "String" - }, - "percentage": { - "type": "int" - } - } - }, - "notifUpdateReady": "Update Ready", - "@notifUpdateReady": { - "description": "Notification title when app update download is complete" - }, - "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", - "@notifUpdateReadyBody": { - "description": "Notification body when app update is ready to install", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "notifUpdateFailed": "Update Failed", - "@notifUpdateFailed": { - "description": "Notification title when app update download fails" - }, - "notifUpdateFailedBody": "Could not download update. Try again later.", - "@notifUpdateFailedBody": { - "description": "Notification body when app update download fails" - }, - "searchTracks": "Tracks", - "@searchTracks": { - "description": "Search filter label - tracks" - }, - "homeSearchHintDefault": "Paste supported URL or search...", - "@homeSearchHintDefault": { - "description": "Default placeholder for the main search field on Home" - }, - "homeSearchHintProvider": "Search with {providerName}...", - "@homeSearchHintProvider": { - "description": "Placeholder for the main search field when a provider is selected", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, - "homeImportCsvTooltip": "Import CSV", - "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" - }, - "homeChangeSearchProviderTooltip": "Change search provider", - "@homeChangeSearchProviderTooltip": { - "description": "Tooltip for the Home search provider picker" - }, - "actionPaste": "Paste", - "@actionPaste": { - "description": "Generic action - paste from clipboard" - }, - "tutorialSearchHint": "Paste or search...", - "@tutorialSearchHint": { - "description": "Placeholder shown in the tutorial search demo" - }, - "tutorialDownloadCompletedSemantics": "Download completed", - "@tutorialDownloadCompletedSemantics": { - "description": "Accessibility label for completed download state in tutorial demo" - }, - "tutorialDownloadInProgressSemantics": "Download in progress", - "@tutorialDownloadInProgressSemantics": { - "description": "Accessibility label for active download state in tutorial demo" - }, - "tutorialStartDownloadSemantics": "Start download", - "@tutorialStartDownloadSemantics": { - "description": "Accessibility label for idle download button in tutorial demo" - }, - "optionsEmbedMetadata": "Embed Metadata", - "@optionsEmbedMetadata": { - "description": "Settings toggle title for writing metadata into downloaded files" - }, - "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", - "@optionsEmbedMetadataSubtitleOn": { - "description": "Subtitle when metadata embedding is enabled" - }, - "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", - "@optionsEmbedMetadataSubtitleOff": { - "description": "Subtitle when metadata embedding is disabled" - }, - "trackCoverNoEmbeddedArt": "No embedded album art found", - "@trackCoverNoEmbeddedArt": { - "description": "Message shown when a track file has no embedded cover art" - }, - "trackCoverReplace": "Replace Cover", - "@trackCoverReplace": { - "description": "Button label for replacing selected cover art" - }, - "trackCoverPick": "Pick Cover", - "@trackCoverPick": { - "description": "Button label for selecting cover art" - }, - "trackCoverClearSelected": "Clear selected cover", - "@trackCoverClearSelected": { - "description": "Tooltip for clearing the newly selected cover art" - }, - "trackCoverCurrent": "Current cover", - "@trackCoverCurrent": { - "description": "Label for the currently embedded cover preview" - }, - "trackCoverSelected": "Selected cover", - "@trackCoverSelected": { - "description": "Label for the newly selected cover preview" - }, - "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", - "@trackCoverReplaceNotice": { - "description": "Notice shown when a new cover has been selected but not saved yet" - }, - "actionStop": "Stop", - "@actionStop": { - "description": "Generic action - stop" - }, - "queueFinalizingDownload": "Finalizing download", - "@queueFinalizingDownload": { - "description": "Accessibility label for a queue item that is finalizing" - }, - "queueDownloadedFileMissing": "Downloaded file missing", - "@queueDownloadedFileMissing": { - "description": "Accessibility label when a downloaded file is missing from disk" - }, - "queueDownloadCompleted": "Download completed", - "@queueDownloadCompleted": { - "description": "Accessibility label for completed download state in queue" - }, - "queueRateLimitTitle": "Service rate limited", - "@queueRateLimitTitle": { - "description": "Title shown on a failed queue item when the download service rate limits requests" - }, - "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", - "@queueRateLimitMessage": { - "description": "Explanation shown on a failed queue item when the download service rate limits requests" - }, - "appearanceSelectAccentColor": "Select accent color {hex}", - "@appearanceSelectAccentColor": { - "description": "Accessibility label for picking an accent color", - "placeholders": { - "hex": { - "type": "String" - } - } - }, - "logAutoScrollOn": "Auto-scroll ON", - "@logAutoScrollOn": { - "description": "Tooltip when auto-scroll is enabled on the log screen" - }, - "logAutoScrollOff": "Auto-scroll OFF", - "@logAutoScrollOff": { - "description": "Tooltip when auto-scroll is disabled on the log screen" - }, - "logCopyLogs": "Copy logs", - "@logCopyLogs": { - "description": "Tooltip for copying logs" - }, - "logClearSearch": "Clear search", - "@logClearSearch": { - "description": "Tooltip for clearing the log search field" - }, - "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", - "@logIssueIspBlockingLabel": { - "description": "Diagnostic badge label when ISP blocking is detected" - }, - "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", - "@logIssueIspBlockingDescription": { - "description": "Diagnostic badge description for ISP blocking" - }, - "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", - "@logIssueIspBlockingSuggestion": { - "description": "Diagnostic badge suggestion for ISP blocking" - }, - "logIssueRateLimitedLabel": "RATE LIMITED", - "@logIssueRateLimitedLabel": { - "description": "Diagnostic badge label when the service rate limits requests" - }, - "logIssueRateLimitedDescription": "Too many requests to the service", - "@logIssueRateLimitedDescription": { - "description": "Diagnostic badge description for rate limiting" - }, - "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", - "@logIssueRateLimitedSuggestion": { - "description": "Diagnostic badge suggestion for rate limiting" - }, - "logIssueNetworkErrorLabel": "NETWORK ERROR", - "@logIssueNetworkErrorLabel": { - "description": "Diagnostic badge label for generic network errors" - }, - "logIssueNetworkErrorDescription": "Connection issues detected", - "@logIssueNetworkErrorDescription": { - "description": "Diagnostic badge description for generic network errors" - }, - "logIssueNetworkErrorSuggestion": "Check your internet connection", - "@logIssueNetworkErrorSuggestion": { - "description": "Diagnostic badge suggestion for generic network errors" - }, - "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", - "@logIssueTrackNotFoundLabel": { - "description": "Diagnostic badge label when a track is unavailable" - }, - "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", - "@logIssueTrackNotFoundDescription": { - "description": "Diagnostic badge description when a track is unavailable" - }, - "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", - "@logIssueTrackNotFoundSuggestion": { - "description": "Diagnostic badge suggestion when a track is unavailable" - }, - "clickableLookingUpArtist": "Looking up artist...", - "@clickableLookingUpArtist": { - "description": "Snackbar shown while clickable artist metadata is being resolved" - }, - "clickableInformationUnavailable": "{type} information not available", - "@clickableInformationUnavailable": { - "description": "Snackbar shown when clickable metadata cannot open a destination", - "placeholders": { - "type": { - "type": "String" - } - } - }, - "extensionDetailsTags": "Tags", - "@extensionDetailsTags": { - "description": "Section title for extension tags" - }, - "extensionDetailsInformation": "Information", - "@extensionDetailsInformation": { - "description": "Section title for extension metadata information" - }, - "extensionUtilityFunctions": "Utility Functions", - "@extensionUtilityFunctions": { - "description": "Capability label for utility-only extensions" - }, - "actionDismiss": "Dismiss", - "@actionDismiss": { - "description": "Generic action - dismiss" - }, - "setupChangeFolderTooltip": "Change folder", - "@setupChangeFolderTooltip": { - "description": "Tooltip for editing the selected download folder" - }, - "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", - "@a11yOpenTrackByArtist": { - "description": "Accessibility label for opening a track item", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "a11yOpenItem": "Open {itemType} {name}", - "@a11yOpenItem": { - "description": "Accessibility label for opening a generic item", - "placeholders": { - "itemType": { - "type": "String" - }, - "name": { - "type": "String" - } - } - }, - "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", - "@a11yOpenItemCount": { - "description": "Accessibility label for opening a grouped item with count", - "placeholders": { - "title": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", - "@a11yOpenAlbumByArtistTrackCount": { - "description": "Accessibility label for opening an album item with track count", - "placeholders": { - "albumName": { - "type": "String" - }, - "artistName": { - "type": "String" - }, - "trackCount": { - "type": "int" - } - } - }, - "a11yTrackByArtist": "{trackName} by {artistName}", - "@a11yTrackByArtist": { - "description": "Accessibility label for a queue or list track item", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "a11ySelectAlbum": "Select album {albumName}", - "@a11ySelectAlbum": { - "description": "Accessibility label for selecting an album", - "placeholders": { - "albumName": { - "type": "String" - } - } - }, - "a11yOpenAlbum": "Open album {albumName}", - "@a11yOpenAlbum": { - "description": "Accessibility label for opening an album", - "placeholders": { - "albumName": { - "type": "String" - } - } - }, - "settingsFiles": "Files & Folders", - "@settingsFiles": { - "description": "Settings menu item - file and folder settings" - }, - "settingsFilesSubtitle": "Download location, filename, folder structure", - "@settingsFilesSubtitle": { - "description": "Subtitle for files & folders settings" - }, - "settingsMetadata": "Metadata", - "@settingsMetadata": { - "description": "Settings menu item - metadata settings" - }, - "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", - "@settingsMetadataSubtitle": { - "description": "Subtitle for metadata settings" - }, - "settingsLyrics": "Lyrics", - "@settingsLyrics": { - "description": "Settings menu item - lyrics settings" - }, - "settingsLyricsSubtitle": "Embed, mode, providers, language options", - "@settingsLyricsSubtitle": { - "description": "Subtitle for lyrics settings" - }, - "settingsApp": "App", - "@settingsApp": { - "description": "Settings menu item - app settings" - }, - "settingsAppSubtitle": "Updates, data, extension repo, debug", - "@settingsAppSubtitle": { - "description": "Subtitle for app settings" - }, - "sectionMetadataProviders": "Providers", - "@sectionMetadataProviders": { - "description": "Settings section header for metadata providers" - }, - "sectionDuplicates": "Duplicates", - "@sectionDuplicates": { - "description": "Settings section header for deduplication" - }, - "sectionLyricsProviderOptions": "Provider Options", - "@sectionLyricsProviderOptions": { - "description": "Settings section header for per-provider lyrics options" - }, - "metadataProvidersTitle": "Metadata Provider Priority", - "@metadataProvidersTitle": { - "description": "Settings item title for metadata provider order" - }, - "metadataProvidersSubtitle": "Drag to set search and metadata source order", - "@metadataProvidersSubtitle": { - "description": "Subtitle for metadata provider priority item" - }, - "downloadDeduplication": "Skip Duplicate Downloads", - "@downloadDeduplication": { - "description": "Setting - skip tracks already in download history" - }, - "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", - "@downloadDeduplicationEnabled": { - "description": "Subtitle when deduplication is on" - }, - "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", - "@downloadDeduplicationDisabled": { - "description": "Subtitle when deduplication is off" - }, - "downloadFallbackExtensions": "Fallback Extensions", - "@downloadFallbackExtensions": { - "description": "Settings item for configuring fallback extension providers" - }, - "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", - "@downloadFallbackExtensionsSubtitle": { - "description": "Subtitle for fallback extensions item" - }, - "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", - "@editMetadataFieldDateHint": { - "description": "Hint text for the edit metadata date field" - }, - "editMetadataFieldTrackTotal": "Track Total", - "@editMetadataFieldTrackTotal": { - "description": "Label for total tracks field in the edit metadata sheet" - }, - "editMetadataFieldDiscTotal": "Disc Total", - "@editMetadataFieldDiscTotal": { - "description": "Label for total discs field in the edit metadata sheet" - }, - "editMetadataFieldComposer": "Composer", - "@editMetadataFieldComposer": { - "description": "Label for composer field in the edit metadata sheet" - }, - "editMetadataFieldComment": "Comment", - "@editMetadataFieldComment": { - "description": "Label for comment field in the edit metadata sheet" - }, - "editMetadataAdvanced": "Advanced", - "@editMetadataAdvanced": { - "description": "Expandable section label for advanced metadata fields" - }, - "libraryFilterMetadataMissingTrackNumber": "Missing track number", - "@libraryFilterMetadataMissingTrackNumber": { - "description": "Filter option - items missing track number" - }, - "libraryFilterMetadataMissingDiscNumber": "Missing disc number", - "@libraryFilterMetadataMissingDiscNumber": { - "description": "Filter option - items missing disc number" - }, - "libraryFilterMetadataMissingArtist": "Missing artist", - "@libraryFilterMetadataMissingArtist": { - "description": "Filter option - items missing artist" - }, - "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", - "@libraryFilterMetadataIncorrectIsrcFormat": { - "description": "Filter option - items with an invalid ISRC format" - }, - "libraryFilterMetadataMissingLabel": "Missing label", - "@libraryFilterMetadataMissingLabel": { - "description": "Filter option - items missing record label" - }, - "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", - "@collectionDeletePlaylistsMessage": { - "description": "Confirmation message for deleting selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", - "@collectionPlaylistsDeleted": { - "description": "Snackbar after deleting selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", - "@collectionAddedTracksToPlaylist": { - "description": "Snackbar after adding multiple tracks to a playlist", - "placeholders": { - "count": { - "type": "int" - }, - "playlistName": { - "type": "String" - } - } - }, - "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", - "@collectionAddedTracksToPlaylistWithExisting": { - "description": "Snackbar after adding multiple tracks to a playlist when some were already present", - "placeholders": { - "count": { - "type": "int" - }, - "playlistName": { - "type": "String" - }, - "alreadyCount": { - "type": "int" - } - } - }, - "itemCount": "{count} {count, plural, =1{item} other{items}}", - "@itemCount": { - "description": "Generic item count label", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", - "@trackReEnrichSuccessWithFailures": { - "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", - "placeholders": { - "successCount": { - "type": "int" - }, - "total": { - "type": "int" - }, - "failedCount": { - "type": "int" - } - } - }, - "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", - "@selectionDeleteTracksCount": { - "description": "Button label for deleting selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", - "@queueDownloadSpeedStatus": { - "description": "Queue status while downloading with speed", - "placeholders": { - "speed": { - "type": "String" - } - } - }, - "queueDownloadStarting": "Starting...", - "@queueDownloadStarting": { - "description": "Queue status before download progress is available" - }, - "a11ySelectTrack": "Select track", - "@a11ySelectTrack": { - "description": "Accessibility label for selecting a track" - }, - "a11yDeselectTrack": "Deselect track", - "@a11yDeselectTrack": { - "description": "Accessibility label for deselecting a track" - }, - "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", - "@a11yPlayTrackByArtist": { - "description": "Accessibility label for playing a local library track", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", - "@storeExtensionsCount": { - "description": "Store extension result count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "storeRequiresVersion": "Requires v{version}+", - "@storeRequiresVersion": { - "description": "Store compatibility badge for minimum app version", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "actionGo": "Go", - "@actionGo": { - "description": "Generic action button label" - }, - "logIssueSummary": "Issue Summary", - "@logIssueSummary": { - "description": "Header for log issue analysis summary" - }, - "logTotalErrors": "Total errors: {count}", - "@logTotalErrors": { - "description": "Total error count in log issue analysis", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "logAffectedDomains": "Affected: {domains}", - "@logAffectedDomains": { - "description": "Affected domains in log issue analysis", - "placeholders": { - "domains": { - "type": "String" - } - } - }, - "libraryScanCancelled": "Scan cancelled", - "@libraryScanCancelled": { - "description": "Library scan status when a scan was cancelled" - }, - "libraryScanCancelledSubtitle": "You can retry the scan when ready.", - "@libraryScanCancelledSubtitle": { - "description": "Library scan status subtitle after cancellation" - }, - "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", - "@libraryDownloadsHistoryExcluded": { - "description": "Library count note for downloaded history items excluded from the local list", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadNativeWorker": "Native download worker", - "@downloadNativeWorker": { - "description": "Setting title for Android native download worker" - }, - "downloadNativeWorkerSubtitle": "用于扩展下载的 Android 后台服务", - "@downloadNativeWorkerSubtitle": { - "description": "Setting subtitle for Android native download worker" - }, - "badgeBeta": "BETA", - "@badgeBeta": { - "description": "Badge label for beta features" - }, - "extensionServiceStatus": "Service Status", - "@extensionServiceStatus": { - "description": "Extension detail section header for service status" - }, - "extensionServiceHealth": "Service health", - "@extensionServiceHealth": { - "description": "Extension capability label for service health checks" - }, - "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", - "@extensionHealthChecksConfigured": { - "description": "Extension service health check count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", - "@extensionOauthConnectHint": { - "description": "Hint for an OAuth login link field before connecting Spotify" - }, - "extensionLastChecked": "Last checked {time}", - "@extensionLastChecked": { - "description": "Timestamp for the latest extension service health check", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "extensionRefreshStatus": "Refresh status", - "@extensionRefreshStatus": { - "description": "Tooltip for refreshing extension service health status" - }, - "extensionCustomUrlHandling": "Custom URL Handling", - "@extensionCustomUrlHandling": { - "description": "Extension detail section title for custom URL handling" - }, - "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", - "@extensionCustomUrlHandlingSubtitle": { - "description": "Extension detail subtitle for custom URL handling" - }, - "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", - "@extensionCustomUrlHandlingShareHint": { - "description": "Extension detail hint explaining share-to-app URL handling" - }, - "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", - "@extensionSettingsCount": { - "description": "Count of settings exposed by an extension quality option", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionHealthOnline": "Online", - "@extensionHealthOnline": { - "description": "Extension service health status - online" - }, - "extensionHealthDegraded": "Degraded", - "@extensionHealthDegraded": { - "description": "Extension service health status - degraded" - }, - "extensionHealthOffline": "Offline", - "@extensionHealthOffline": { - "description": "Extension service health status - offline" - }, - "extensionHealthNotConfigured": "Not configured", - "@extensionHealthNotConfigured": { - "description": "Extension service health status - not configured" - }, - "extensionHealthUnknown": "Unknown", - "@extensionHealthUnknown": { - "description": "Extension service health status - unknown" - }, - "extensionHealthRequired": "required", - "@extensionHealthRequired": { - "description": "Label for a required extension service health check" - }, - "extensionSettingNotSet": "Not set", - "@extensionSettingNotSet": { - "description": "Value shown when an extension setting has no value" - }, - "extensionActionFailed": "Action failed", - "@extensionActionFailed": { - "description": "Fallback error when an extension action fails without details" - }, - "extensionEnterValue": "Enter value", - "@extensionEnterValue": { - "description": "Hint for editing an extension setting value" - }, - "extensionHealthServiceOnline": "Service online", - "@extensionHealthServiceOnline": { - "description": "Tooltip for online extension service" - }, - "extensionHealthServiceDegraded": "Service degraded", - "@extensionHealthServiceDegraded": { - "description": "Tooltip for degraded extension service" - }, - "extensionHealthServiceOffline": "Service offline", - "@extensionHealthServiceOffline": { - "description": "Tooltip for offline extension service" - }, - "extensionHealthServiceUnknown": "Service status unknown", - "@extensionHealthServiceUnknown": { - "description": "Tooltip for unknown extension service health" - }, - "audioAnalysisStereo": "Stereo", - "@audioAnalysisStereo": { - "description": "Audio channel layout label - stereo" - }, - "audioAnalysisMono": "Mono", - "@audioAnalysisMono": { - "description": "Audio channel layout label - mono" - }, - "trackOpenInService": "Open in {serviceName}", - "@trackOpenInService": { - "description": "Button label to open a track in a named music service", - "placeholders": { - "serviceName": { - "type": "String" - } - } - }, - "trackLyricsEmbeddedSource": "Embedded", - "@trackLyricsEmbeddedSource": { - "description": "Lyrics source label for embedded lyrics" - }, - "unknownAlbum": "Unknown Album", - "@unknownAlbum": { - "description": "Fallback album name when metadata is missing" - }, - "unknownArtist": "Unknown Artist", - "@unknownArtist": { - "description": "Fallback artist name when metadata is missing" - }, - "permissionAudio": "Audio", - "@permissionAudio": { - "description": "Audio permission type label" - }, - "permissionStorage": "Storage", - "@permissionStorage": { - "description": "Storage permission type label" - }, - "permissionNotification": "Notification", - "@permissionNotification": { - "description": "Notification permission type label" - }, - "errorInvalidFolderSelected": "Invalid folder selected", - "@errorInvalidFolderSelected": { - "description": "Error when the selected folder is invalid" - }, - "storeAnyVersion": "Any", - "@storeAnyVersion": { - "description": "Store detail value when any app version is accepted" - }, - "storeCategoryMetadata": "Metadata", - "@storeCategoryMetadata": { - "description": "Store extension category - metadata" - }, - "storeCategoryDownload": "Download", - "@storeCategoryDownload": { - "description": "Store extension category - download" - }, - "storeCategoryUtility": "Utility", - "@storeCategoryUtility": { - "description": "Store extension category - utility" - }, - "storeCategoryLyrics": "Lyrics", - "@storeCategoryLyrics": { - "description": "Store extension category - lyrics" - }, - "storeCategoryIntegration": "Integration", - "@storeCategoryIntegration": { - "description": "Store extension category - integration" - }, - "artistReleases": "Releases", - "@artistReleases": { - "description": "Section header for all artist releases" - }, - "editMetadataSelectNone": "None", - "@editMetadataSelectNone": { - "description": "Button to clear selected fields for auto-fill" - }, - "queueRetryAllFailed": "Retry {count} failed", - "@queueRetryAllFailed": { - "description": "Button to retry every failed download in the queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "settingsSaveDownloadHistory": "Save download history", - "@settingsSaveDownloadHistory": { - "description": "Settings switch title for storing completed downloads in history" - }, - "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", - "@settingsSaveDownloadHistorySubtitle": { - "description": "Settings switch subtitle for storing completed downloads in history" - }, - "dialogDisableHistoryTitle": "Turn off download history?", - "@dialogDisableHistoryTitle": { - "description": "Confirmation dialog title shown before disabling download history" - }, - "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", - "@dialogDisableHistoryMessage": { - "description": "Confirmation dialog message shown before disabling download history" - }, - "dialogDisableAndClear": "Turn off and clear", - "@dialogDisableAndClear": { - "description": "Confirmation action to disable download history and clear existing entries" - }, - "openInOtherServices": "Open in Other Services", - "@openInOtherServices": { - "description": "Title and tooltip for finding the current collection in other services" - }, - "shareSheetNoExtensions": "No other compatible services", - "@shareSheetNoExtensions": { - "description": "Empty state when no extensions can be searched for cross-service links" - }, - "shareSheetNotFound": "Not found", - "@shareSheetNotFound": { - "description": "Cross-service share sheet row subtitle when a service has no match" - }, - "shareSheetCopyLink": "Copy Link", - "@shareSheetCopyLink": { - "description": "Tooltip for copying a cross-service link" - }, - "shareSheetLinkCopied": "{service} link copied", - "@shareSheetLinkCopied": { - "description": "Snackbar after copying a cross-service link", - "placeholders": { - "service": {} - } - }, - "libraryPlayback": "Playback", - "@libraryPlayback": { - "description": "Section header for playback settings in library settings" - }, - "libraryExternalPlayer": "External player", - "@libraryExternalPlayer": { - "description": "Setting option to use an external music player" - }, - "libraryExternalPlayerSubtitle": "Recommended for listening, best quality, gapless playback, EQ, and wider format support", - "@libraryExternalPlayerSubtitle": { - "description": "Subtitle for external player option" - }, - "libraryBuiltInPreviewPlayer": "Built-in preview player", - "@libraryBuiltInPreviewPlayer": { - "description": "Setting option to use the built-in preview player" - }, - "libraryBuiltInPreviewPlayerSubtitle": "Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening", - "@libraryBuiltInPreviewPlayerSubtitle": { - "description": "Subtitle for built-in preview player option" - }, - "libraryBuiltInPlayerInfo": "The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.", - "@libraryBuiltInPlayerInfo": { - "description": "Info note explaining the built-in player is for previews only" - }, - "nowPlayingTitle": "Now Playing", - "@nowPlayingTitle": { - "description": "Title for the now playing screen" - }, - "nowPlayingNothingPlaying": "Nothing is playing", - "@nowPlayingNothingPlaying": { - "description": "Empty state when no track is currently playing" - }, - "nowPlayingMinimize": "Minimize", - "@nowPlayingMinimize": { - "description": "Tooltip for minimizing the now playing screen" - }, - "nowPlayingUpNext": "Up next", - "@nowPlayingUpNext": { - "description": "Title for the playback queue sheet" - }, - "nowPlayingDetails": "Details", - "@nowPlayingDetails": { - "description": "Menu item and section title for track metadata details" - }, - "nowPlayingOpenInExternalPlayer": "Open in external player", - "@nowPlayingOpenInExternalPlayer": { - "description": "Menu item to open the current track in an external player" - }, - "nowPlayingTabPlayer": "Player", - "@nowPlayingTabPlayer": { - "description": "Tab label for the player view" - }, - "nowPlayingTabLyrics": "Lyrics", - "@nowPlayingTabLyrics": { - "description": "Tab label for the lyrics view" - }, - "nowPlayingNoLyrics": "No lyrics in this file", - "@nowPlayingNoLyrics": { - "description": "Empty state when the playing file has no embedded lyrics" - }, - "nowPlayingLibraryEmpty": "Your library is empty", - "@nowPlayingLibraryEmpty": { - "description": "Snackbar when shuffle library is requested but library has no tracks" - }, - "nowPlayingShuffleLibraryFailed": "Could not shuffle library: {error}", - "@nowPlayingShuffleLibraryFailed": { - "description": "Snackbar when shuffling the library fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "nowPlayingShuffleOn": "Shuffle on", - "@nowPlayingShuffleOn": { - "description": "Tooltip when shuffle mode is enabled" - }, - "nowPlayingPlayInOrder": "Play in order", - "@nowPlayingPlayInOrder": { - "description": "Tooltip when shuffle mode is disabled" - }, - "nowPlayingShuffleLibrary": "Shuffle library", - "@nowPlayingShuffleLibrary": { - "description": "Button label to shuffle and play the entire local library" - }, - "nowPlayingQueueEmpty": "Queue is empty", - "@nowPlayingQueueEmpty": { - "description": "Empty state when the playback queue has no items" - }, - "nowPlayingNoMetadata": "No metadata available", - "@nowPlayingNoMetadata": { - "description": "Empty state when track metadata cannot be loaded" - }, - "announcementUnableToOpenLink": "Unable to open link. Please try again.", - "@announcementUnableToOpenLink": { - "description": "Snackbar shown when an announcement CTA link cannot be opened" - }, - "trackConvertLosslessOutputWithCap": "Lossless output with {quality} cap", - "@trackConvertLosslessOutputWithCap": { - "description": "Hint shown when lossless conversion will cap bit depth or sample rate", - "placeholders": { - "quality": { - "type": "String" - } - } - }, - "trackConvertConfirmMessageLosslessCapped": "Convert from {sourceFormat} to {targetFormat} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.", - "@trackConvertConfirmMessageLosslessCapped": { - "description": "Confirmation dialog message for capped lossless conversion of a single file", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "selectionBatchConvertConfirmMessageLosslessCapped": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessageLosslessCapped": { - "description": "Confirmation dialog message for capped lossless batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "trackConvertActionLabelLossless": "{sourceFormat} → {targetFormat} ({quality})", - "@trackConvertActionLabelLossless": { - "description": "Convert button label for lossless conversion with quality cap", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", - "@trackConvertActionLabelLossy": { - "description": "Convert button label for lossy conversion", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "aboutPaxsenixSubtitle": "Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius", - "@aboutPaxsenixSubtitle": { - "description": "Subtitle for Paxsenix special thanks entry on the about page" - }, - "snackbarPlayingNext": "Playing next", - "@snackbarPlayingNext": { - "description": "Snackbar when a track is inserted as the next queue item" - }, - "snackbarAddedToQueueGeneric": "Added to queue", - "@snackbarAddedToQueueGeneric": { - "description": "Snackbar when a track is added to the playback queue without naming it" - }, - "selectionDeletePlaylistsCount": "Delete {count} {count, plural, =1{playlist} other{playlists}}", - "@selectionDeletePlaylistsCount": { - "description": "Button label for deleting multiple selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "actionShuffle": "Shuffle", - "@actionShuffle": { - "description": "Tooltip for shuffle playback action" - }, - "downloadPrimaryArtistOnlyOn": "Primary only: On", - "@downloadPrimaryArtistOnlyOn": { - "description": "Status label when primary-artist-only folder naming is enabled" - }, - "downloadPrimaryArtistOnlyOff": "Primary only: Off", - "@downloadPrimaryArtistOnlyOff": { - "description": "Status label when primary-artist-only folder naming is disabled" - }, - "downloadAlbumArtistMetadataPrimaryOnly": "Album Artist metadata: Primary only", - "@downloadAlbumArtistMetadataPrimaryOnly": { - "description": "Status label when album-artist folder filtering uses primary artist only" - }, - "downloadAlbumArtistMetadataFull": "Album Artist metadata: Full", - "@downloadAlbumArtistMetadataFull": { - "description": "Status label when album-artist folder filtering uses full metadata" - }, - "trackConvertOriginal": "Original", - "@trackConvertOriginal": { - "description": "Label for keeping original bit depth or sample rate during conversion" - }, - "trackConvertOriginalQuality": "Original quality", - "@trackConvertOriginalQuality": { - "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" - }, - "trackConvertLosslessSuffix": "Lossless", - "@trackConvertLosslessSuffix": { - "description": "Suffix used in converted lossless quality labels" - }, - "trackConvertDithering": "Dithering", - "@trackConvertDithering": { - "description": "Section label for lossless conversion dithering options" - }, - "trackConvertResampler": "Resampler", - "@trackConvertResampler": { - "description": "Section label for lossless conversion resampler options" - }, - "trackConvertDitherNone": "None", - "@trackConvertDitherNone": { - "description": "Lossless conversion dither option with no dithering applied" - }, - "trackConvertDitherTriangular": "TPDF", - "@trackConvertDitherTriangular": { - "description": "Lossless conversion triangular probability density function dither option" - }, - "trackConvertDitherTriangularHp": "Triangular HP", - "@trackConvertDitherTriangularHp": { - "description": "Lossless conversion high-pass triangular dither option" - }, - "trackConvertResamplerSwr": "SWR", - "@trackConvertResamplerSwr": { - "description": "Lossless conversion default FFmpeg swresample resampler option" - }, - "trackConvertResamplerSoxr": "SoXr", - "@trackConvertResamplerSoxr": { - "description": "Lossless conversion SoX resampler option" - }, - "updateSeeReleaseNotes": "See release notes for details.", - "@updateSeeReleaseNotes": { - "description": "Fallback changelog text when release notes cannot be parsed" - }, - "unknownTitle": "Unknown title", - "@unknownTitle": { - "description": "Fallback track title when metadata is missing" - }, - "trackPlayNext": "Play next", - "@trackPlayNext": { - "description": "Menu action to play a track as the next queue item" - }, - "trackAddToQueue": "Add to queue", - "@trackAddToQueue": { - "description": "Menu action to add a track to the playback queue" - }, - "snackbarExtensionInstalledEnable": "{extensionName} installed. Enable it in Settings > Extensions", - "@snackbarExtensionInstalledEnable": { - "description": "Snackbar after installing an extension from the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarExtensionUpdatedVersion": "{extensionName} updated to v{version}", - "@snackbarExtensionUpdatedVersion": { - "description": "Snackbar after updating an extension from the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - }, - "version": { - "type": "String" - } - } - }, - "snackbarFailedToInstallNamed": "Failed to install {extensionName}", - "@snackbarFailedToInstallNamed": { - "description": "Snackbar when extension install fails in the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarFailedToUpdateNamed": "Failed to update {extensionName}", - "@snackbarFailedToUpdateNamed": { - "description": "Snackbar when extension update fails in the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "releaseTypeEp": "EP", - "@releaseTypeEp": { - "description": "Badge label for EP releases" - }, - "releaseTypeSingle": "Single", - "@releaseTypeSingle": { - "description": "Badge label for single releases" - }, - "trackCoverOnline": "Online cover", - "@trackCoverOnline": { - "description": "Label shown when metadata autofill downloaded cover art from the internet" - }, - "regionCountryUS": "United States", - "@regionCountryUS": { - "description": "Country name for SongLink region picker" - }, - "regionCountryGB": "United Kingdom", - "@regionCountryGB": { - "description": "Country name for SongLink region picker" - }, - "regionCountryFR": "France", - "@regionCountryFR": { - "description": "Country name for SongLink region picker" - }, - "regionCountryDE": "Germany", - "@regionCountryDE": { - "description": "Country name for SongLink region picker" - }, - "regionCountryJP": "Japan", - "@regionCountryJP": { - "description": "Country name for SongLink region picker" - }, - "regionCountryKR": "South Korea", - "@regionCountryKR": { - "description": "Country name for SongLink region picker" - }, - "regionCountryIN": "India", - "@regionCountryIN": { - "description": "Country name for SongLink region picker" - }, - "regionCountryID": "Indonesia", - "@regionCountryID": { - "description": "Country name for SongLink region picker" - }, - "regionCountryBR": "Brazil", - "@regionCountryBR": { - "description": "Country name for SongLink region picker" - }, - "regionCountryMX": "Mexico", - "@regionCountryMX": { - "description": "Country name for SongLink region picker" - }, - "regionCountryAU": "Australia", - "@regionCountryAU": { - "description": "Country name for SongLink region picker" - }, - "regionCountryCA": "Canada", - "@regionCountryCA": { - "description": "Country name for SongLink region picker" - }, - "regionCountryXK": "Kosovo", - "@regionCountryXK": { - "description": "Country name for SongLink region picker" - }, - "extensionVerificationBrowserTitle": "Verification browser", - "@extensionVerificationBrowserTitle": { - "description": "Settings option title for extension verification browser preference" - }, - "extensionVerificationBrowserSubtitleExternal": "Open challenges in the default browser first", - "@extensionVerificationBrowserSubtitleExternal": { - "description": "Subtitle when external browser is preferred for extension verification" - }, - "extensionVerificationBrowserSubtitleInApp": "Open challenges in the in-app browser first", - "@extensionVerificationBrowserSubtitleInApp": { - "description": "Subtitle when in-app browser is preferred for extension verification" - }, - "extensionVerificationBrowserExternal": "External", - "@extensionVerificationBrowserExternal": { - "description": "Chip label for external browser verification mode" - }, - "extensionVerificationBrowserInApp": "In-app", - "@extensionVerificationBrowserInApp": { - "description": "Chip label for in-app browser verification mode" - }, - "extensionVerificationHelpTitleManual": "Open verification manually", - "@extensionVerificationHelpTitleManual": { - "description": "Dialog title when automatic browser launch for verification fails" - }, - "extensionVerificationHelpTitleWaiting": "Verification still waiting", - "@extensionVerificationHelpTitleWaiting": { - "description": "Dialog title when verification is taking longer than expected" - }, - "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.", - "@extensionVerificationHelpMessageManual": { - "description": "Dialog message when automatic browser launch for verification fails" - }, - "extensionVerificationHelpMessageWaiting": "If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.", - "@extensionVerificationHelpMessageWaiting": { - "description": "Dialog message when verification may need manual browser help" - }, - "extensionVerificationClose": "Close", - "@extensionVerificationClose": { - "description": "Button to dismiss the extension verification help dialog" - }, - "extensionVerificationCopyLink": "Copy link", - "@extensionVerificationCopyLink": { - "description": "Button to copy the extension verification URL" - }, - "extensionVerificationLinkCopied": "Verification link copied", - "@extensionVerificationLinkCopied": { - "description": "Snackbar after copying the extension verification URL" - }, - "extensionVerificationOpenBrowser": "Open browser", - "@extensionVerificationOpenBrowser": { - "description": "Button to open the extension verification URL in a browser" - } -} diff --git a/lib/l10n/arb/app_zh_TW.arb b/lib/l10n/arb/app_zh_TW.arb deleted file mode 100644 index f9e5a3be..00000000 --- a/lib/l10n/arb/app_zh_TW.arb +++ /dev/null @@ -1,5887 +0,0 @@ -{ - "@@locale": "zh_TW", - "@@last_modified": "2026-04-28", - "appName": "SpotiFLAC Mobile", - "@appName": { - "description": "App name - DO NOT TRANSLATE" - }, - "navHome": "Home", - "@navHome": { - "description": "Bottom navigation - Home tab" - }, - "navLibrary": "Library", - "@navLibrary": { - "description": "Bottom navigation - Library tab" - }, - "navSettings": "Settings", - "@navSettings": { - "description": "Bottom navigation - Settings tab" - }, - "navStore": "Repo", - "@navStore": { - "description": "Bottom navigation - Extension store tab" - }, - "homeTitle": "Home", - "@homeTitle": { - "description": "Home screen title" - }, - "homeSubtitle": "Paste a supported URL or search by name", - "@homeSubtitle": { - "description": "Subtitle shown below search box" - }, - "homeEmptyTitle": "No search providers yet", - "@homeEmptyTitle": { - "description": "Title shown on home when no providers are available yet" - }, - "homeEmptySubtitle": "Install an extension to continue.", - "@homeEmptySubtitle": { - "description": "Subtitle shown on home when no providers are available yet" - }, - "homeSupports": "Supports: Track, Album, Playlist, Artist URLs", - "@homeSupports": { - "description": "Info text about supported URL types" - }, - "homeRecent": "最新的", - "@homeRecent": { - "description": "Section header for recent searches" - }, - "historyFilterAll": "All", - "@historyFilterAll": { - "description": "Filter chip - show all items" - }, - "historyFilterAlbums": "Albums", - "@historyFilterAlbums": { - "description": "Filter chip - show albums only" - }, - "historyFilterSingles": "Singles", - "@historyFilterSingles": { - "description": "Filter chip - show singles only" - }, - "historySearchHint": "Search history...", - "@historySearchHint": { - "description": "Search bar placeholder in history" - }, - "settingsTitle": "Settings", - "@settingsTitle": { - "description": "Settings screen title" - }, - "settingsDownload": "Download", - "@settingsDownload": { - "description": "Settings section - download options" - }, - "settingsAppearance": "Appearance", - "@settingsAppearance": { - "description": "Settings section - visual customization" - }, - "settingsExtensions": "Extensions", - "@settingsExtensions": { - "description": "Settings section - extension management" - }, - "settingsAbout": "About", - "@settingsAbout": { - "description": "Settings section - app info" - }, - "downloadTitle": "Download", - "@downloadTitle": { - "description": "Download settings page title" - }, - "downloadAskQualitySubtitle": "Show quality picker for each download", - "@downloadAskQualitySubtitle": { - "description": "Subtitle for ask quality toggle" - }, - "downloadFilenameFormat": "Filename Format", - "@downloadFilenameFormat": { - "description": "Setting for output filename pattern" - }, - "downloadSingleFilenameFormat": "Single Filename Format", - "@downloadSingleFilenameFormat": { - "description": "Setting for output filename pattern for singles/EPs" - }, - "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", - "@downloadSingleFilenameFormatDescription": { - "description": "Subtitle description for single filename format setting" - }, - "downloadFolderOrganization": "Folder Organization", - "@downloadFolderOrganization": { - "description": "Title of the folder organization picker bottom sheet" - }, - "appearanceTitle": "Appearance", - "@appearanceTitle": { - "description": "Appearance settings page title" - }, - "appearanceThemeSystem": "System", - "@appearanceThemeSystem": { - "description": "Follow system theme" - }, - "appearanceThemeLight": "Light", - "@appearanceThemeLight": { - "description": "Light theme" - }, - "appearanceThemeDark": "Dark", - "@appearanceThemeDark": { - "description": "Dark theme" - }, - "appearanceDynamicColor": "Dynamic Color", - "@appearanceDynamicColor": { - "description": "Material You dynamic colors" - }, - "appearanceDynamicColorSubtitle": "Use colors from your wallpaper", - "@appearanceDynamicColorSubtitle": { - "description": "Subtitle for dynamic color" - }, - "appearanceHistoryView": "History View", - "@appearanceHistoryView": { - "description": "Layout style for history" - }, - "appearanceHistoryViewList": "List", - "@appearanceHistoryViewList": { - "description": "List layout option" - }, - "appearanceHistoryViewGrid": "Grid", - "@appearanceHistoryViewGrid": { - "description": "Grid layout option" - }, - "optionsPrimaryProvider": "Primary Provider", - "@optionsPrimaryProvider": { - "description": "Main search provider setting" - }, - "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", - "@optionsPrimaryProviderSubtitle": { - "description": "Subtitle for primary provider" - }, - "optionsUsingExtension": "Using extension: {extensionName}", - "@optionsUsingExtension": { - "description": "Shows active extension name", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "optionsDefaultSearchTab": "Default Search Tab", - "@optionsDefaultSearchTab": { - "description": "Title for the preferred default search tab setting" - }, - "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", - "@optionsDefaultSearchTabSubtitle": { - "description": "Subtitle for the preferred default search tab setting" - }, - "optionsAutoFallback": "Auto Fallback", - "@optionsAutoFallback": { - "description": "Auto-retry with other services" - }, - "optionsAutoFallbackSubtitle": "Try other services if download fails", - "@optionsAutoFallbackSubtitle": { - "description": "Subtitle for auto fallback" - }, - "optionsEmbedLyrics": "Embed Lyrics", - "@optionsEmbedLyrics": { - "description": "Embed lyrics in audio files" - }, - "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", - "@optionsEmbedLyricsSubtitle": { - "description": "Subtitle for embed lyrics" - }, - "optionsMaxQualityCover": "Max Quality Cover", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "Download highest resolution cover art", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, - "optionsReplayGain": "ReplayGain", - "@optionsReplayGain": { - "description": "Title for ReplayGain setting toggle" - }, - "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", - "@optionsReplayGainSubtitleOn": { - "description": "Subtitle when ReplayGain is enabled" - }, - "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", - "@optionsReplayGainSubtitleOff": { - "description": "Subtitle when ReplayGain is disabled" - }, - "trackReplayGain": "Rescan ReplayGain", - "@trackReplayGain": { - "description": "Three-dot menu option to scan loudness and write ReplayGain tags" - }, - "trackReplayGainScanning": "Analyzing loudness...", - "@trackReplayGainScanning": { - "description": "Snackbar/progress message while scanning ReplayGain for a single track" - }, - "trackReplayGainSuccess": "ReplayGain tags added", - "@trackReplayGainSuccess": { - "description": "Snackbar message after ReplayGain tags written for a single track" - }, - "trackReplayGainFailed": "Failed to add ReplayGain tags", - "@trackReplayGainFailed": { - "description": "Snackbar message when ReplayGain scan/write fails" - }, - "selectionReplayGainCount": "ReplayGain ({count})", - "@selectionReplayGainCount": { - "description": "Batch selection action button label for ReplayGain", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "replayGainBatchConfirmTitle": "Add ReplayGain", - "@replayGainBatchConfirmTitle": { - "description": "Title of the batch ReplayGain confirmation dialog" - }, - "replayGainBatchConfirmMessage": "Analyze loudness and write ReplayGain tags to {count} track(s)?", - "@replayGainBatchConfirmMessage": { - "description": "Message of the batch ReplayGain confirmation dialog", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "replayGainBatchAnalyzing": "Analyzing ReplayGain...", - "@replayGainBatchAnalyzing": { - "description": "Progress dialog title while batch scanning ReplayGain" - }, - "replayGainBatchSuccess": "ReplayGain added to {success} of {total} tracks", - "@replayGainBatchSuccess": { - "description": "Snackbar after batch ReplayGain completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "optionsArtistTagMode": "Artist Tag Mode", - "@optionsArtistTagMode": { - "description": "Setting title for how artist metadata is written into files" - }, - "optionsArtistTagModeDescription": "Choose how multiple artists are written into embedded tags.", - "@optionsArtistTagModeDescription": { - "description": "Bottom-sheet description for artist tag mode setting" - }, - "optionsArtistTagModeJoined": "Single joined value", - "@optionsArtistTagModeJoined": { - "description": "Artist tag mode option that joins multiple artists into one value" - }, - "optionsArtistTagModeJoinedSubtitle": "Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.", - "@optionsArtistTagModeJoinedSubtitle": { - "description": "Subtitle for joined artist tag mode" - }, - "optionsArtistTagModeSplitVorbis": "Split tags for FLAC/Opus", - "@optionsArtistTagModeSplitVorbis": { - "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" - }, - "optionsArtistTagModeSplitVorbisSubtitle": "Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.", - "@optionsArtistTagModeSplitVorbisSubtitle": { - "description": "Subtitle for split Vorbis artist tag mode" - }, - "optionsExtensionStore": "Extension Repo", - "@optionsExtensionStore": { - "description": "Show/hide store tab" - }, - "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", - "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" - }, - "optionsCheckUpdates": "Check for Updates", - "@optionsCheckUpdates": { - "description": "Auto update check toggle" - }, - "optionsCheckUpdatesSubtitle": "Notify when new version is available", - "@optionsCheckUpdatesSubtitle": { - "description": "Subtitle for update check" - }, - "optionsUpdateChannel": "Update Channel", - "@optionsUpdateChannel": { - "description": "Stable vs preview releases" - }, - "optionsUpdateChannelStable": "Stable releases only", - "@optionsUpdateChannelStable": { - "description": "Only stable updates" - }, - "optionsUpdateChannelPreview": "Get preview releases", - "@optionsUpdateChannelPreview": { - "description": "Include beta/preview updates" - }, - "optionsUpdateChannelWarning": "Preview may contain bugs or incomplete features", - "@optionsUpdateChannelWarning": { - "description": "Warning about preview channel" - }, - "optionsClearHistory": "Clear Download History", - "@optionsClearHistory": { - "description": "Delete all download history" - }, - "optionsClearHistorySubtitle": "Remove all downloaded tracks from history", - "@optionsClearHistorySubtitle": { - "description": "Subtitle for clear history" - }, - "optionsDetailedLogging": "Detailed Logging", - "@optionsDetailedLogging": { - "description": "Enable verbose logs for debugging" - }, - "optionsDetailedLoggingOn": "Detailed logs are being recorded", - "@optionsDetailedLoggingOn": { - "description": "Status when logging enabled" - }, - "optionsDetailedLoggingOff": "Enable for bug reports", - "@optionsDetailedLoggingOff": { - "description": "Status when logging disabled" - }, - "extensionsTitle": "Extensions", - "@extensionsTitle": { - "description": "Extensions page title" - }, - "extensionsDisabled": "Disabled", - "@extensionsDisabled": { - "description": "Extension status - inactive" - }, - "extensionsVersion": "Version {version}", - "@extensionsVersion": { - "description": "Extension version display", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "extensionsUninstall": "Uninstall", - "@extensionsUninstall": { - "description": "Uninstall extension button" - }, - "storeTitle": "Extension Repo", - "@storeTitle": { - "description": "Store screen title" - }, - "storeSearch": "Search extensions...", - "@storeSearch": { - "description": "Store search placeholder" - }, - "storeInstall": "Install", - "@storeInstall": { - "description": "Install extension button" - }, - "storeInstalled": "Installed", - "@storeInstalled": { - "description": "Already installed badge" - }, - "storeUpdate": "Update", - "@storeUpdate": { - "description": "Update available button" - }, - "aboutTitle": "About", - "@aboutTitle": { - "description": "About page title" - }, - "aboutContributors": "Contributors", - "@aboutContributors": { - "description": "Section for contributors" - }, - "aboutMobileDeveloper": "Mobile version developer", - "@aboutMobileDeveloper": { - "description": "Role description for mobile dev" - }, - "aboutOriginalCreator": "Creator of the original SpotiFLAC", - "@aboutOriginalCreator": { - "description": "Role description for original creator" - }, - "aboutLogoArtist": "The talented artist who created our beautiful app logo!", - "@aboutLogoArtist": { - "description": "Role description for logo artist" - }, - "aboutTranslators": "Translators", - "@aboutTranslators": { - "description": "Section for translators" - }, - "aboutSpecialThanks": "Special Thanks", - "@aboutSpecialThanks": { - "description": "Section for special thanks" - }, - "aboutLinks": "Links", - "@aboutLinks": { - "description": "Section for external links" - }, - "aboutMobileSource": "Mobile source code", - "@aboutMobileSource": { - "description": "Link to mobile GitHub repo" - }, - "aboutPCSource": "PC source code", - "@aboutPCSource": { - "description": "Link to PC GitHub repo" - }, - "aboutKeepAndroidOpen": "Keep Android Open", - "@aboutKeepAndroidOpen": { - "description": "Link to Keep Android Open campaign website" - }, - "aboutReportIssue": "Report an issue", - "@aboutReportIssue": { - "description": "Link to report bugs" - }, - "aboutReportIssueSubtitle": "Report any problems you encounter", - "@aboutReportIssueSubtitle": { - "description": "Subtitle for report issue" - }, - "aboutFeatureRequest": "Feature request", - "@aboutFeatureRequest": { - "description": "Link to suggest features" - }, - "aboutFeatureRequestSubtitle": "Suggest new features for the app", - "@aboutFeatureRequestSubtitle": { - "description": "Subtitle for feature request" - }, - "aboutTelegramChannel": "Telegram Channel", - "@aboutTelegramChannel": { - "description": "Link to Telegram channel" - }, - "aboutTelegramChannelSubtitle": "Announcements and updates", - "@aboutTelegramChannelSubtitle": { - "description": "Subtitle for Telegram channel" - }, - "aboutTelegramChat": "Telegram Community", - "@aboutTelegramChat": { - "description": "Link to Telegram chat group" - }, - "aboutTelegramChatSubtitle": "Chat with other users", - "@aboutTelegramChatSubtitle": { - "description": "Subtitle for Telegram chat" - }, - "aboutSocial": "Social", - "@aboutSocial": { - "description": "Section for social links" - }, - "aboutApp": "App", - "@aboutApp": { - "description": "Section for app info" - }, - "aboutVersion": "Version", - "@aboutVersion": { - "description": "Version info label" - }, - "aboutBinimumDesc": "The creator of QQDL & HiFi API. This project helped shape lossless download support.", - "@aboutBinimumDesc": { - "description": "Credit description for binimum" - }, - "aboutSachinsenalDesc": "The original HiFi project creator. A foundation for lossless-source integration.", - "@aboutSachinsenalDesc": { - "description": "Credit description for sachinsenal0x64" - }, - "aboutSjdonadoDesc": "Creator of I Don't Have Spotify (IDHS). The fallback link resolver that saves the day!", - "@aboutSjdonadoDesc": { - "description": "Credit description for sjdonado" - }, - "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", - "@aboutAppDescription": { - "description": "App description in header card" - }, - "artistAlbums": "Albums", - "@artistAlbums": { - "description": "Section header for artist albums" - }, - "artistSingles": "Singles & EPs", - "@artistSingles": { - "description": "Section header for singles/EPs" - }, - "artistCompilations": "Compilations", - "@artistCompilations": { - "description": "Section header for compilations" - }, - "artistPopular": "Popular", - "@artistPopular": { - "description": "Section header for popular/top tracks" - }, - "artistMonthlyListeners": "{count} monthly listeners", - "@artistMonthlyListeners": { - "description": "Monthly listener count display", - "placeholders": { - "count": { - "type": "String", - "description": "Formatted listener count" - } - } - }, - "trackMetadataService": "Service", - "@trackMetadataService": { - "description": "Metadata field - download service used" - }, - "trackMetadataPlay": "Play", - "@trackMetadataPlay": { - "description": "Action button - play track" - }, - "trackMetadataShare": "Share", - "@trackMetadataShare": { - "description": "Action button - share track" - }, - "trackMetadataDelete": "Delete", - "@trackMetadataDelete": { - "description": "Action button - delete track" - }, - "setupGrantPermission": "Grant Permission", - "@setupGrantPermission": { - "description": "Button to request permission" - }, - "setupSkip": "Skip for now", - "@setupSkip": { - "description": "Skip current step button" - }, - "setupStorageAccessRequired": "Storage Access Required", - "@setupStorageAccessRequired": { - "description": "Title when storage access needed" - }, - "setupStorageAccessMessageAndroid11": "Android 11+ requires \"All files access\" permission to save files to your chosen download folder.", - "@setupStorageAccessMessageAndroid11": { - "description": "Android 11+ specific explanation" - }, - "setupOpenSettings": "Open Settings", - "@setupOpenSettings": { - "description": "Button to open system settings" - }, - "setupPermissionDeniedMessage": "Permission denied. Please grant all permissions to continue.", - "@setupPermissionDeniedMessage": { - "description": "Error when permission denied" - }, - "setupPermissionRequired": "{permissionType} Permission Required", - "@setupPermissionRequired": { - "description": "Generic permission required title", - "placeholders": { - "permissionType": { - "type": "String", - "description": "Type of permission (Storage/Notification)" - } - } - }, - "setupPermissionRequiredMessage": "{permissionType} permission is required for the best experience. You can change this later in Settings.", - "@setupPermissionRequiredMessage": { - "description": "Generic permission required message", - "placeholders": { - "permissionType": { - "type": "String" - } - } - }, - "setupUseDefaultFolder": "Use Default Folder?", - "@setupUseDefaultFolder": { - "description": "Dialog title for default folder" - }, - "setupNoFolderSelected": "No folder selected. Would you like to use the default Music folder?", - "@setupNoFolderSelected": { - "description": "Prompt when no folder selected" - }, - "setupUseDefault": "Use Default", - "@setupUseDefault": { - "description": "Button to use default folder" - }, - "setupDownloadLocationTitle": "Download Location", - "@setupDownloadLocationTitle": { - "description": "Download location dialog title" - }, - "setupDownloadLocationIosMessage": "On iOS, downloads are saved to the app's Documents folder. You can access them via the Files app.", - "@setupDownloadLocationIosMessage": { - "description": "iOS-specific folder info" - }, - "setupAppDocumentsFolder": "App Documents Folder", - "@setupAppDocumentsFolder": { - "description": "iOS documents folder option" - }, - "setupAppDocumentsFolderSubtitle": "Recommended - accessible via Files app", - "@setupAppDocumentsFolderSubtitle": { - "description": "Subtitle for documents folder" - }, - "setupChooseFromFiles": "Choose from Files", - "@setupChooseFromFiles": { - "description": "iOS file picker option" - }, - "setupChooseFromFilesSubtitle": "Select iCloud or other location", - "@setupChooseFromFilesSubtitle": { - "description": "Subtitle for file picker" - }, - "setupIosEmptyFolderWarning": "iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.", - "@setupIosEmptyFolderWarning": { - "description": "iOS folder selection warning" - }, - "setupIcloudNotSupported": "iCloud Drive is not supported. Please use the app Documents folder.", - "@setupIcloudNotSupported": { - "description": "Error when user selects iCloud Drive on iOS" - }, - "setupDownloadInFlac": "Download Spotify tracks in FLAC", - "@setupDownloadInFlac": { - "description": "App tagline in setup" - }, - "setupStorageGranted": "Storage Permission Granted!", - "@setupStorageGranted": { - "description": "Success message for storage permission" - }, - "setupStorageRequired": "Storage Permission Required", - "@setupStorageRequired": { - "description": "Title when storage permission needed" - }, - "setupStorageDescription": "SpotiFLAC needs storage permission to save your downloaded music files.", - "@setupStorageDescription": { - "description": "Explanation for storage permission" - }, - "setupNotificationGranted": "Notification Permission Granted!", - "@setupNotificationGranted": { - "description": "Success message for notification permission" - }, - "setupNotificationEnable": "Enable Notifications", - "@setupNotificationEnable": { - "description": "Button to enable notifications" - }, - "setupFolderChoose": "Choose Download Folder", - "@setupFolderChoose": { - "description": "Button to choose folder" - }, - "setupFolderDescription": "Select a folder where your downloaded music will be saved.", - "@setupFolderDescription": { - "description": "Explanation for folder selection" - }, - "setupSelectFolder": "Select Folder", - "@setupSelectFolder": { - "description": "Button to select folder" - }, - "setupEnableNotifications": "Enable Notifications", - "@setupEnableNotifications": { - "description": "Button to enable notifications" - }, - "setupNotificationBackgroundDescription": "Get notified about download progress and completion. This helps you track downloads when the app is in background.", - "@setupNotificationBackgroundDescription": { - "description": "Detailed notification explanation" - }, - "setupSkipForNow": "Skip for now", - "@setupSkipForNow": { - "description": "Skip button text" - }, - "setupNext": "Next", - "@setupNext": { - "description": "Next button text" - }, - "setupGetStarted": "Get Started", - "@setupGetStarted": { - "description": "Final setup button" - }, - "setupAllowAccessToManageFiles": "Please enable \"Allow access to manage all files\" in the next screen.", - "@setupAllowAccessToManageFiles": { - "description": "Instruction for file access permission" - }, - "setupLanguageTitle": "Choose Language", - "@setupLanguageTitle": { - "description": "Title for the language selection step in setup" - }, - "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", - "@setupLanguageDescription": { - "description": "Description for the language selection step in setup" - }, - "setupLanguageSystemDefault": "System Default", - "@setupLanguageSystemDefault": { - "description": "Option to use the system language" - }, - "dialogCancel": "Cancel", - "@dialogCancel": { - "description": "Dialog button - cancel action" - }, - "dialogSave": "Save", - "@dialogSave": { - "description": "Dialog button - save changes" - }, - "dialogDelete": "Delete", - "@dialogDelete": { - "description": "Dialog button - delete item" - }, - "dialogRetry": "Retry", - "@dialogRetry": { - "description": "Dialog button - retry action" - }, - "dialogClear": "Clear", - "@dialogClear": { - "description": "Dialog button - clear items" - }, - "dialogDone": "Done", - "@dialogDone": { - "description": "Dialog button - action completed" - }, - "dialogImport": "Import", - "@dialogImport": { - "description": "Dialog button - import data" - }, - "dialogDownload": "Download", - "@dialogDownload": { - "description": "Confirm button in Download All dialog" - }, - "previewPlay": "Play preview", - "@previewPlay": { - "description": "Tooltip for the button that plays a short track preview snippet" - }, - "previewStop": "Stop preview", - "@previewStop": { - "description": "Tooltip for the button that stops the playing track preview snippet" - }, - "previewUnavailable": "Preview unavailable", - "@previewUnavailable": { - "description": "Snackbar shown when a track preview snippet cannot be played" - }, - "dialogDiscard": "Discard", - "@dialogDiscard": { - "description": "Dialog button - discard changes" - }, - "dialogRemove": "Remove", - "@dialogRemove": { - "description": "Dialog button - remove item" - }, - "dialogUninstall": "Uninstall", - "@dialogUninstall": { - "description": "Dialog button - uninstall extension" - }, - "dialogDiscardChanges": "Discard Changes?", - "@dialogDiscardChanges": { - "description": "Dialog title - unsaved changes warning" - }, - "dialogUnsavedChanges": "You have unsaved changes. Do you want to discard them?", - "@dialogUnsavedChanges": { - "description": "Dialog message - unsaved changes" - }, - "dialogClearAll": "Clear All", - "@dialogClearAll": { - "description": "Dialog title - clear all items" - }, - "dialogRemoveExtension": "Remove Extension", - "@dialogRemoveExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogRemoveExtensionMessage": "Are you sure you want to remove this extension? This cannot be undone.", - "@dialogRemoveExtensionMessage": { - "description": "Dialog message - uninstall confirmation" - }, - "dialogUninstallExtension": "Uninstall Extension?", - "@dialogUninstallExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogUninstallExtensionMessage": "Are you sure you want to remove {extensionName}?", - "@dialogUninstallExtensionMessage": { - "description": "Dialog message - uninstall specific extension", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "dialogClearHistoryTitle": "Clear History", - "@dialogClearHistoryTitle": { - "description": "Dialog title - clear download history" - }, - "dialogClearHistoryMessage": "Are you sure you want to clear all download history? This cannot be undone.", - "@dialogClearHistoryMessage": { - "description": "Dialog message - clear history confirmation" - }, - "dialogDeleteSelectedTitle": "Delete Selected", - "@dialogDeleteSelectedTitle": { - "description": "Dialog title - delete selected items" - }, - "dialogDeleteSelectedMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from history?\n\nThis will also delete the files from storage.", - "@dialogDeleteSelectedMessage": { - "description": "Dialog message - delete selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogImportPlaylistTitle": "Import Playlist", - "@dialogImportPlaylistTitle": { - "description": "Dialog title - import CSV playlist" - }, - "dialogImportPlaylistMessage": "Found {count} tracks in CSV. Add them to download queue?", - "csvImportTracks": "{count} tracks from CSV", - "@csvImportTracks": { - "description": "Label shown in quality picker for CSV import", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@dialogImportPlaylistMessage": { - "description": "Dialog message - import playlist confirmation", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedToQueue": "Added \"{trackName}\" to queue", - "@snackbarAddedToQueue": { - "description": "Snackbar - track added to download queue", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAddedTracksToQueue": "Added {count} tracks to queue", - "@snackbarAddedTracksToQueue": { - "description": "Snackbar - multiple tracks added to queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAlreadyDownloaded": "\"{trackName}\" already downloaded", - "@snackbarAlreadyDownloaded": { - "description": "Snackbar - track already exists", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAlreadyInLibrary": "\"{trackName}\" already exists in your library", - "@snackbarAlreadyInLibrary": { - "description": "Snackbar - track already exists in local library", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarHistoryCleared": "History cleared", - "@snackbarHistoryCleared": { - "description": "Snackbar - history deleted" - }, - "snackbarDeletedTracks": "Deleted {count} {count, plural, =1{track} other{tracks}}", - "@snackbarDeletedTracks": { - "description": "Snackbar - tracks deleted", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarCannotOpenFile": "Cannot open file: {error}", - "@snackbarCannotOpenFile": { - "description": "Snackbar - file open error", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "snackbarViewQueue": "View Queue", - "@snackbarViewQueue": { - "description": "Snackbar action - view download queue" - }, - "snackbarUrlCopied": "{platform} URL copied to clipboard", - "@snackbarUrlCopied": { - "description": "Snackbar - URL copied", - "placeholders": { - "platform": { - "type": "String", - "description": "Platform name (Spotify/Deezer)" - } - } - }, - "snackbarFileNotFound": "File not found", - "@snackbarFileNotFound": { - "description": "Snackbar - file doesn't exist" - }, - "snackbarSelectExtFile": "Please select a .spotiflac-ext file", - "@snackbarSelectExtFile": { - "description": "Snackbar - wrong file type selected" - }, - "snackbarProviderPrioritySaved": "Provider priority saved", - "@snackbarProviderPrioritySaved": { - "description": "Snackbar - provider order saved" - }, - "snackbarMetadataProviderSaved": "Metadata provider priority saved", - "@snackbarMetadataProviderSaved": { - "description": "Snackbar - metadata provider order saved" - }, - "snackbarExtensionInstalled": "{extensionName} installed.", - "@snackbarExtensionInstalled": { - "description": "Snackbar - extension installed successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarExtensionUpdated": "{extensionName} updated.", - "@snackbarExtensionUpdated": { - "description": "Snackbar - extension updated successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarFailedToInstall": "Failed to install extension", - "@snackbarFailedToInstall": { - "description": "Snackbar - extension install error" - }, - "snackbarFailedToUpdate": "Failed to update extension", - "@snackbarFailedToUpdate": { - "description": "Snackbar - extension update error" - }, - "errorRateLimited": "Rate Limited", - "@errorRateLimited": { - "description": "Error title - too many requests" - }, - "errorRateLimitedMessage": "Too many requests. Please wait a moment before searching again.", - "@errorRateLimitedMessage": { - "description": "Error message - rate limit explanation" - }, - "errorNoTracksFound": "No tracks found", - "@errorNoTracksFound": { - "description": "Error - search returned no results" - }, - "searchEmptyResultSubtitle": "Try another keyword", - "@searchEmptyResultSubtitle": { - "description": "Subtitle shown under the empty search result state on the home screen" - }, - "errorUrlNotRecognized": "Link not recognized", - "@errorUrlNotRecognized": { - "description": "Error title - URL not handled by any extension or service" - }, - "errorUrlNotRecognizedMessage": "This link is not supported. Make sure the URL is correct and a compatible extension is installed.", - "@errorUrlNotRecognizedMessage": { - "description": "Error message - URL not recognized explanation" - }, - "errorUrlFetchFailed": "Failed to load content from this link. Please try again.", - "@errorUrlFetchFailed": { - "description": "Error message - generic URL fetch failure" - }, - "errorMissingExtensionSource": "Cannot load {item}: missing extension source", - "@errorMissingExtensionSource": { - "description": "Error - extension source not available", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "actionPause": "Pause", - "@actionPause": { - "description": "Action button - pause download" - }, - "actionResume": "Resume", - "@actionResume": { - "description": "Action button - resume download" - }, - "actionCancel": "Cancel", - "@actionCancel": { - "description": "Action button - cancel operation" - }, - "actionSelectAll": "Select All", - "@actionSelectAll": { - "description": "Action button - select all items" - }, - "actionDeselect": "Deselect", - "@actionDeselect": { - "description": "Action button - deselect all" - }, - "selectionSelected": "{count} selected", - "@selectionSelected": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionAllSelected": "All tracks selected", - "@selectionAllSelected": { - "description": "Status - all items selected" - }, - "selectionSelectToDelete": "Select tracks to delete", - "@selectionSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "progressFetchingMetadata": "Fetching metadata... {current}/{total}", - "@progressFetchingMetadata": { - "description": "Progress indicator - loading track info", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "progressReadingCsv": "Reading CSV...", - "@progressReadingCsv": { - "description": "Progress indicator - parsing CSV file" - }, - "searchSongs": "Songs", - "@searchSongs": { - "description": "Search result category - songs" - }, - "searchArtists": "Artists", - "@searchArtists": { - "description": "Search result category - artists" - }, - "searchAlbums": "Albums", - "@searchAlbums": { - "description": "Search result category - albums" - }, - "searchPlaylists": "Playlists", - "@searchPlaylists": { - "description": "Search result category - playlists" - }, - "searchSortTitle": "Sort Results", - "@searchSortTitle": { - "description": "Bottom sheet title for search sort options" - }, - "searchSortDefault": "Default", - "@searchSortDefault": { - "description": "Sort option - default API order" - }, - "searchSortTitleAZ": "Title (A-Z)", - "@searchSortTitleAZ": { - "description": "Sort option - title ascending" - }, - "searchSortTitleZA": "Title (Z-A)", - "@searchSortTitleZA": { - "description": "Sort option - title descending" - }, - "searchSortArtistAZ": "Artist (A-Z)", - "@searchSortArtistAZ": { - "description": "Sort option - artist ascending" - }, - "searchSortArtistZA": "Artist (Z-A)", - "@searchSortArtistZA": { - "description": "Sort option - artist descending" - }, - "searchSortDurationShort": "Duration (Shortest)", - "@searchSortDurationShort": { - "description": "Sort option - shortest duration first" - }, - "searchSortDurationLong": "Duration (Longest)", - "@searchSortDurationLong": { - "description": "Sort option - longest duration first" - }, - "searchSortDateOldest": "Release Date (Oldest)", - "@searchSortDateOldest": { - "description": "Sort option - oldest release first" - }, - "searchSortDateNewest": "Release Date (Newest)", - "@searchSortDateNewest": { - "description": "Sort option - newest release first" - }, - "tooltipPlay": "Play", - "@tooltipPlay": { - "description": "Tooltip - play button" - }, - "filenameFormat": "Filename Format", - "@filenameFormat": { - "description": "Setting title - filename pattern" - }, - "filenameShowAdvancedTags": "Show advanced tags", - "@filenameShowAdvancedTags": { - "description": "Toggle label for showing advanced filename tags" - }, - "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", - "@filenameShowAdvancedTagsDescription": { - "description": "Description for advanced filename tag toggle" - }, - "folderOrganizationNone": "No organization", - "@folderOrganizationNone": { - "description": "Folder option - flat structure" - }, - "folderOrganizationByPlaylist": "By Playlist", - "@folderOrganizationByPlaylist": { - "description": "Folder option - playlist folders" - }, - "folderOrganizationByPlaylistSubtitle": "Separate folder for each playlist", - "@folderOrganizationByPlaylistSubtitle": { - "description": "Subtitle for playlist folder option" - }, - "folderOrganizationByArtist": "By Artist", - "@folderOrganizationByArtist": { - "description": "Folder option - artist folders" - }, - "folderOrganizationByAlbum": "By Album", - "@folderOrganizationByAlbum": { - "description": "Folder option - album folders" - }, - "folderOrganizationByArtistAlbum": "Artist/Album", - "@folderOrganizationByArtistAlbum": { - "description": "Folder option - nested folders" - }, - "folderOrganizationDescription": "Organize downloaded files into folders", - "@folderOrganizationDescription": { - "description": "Folder organization sheet description" - }, - "folderOrganizationNoneSubtitle": "All files in download folder", - "@folderOrganizationNoneSubtitle": { - "description": "Subtitle for no organization option" - }, - "folderOrganizationByArtistSubtitle": "Separate folder for each artist", - "@folderOrganizationByArtistSubtitle": { - "description": "Subtitle for artist folder option" - }, - "folderOrganizationByAlbumSubtitle": "Separate folder for each album", - "@folderOrganizationByAlbumSubtitle": { - "description": "Subtitle for album folder option" - }, - "folderOrganizationByArtistAlbumSubtitle": "Nested folders for artist and album", - "@folderOrganizationByArtistAlbumSubtitle": { - "description": "Subtitle for nested folder option" - }, - "updateAvailable": "Update Available", - "@updateAvailable": { - "description": "Update dialog title" - }, - "updateLater": "Later", - "@updateLater": { - "description": "Update button - dismiss" - }, - "updateStartingDownload": "Starting download...", - "@updateStartingDownload": { - "description": "Update status - initializing" - }, - "updateDownloadFailed": "Download failed", - "@updateDownloadFailed": { - "description": "Update error title" - }, - "updateFailedMessage": "Failed to download update", - "@updateFailedMessage": { - "description": "Update error message" - }, - "updateNewVersionReady": "A new version is ready", - "@updateNewVersionReady": { - "description": "Update subtitle" - }, - "updateCurrent": "Current", - "@updateCurrent": { - "description": "Label for current version" - }, - "updateNew": "New", - "@updateNew": { - "description": "Label for new version" - }, - "updateDownloading": "Downloading...", - "@updateDownloading": { - "description": "Update status - downloading" - }, - "updateWhatsNew": "What's New", - "@updateWhatsNew": { - "description": "Changelog section title" - }, - "updateDownloadInstall": "Download & Install", - "@updateDownloadInstall": { - "description": "Update button - download and install" - }, - "updateDontRemind": "Don't remind", - "@updateDontRemind": { - "description": "Update button - skip this version" - }, - "providerPriorityTitle": "Provider Priority", - "@providerPriorityTitle": { - "description": "Provider priority page title" - }, - "providerPriorityDescription": "Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.", - "@providerPriorityDescription": { - "description": "Provider priority page description" - }, - "providerPriorityInfo": "If a track is not available on the first provider, the app will automatically try the next one.", - "@providerPriorityInfo": { - "description": "Info tip about fallback behavior" - }, - "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", - "@providerPriorityFallbackExtensionsDescription": { - "description": "Section description for extension fallback selection" - }, - "providerPriorityFallbackExtensionsHint": "Only enabled extensions with download-provider capability are listed here.", - "@providerPriorityFallbackExtensionsHint": { - "description": "Hint below the extension fallback selection list" - }, - "providerExtension": "Extension", - "@providerExtension": { - "description": "Label for extension-provided providers" - }, - "metadataProviderPriorityTitle": "Metadata Priority", - "@metadataProviderPriorityTitle": { - "description": "Metadata priority page title" - }, - "metadataProviderPriorityDescription": "Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.", - "@metadataProviderPriorityDescription": { - "description": "Metadata priority page description" - }, - "metadataProviderPriorityInfo": "Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.", - "@metadataProviderPriorityInfo": { - "description": "Info tip about rate limits" - }, - "logTitle": "Logs", - "@logTitle": { - "description": "Logs screen title" - }, - "logCopied": "Logs copied to clipboard", - "@logCopied": { - "description": "Snackbar - logs copied" - }, - "logSearchHint": "Search logs...", - "@logSearchHint": { - "description": "Log search placeholder" - }, - "logFilterLevel": "Level", - "@logFilterLevel": { - "description": "Filter by log level" - }, - "logFilterSection": "Filter", - "@logFilterSection": { - "description": "Filter section title" - }, - "logShareLogs": "Share logs", - "@logShareLogs": { - "description": "Share button tooltip" - }, - "logClearLogs": "Clear logs", - "@logClearLogs": { - "description": "Clear button tooltip" - }, - "logClearLogsTitle": "Clear Logs", - "@logClearLogsTitle": { - "description": "Clear logs dialog title" - }, - "logClearLogsMessage": "Are you sure you want to clear all logs?", - "@logClearLogsMessage": { - "description": "Clear logs confirmation message" - }, - "logFilterBySeverity": "Filter logs by severity", - "@logFilterBySeverity": { - "description": "Filter dialog title" - }, - "logNoLogsYet": "No logs yet", - "@logNoLogsYet": { - "description": "Empty state title" - }, - "logNoLogsYetSubtitle": "Logs will appear here as you use the app", - "@logNoLogsYetSubtitle": { - "description": "Empty state subtitle" - }, - "logEntriesFiltered": "Entries ({count} filtered)", - "@logEntriesFiltered": { - "description": "Log count with filter active", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "logEntries": "Entries ({count})", - "@logEntries": { - "description": "Total log count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "channelStable": "Stable", - "@channelStable": { - "description": "Update channel - stable releases" - }, - "channelPreview": "Preview", - "@channelPreview": { - "description": "Update channel - beta/preview releases" - }, - "sectionSearchSource": "Search Source", - "@sectionSearchSource": { - "description": "Settings section header" - }, - "sectionDownload": "Download", - "@sectionDownload": { - "description": "Settings section header" - }, - "sectionPerformance": "Performance", - "@sectionPerformance": { - "description": "Settings section header" - }, - "sectionApp": "App", - "@sectionApp": { - "description": "Settings section header" - }, - "sectionData": "Data", - "@sectionData": { - "description": "Settings section header" - }, - "sectionDebug": "Debug", - "@sectionDebug": { - "description": "Settings section header" - }, - "sectionService": "Service", - "@sectionService": { - "description": "Settings section header" - }, - "sectionAudioQuality": "Audio Quality", - "@sectionAudioQuality": { - "description": "Settings section header" - }, - "sectionFileSettings": "File Settings", - "@sectionFileSettings": { - "description": "Settings section header" - }, - "sectionLyrics": "Lyrics", - "@sectionLyrics": { - "description": "Settings section header" - }, - "lyricsMode": "Lyrics Mode", - "@lyricsMode": { - "description": "Setting - how to save lyrics" - }, - "lyricsModeDescription": "Choose how lyrics are saved with your downloads", - "@lyricsModeDescription": { - "description": "Lyrics mode picker description" - }, - "lyricsModeEmbed": "Embed in file", - "@lyricsModeEmbed": { - "description": "Lyrics mode option - embed in audio file" - }, - "lyricsModeEmbedSubtitle": "Lyrics stored inside FLAC metadata", - "@lyricsModeEmbedSubtitle": { - "description": "Subtitle for embed option" - }, - "lyricsModeExternal": "External .lrc file", - "@lyricsModeExternal": { - "description": "Lyrics mode option - separate LRC file" - }, - "lyricsModeExternalSubtitle": "Separate .lrc file for players like Samsung Music", - "@lyricsModeExternalSubtitle": { - "description": "Subtitle for external option" - }, - "lyricsModeBoth": "Both", - "@lyricsModeBoth": { - "description": "Lyrics mode option - embed and external" - }, - "lyricsModeBothSubtitle": "Embed and save .lrc file", - "@lyricsModeBothSubtitle": { - "description": "Subtitle for both option" - }, - "sectionColor": "Color", - "@sectionColor": { - "description": "Settings section header" - }, - "sectionTheme": "Theme", - "@sectionTheme": { - "description": "Settings section header" - }, - "sectionLayout": "Layout", - "@sectionLayout": { - "description": "Settings section header" - }, - "sectionLanguage": "Language", - "@sectionLanguage": { - "description": "Settings section header for language" - }, - "appearanceLanguage": "App Language", - "@appearanceLanguage": { - "description": "Language setting title" - }, - "settingsAppearanceSubtitle": "Theme, colors, display", - "@settingsAppearanceSubtitle": { - "description": "Appearance settings description" - }, - "settingsDownloadSubtitle": "Service, quality, fallback", - "@settingsDownloadSubtitle": { - "description": "Download settings description" - }, - "settingsExtensionsSubtitle": "Manage download providers", - "@settingsExtensionsSubtitle": { - "description": "Extensions settings description" - }, - "settingsLogsSubtitle": "View app logs for debugging", - "@settingsLogsSubtitle": { - "description": "Logs settings description" - }, - "loadingSharedLink": "Loading shared link...", - "@loadingSharedLink": { - "description": "Status when opening shared URL" - }, - "pressBackAgainToExit": "Press back again to exit", - "@pressBackAgainToExit": { - "description": "Exit confirmation message" - }, - "downloadAllCount": "Download All ({count})", - "@downloadAllCount": { - "description": "Download all button with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tracksCount": "{count, plural, =1{1 track} other{{count} tracks}}", - "@tracksCount": { - "description": "Track count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackCopyFilePath": "Copy file path", - "@trackCopyFilePath": { - "description": "Action - copy file path" - }, - "trackRemoveFromDevice": "Remove from device", - "@trackRemoveFromDevice": { - "description": "Action - delete downloaded file" - }, - "trackLoadLyrics": "Load Lyrics", - "@trackLoadLyrics": { - "description": "Action - fetch lyrics" - }, - "trackMetadata": "Metadata", - "@trackMetadata": { - "description": "Tab title - track metadata" - }, - "trackFileInfo": "File Info", - "@trackFileInfo": { - "description": "Tab title - file information" - }, - "trackLyrics": "Lyrics", - "@trackLyrics": { - "description": "Tab title - lyrics" - }, - "trackFileNotFound": "File not found", - "@trackFileNotFound": { - "description": "Error - file doesn't exist" - }, - "trackOpenInDeezer": "Open in Deezer", - "@trackOpenInDeezer": { - "description": "Action - open track in Deezer app" - }, - "trackOpenInSpotify": "Open in Spotify", - "@trackOpenInSpotify": { - "description": "Action - open track in Spotify app" - }, - "trackTrackName": "Track name", - "@trackTrackName": { - "description": "Metadata label - track title" - }, - "trackArtist": "Artist", - "@trackArtist": { - "description": "Metadata label - artist name" - }, - "trackAlbumArtist": "Album artist", - "@trackAlbumArtist": { - "description": "Metadata label - album artist" - }, - "trackAlbum": "Album", - "@trackAlbum": { - "description": "Metadata label - album name" - }, - "trackTrackNumber": "Track number", - "@trackTrackNumber": { - "description": "Metadata label - track number" - }, - "trackDiscNumber": "Disc number", - "@trackDiscNumber": { - "description": "Metadata label - disc number" - }, - "trackDuration": "Duration", - "@trackDuration": { - "description": "Metadata label - track length" - }, - "trackAudioQuality": "Audio quality", - "@trackAudioQuality": { - "description": "Metadata label - audio quality" - }, - "trackReleaseDate": "Release date", - "@trackReleaseDate": { - "description": "Metadata label - release date" - }, - "trackGenre": "Genre", - "@trackGenre": { - "description": "Metadata label - music genre" - }, - "trackLabel": "Label", - "@trackLabel": { - "description": "Metadata label - record label" - }, - "trackCopyright": "Copyright", - "@trackCopyright": { - "description": "Metadata label - copyright information" - }, - "trackDownloaded": "Downloaded", - "@trackDownloaded": { - "description": "Metadata label - download date" - }, - "trackCopyLyrics": "Copy lyrics", - "@trackCopyLyrics": { - "description": "Action - copy lyrics to clipboard" - }, - "trackLyricsSource": "Source: {source}", - "@trackLyricsSource": { - "description": "Label showing the lyrics source/provider", - "placeholders": { - "source": { - "type": "String" - } - } - }, - "trackLyricsNotAvailable": "Lyrics not available for this track", - "@trackLyricsNotAvailable": { - "description": "Message when lyrics not found" - }, - "trackLyricsNotInFile": "No lyrics found in this file", - "@trackLyricsNotInFile": { - "description": "Message when no embedded lyrics in audio file" - }, - "trackFetchOnlineLyrics": "Fetch from Online", - "@trackFetchOnlineLyrics": { - "description": "Action - fetch lyrics from online providers" - }, - "trackLyricsTimeout": "Request timed out. Try again later.", - "@trackLyricsTimeout": { - "description": "Message when lyrics request times out" - }, - "trackLyricsLoadFailed": "Failed to load lyrics", - "@trackLyricsLoadFailed": { - "description": "Message when lyrics loading fails" - }, - "trackEmbedLyrics": "Embed Lyrics", - "@trackEmbedLyrics": { - "description": "Action - embed lyrics into audio file" - }, - "trackLyricsEmbedded": "Lyrics embedded successfully", - "@trackLyricsEmbedded": { - "description": "Snackbar - lyrics saved to file" - }, - "trackInstrumental": "Instrumental track", - "@trackInstrumental": { - "description": "Message when track is instrumental (no lyrics)" - }, - "trackCopiedToClipboard": "Copied to clipboard", - "@trackCopiedToClipboard": { - "description": "Snackbar - content copied" - }, - "trackDeleteConfirmTitle": "Remove from device?", - "@trackDeleteConfirmTitle": { - "description": "Delete confirmation title" - }, - "trackDeleteConfirmMessage": "This will permanently delete the downloaded file and remove it from your history.", - "@trackDeleteConfirmMessage": { - "description": "Delete confirmation message" - }, - "dateToday": "Today", - "@dateToday": { - "description": "Relative date - today" - }, - "dateYesterday": "Yesterday", - "@dateYesterday": { - "description": "Relative date - yesterday" - }, - "dateDaysAgo": "{count} days ago", - "@dateDaysAgo": { - "description": "Relative date - days ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateWeeksAgo": "{count} weeks ago", - "@dateWeeksAgo": { - "description": "Relative date - weeks ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateMonthsAgo": "{count} months ago", - "@dateMonthsAgo": { - "description": "Relative date - months ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "storeFilterAll": "All", - "@storeFilterAll": { - "description": "Store filter - all extensions" - }, - "storeFilterMetadata": "Metadata", - "@storeFilterMetadata": { - "description": "Store filter - metadata providers" - }, - "storeFilterDownload": "Download", - "@storeFilterDownload": { - "description": "Store filter - download providers" - }, - "storeFilterUtility": "Utility", - "@storeFilterUtility": { - "description": "Store filter - utility extensions" - }, - "storeFilterLyrics": "Lyrics", - "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" - }, - "storeFilterIntegration": "Integration", - "@storeFilterIntegration": { - "description": "Store filter - integrations" - }, - "storeClearFilters": "Clear filters", - "@storeClearFilters": { - "description": "Button to clear all filters" - }, - "storeAddRepoTitle": "Add Extension Repository", - "@storeAddRepoTitle": { - "description": "Store setup screen - heading when no repo is configured" - }, - "storeAddRepoDescription": "Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.", - "@storeAddRepoDescription": { - "description": "Store setup screen - explanatory text" - }, - "storeRepoUrlLabel": "Repository URL", - "@storeRepoUrlLabel": { - "description": "Label for the repository URL input field" - }, - "storeRepoUrlHint": "https://github.com/user/repo", - "@storeRepoUrlHint": { - "description": "Hint/placeholder for the repository URL input field" - }, - "storeAddRepoButton": "Add Repository", - "@storeAddRepoButton": { - "description": "Button to submit a new repository URL" - }, - "storeChangeRepoTooltip": "Change repository", - "@storeChangeRepoTooltip": { - "description": "Tooltip for the change-repository icon button in the app bar" - }, - "storeRepoDialogTitle": "Extension Repository", - "@storeRepoDialogTitle": { - "description": "Title of the change/remove repository dialog" - }, - "storeRepoDialogCurrent": "Current repository:", - "@storeRepoDialogCurrent": { - "description": "Label shown above the current repository URL in the dialog" - }, - "storeNewRepoUrlLabel": "New Repository URL", - "@storeNewRepoUrlLabel": { - "description": "Label for the new repository URL field inside the dialog" - }, - "storeLoadError": "Failed to load repository", - "@storeLoadError": { - "description": "Error heading when the store cannot be loaded" - }, - "storeEmptyNoExtensions": "No extensions available", - "@storeEmptyNoExtensions": { - "description": "Message when store has no extensions" - }, - "storeEmptyNoResults": "No extensions found", - "@storeEmptyNoResults": { - "description": "Message when search/filter returns no results" - }, - "extensionId": "ID", - "@extensionId": { - "description": "Extension detail - unique ID" - }, - "extensionError": "Error", - "@extensionError": { - "description": "Extension detail - error message" - }, - "extensionCapabilities": "Capabilities", - "@extensionCapabilities": { - "description": "Section header - extension features" - }, - "extensionMetadataProvider": "Metadata Provider", - "@extensionMetadataProvider": { - "description": "Capability - provides metadata" - }, - "extensionDownloadProvider": "Download Provider", - "@extensionDownloadProvider": { - "description": "Capability - provides downloads" - }, - "extensionLyricsProvider": "Lyrics Provider", - "@extensionLyricsProvider": { - "description": "Capability - provides lyrics" - }, - "extensionUrlHandler": "URL Handler", - "@extensionUrlHandler": { - "description": "Capability - handles URLs" - }, - "extensionQualityOptions": "Quality Options", - "@extensionQualityOptions": { - "description": "Capability - quality selection" - }, - "extensionPostProcessingHooks": "Post-Processing Hooks", - "@extensionPostProcessingHooks": { - "description": "Capability - post-processing" - }, - "extensionPermissions": "Permissions", - "@extensionPermissions": { - "description": "Section header - required permissions" - }, - "extensionSettings": "Settings", - "@extensionSettings": { - "description": "Section header - extension settings" - }, - "extensionRemoveButton": "Remove Extension", - "@extensionRemoveButton": { - "description": "Button to uninstall extension" - }, - "extensionUpdated": "Updated", - "@extensionUpdated": { - "description": "Extension detail - last update" - }, - "extensionMinAppVersion": "Min App Version", - "@extensionMinAppVersion": { - "description": "Extension detail - minimum app version" - }, - "extensionCustomTrackMatching": "Custom Track Matching", - "@extensionCustomTrackMatching": { - "description": "Capability - custom track matching algorithm" - }, - "extensionPostProcessing": "Post-Processing", - "@extensionPostProcessing": { - "description": "Capability - post-download processing" - }, - "extensionHooksAvailable": "{count} hook(s) available", - "@extensionHooksAvailable": { - "description": "Post-processing hooks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionPatternsCount": "{count} pattern(s)", - "@extensionPatternsCount": { - "description": "URL patterns count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionStrategy": "Strategy: {strategy}", - "@extensionStrategy": { - "description": "Track matching strategy name", - "placeholders": { - "strategy": { - "type": "String" - } - } - }, - "extensionsProviderPrioritySection": "Provider Priority", - "@extensionsProviderPrioritySection": { - "description": "Section header - provider priority" - }, - "extensionsInstalledSection": "Installed Extensions", - "@extensionsInstalledSection": { - "description": "Section header - installed extensions" - }, - "extensionsNoExtensions": "No extensions installed", - "@extensionsNoExtensions": { - "description": "Empty state - no extensions" - }, - "extensionsNoExtensionsSubtitle": "Install .spotiflac-ext files to add new providers", - "@extensionsNoExtensionsSubtitle": { - "description": "Empty state subtitle" - }, - "extensionsInstallButton": "Install Extension", - "@extensionsInstallButton": { - "description": "Button to install extension from file" - }, - "extensionsInfoTip": "Extensions can add new metadata and download providers. Only install extensions from trusted sources.", - "@extensionsInfoTip": { - "description": "Security warning about extensions" - }, - "extensionsInstalledSuccess": "Extension installed successfully", - "@extensionsInstalledSuccess": { - "description": "Success message after install" - }, - "extensionsInstalledCount": "{count} extensions installed successfully", - "@extensionsInstalledCount": { - "description": "Success message after installing multiple extensions", - "placeholders": { - "count": { - "type": "int", - "description": "Number of installed extensions" - } - } - }, - "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", - "@extensionsInstallPartialSuccess": { - "description": "Message when installing multiple extensions partially succeeds", - "placeholders": { - "installed": { - "type": "int", - "description": "Number of successfully installed extensions" - }, - "attempted": { - "type": "int", - "description": "Number of selected extensions" - } - } - }, - "extensionsDownloadPriority": "Download Priority", - "@extensionsDownloadPriority": { - "description": "Setting - download provider order" - }, - "extensionsDownloadPrioritySubtitle": "Set download service order", - "@extensionsDownloadPrioritySubtitle": { - "description": "Subtitle for download priority" - }, - "extensionsFallbackTitle": "Fallback Extensions", - "@extensionsFallbackTitle": { - "description": "Setting and page title for choosing which download extensions can be used during fallback" - }, - "extensionsFallbackSubtitle": "Choose which installed download extensions can be used as fallback", - "@extensionsFallbackSubtitle": { - "description": "Subtitle for download fallback extensions menu" - }, - "extensionsNoDownloadProvider": "No extensions with download provider", - "@extensionsNoDownloadProvider": { - "description": "Empty state - no download providers" - }, - "extensionsMetadataPriority": "Metadata Priority", - "@extensionsMetadataPriority": { - "description": "Setting - metadata provider order" - }, - "extensionsMetadataPrioritySubtitle": "Set search & metadata source order", - "@extensionsMetadataPrioritySubtitle": { - "description": "Subtitle for metadata priority" - }, - "extensionsNoMetadataProvider": "No extensions with metadata provider", - "@extensionsNoMetadataProvider": { - "description": "Empty state - no metadata providers" - }, - "extensionsSearchProvider": "Search Provider", - "@extensionsSearchProvider": { - "description": "Setting - search provider selection" - }, - "extensionsNoCustomSearch": "No extensions with custom search", - "@extensionsNoCustomSearch": { - "description": "Empty state - no search providers" - }, - "extensionsSearchProviderDescription": "Choose which service to use for searching tracks", - "@extensionsSearchProviderDescription": { - "description": "Search provider setting description" - }, - "extensionsCustomSearch": "Custom search", - "@extensionsCustomSearch": { - "description": "Label for custom search provider" - }, - "extensionsErrorLoading": "Error loading extension", - "@extensionsErrorLoading": { - "description": "Error message when extension fails to load" - }, - "qualityFlacLossless": "FLAC Lossless", - "@qualityFlacLossless": { - "description": "Quality option - CD quality FLAC" - }, - "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", - "@qualityFlacLosslessSubtitle": { - "description": "Technical spec for lossless" - }, - "qualityHiResFlac": "Hi-Res FLAC", - "@qualityHiResFlac": { - "description": "Quality option - high resolution FLAC" - }, - "qualityHiResFlacSubtitle": "24-bit / up to 96kHz", - "@qualityHiResFlacSubtitle": { - "description": "Technical spec for hi-res" - }, - "qualityHiResFlacMax": "Hi-Res FLAC Max", - "@qualityHiResFlacMax": { - "description": "Quality option - maximum resolution FLAC" - }, - "qualityHiResFlacMaxSubtitle": "24-bit / up to 192kHz", - "@qualityHiResFlacMaxSubtitle": { - "description": "Technical spec for hi-res max" - }, - "downloadLossy320": "Lossy 320kbps", - "@downloadLossy320": { - "description": "Quality option label for lossy 320kbps" - }, - "downloadLossyFormat": "Lossy Format", - "@downloadLossyFormat": { - "description": "Setting title to pick output format for lossy downloads" - }, - "downloadLossy320Format": "Lossy 320kbps Format", - "@downloadLossy320Format": { - "description": "Title of the lossy format picker bottom sheet" - }, - "downloadLossy320FormatDesc": "Choose the output format for 320kbps lossy downloads. The original stream will be converted to your selected format when needed.", - "@downloadLossy320FormatDesc": { - "description": "Description in the lossy format picker" - }, - "downloadLossyMp3": "MP3 320kbps", - "@downloadLossyMp3": { - "description": "Lossy format option - MP3 320kbps" - }, - "downloadLossyMp3Subtitle": "Best compatibility, ~10MB per track", - "@downloadLossyMp3Subtitle": { - "description": "Subtitle for MP3 320kbps lossy option" - }, - "downloadLossyAac": "AAC/M4A 320kbps", - "@downloadLossyAac": { - "description": "Lossy format option - AAC in M4A container at 320kbps" - }, - "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", - "@downloadLossyAacSubtitle": { - "description": "Subtitle for AAC/M4A 320kbps lossy option" - }, - "downloadLossyOpus256": "Opus 256kbps", - "@downloadLossyOpus256": { - "description": "Lossy format option - Opus 256kbps" - }, - "downloadLossyOpus256Subtitle": "Best quality Opus, ~8MB per track", - "@downloadLossyOpus256Subtitle": { - "description": "Subtitle for Opus 256kbps lossy option" - }, - "downloadLossyOpus128": "Opus 128kbps", - "@downloadLossyOpus128": { - "description": "Lossy format option - Opus 128kbps" - }, - "downloadLossyOpus128Subtitle": "Smallest size, ~4MB per track", - "@downloadLossyOpus128Subtitle": { - "description": "Subtitle for Opus 128kbps lossy option" - }, - "downloadAskBeforeDownload": "Ask Before Download", - "@downloadAskBeforeDownload": { - "description": "Setting - show quality picker" - }, - "downloadDirectory": "Download Directory", - "@downloadDirectory": { - "description": "Setting - download folder" - }, - "downloadSeparateSinglesFolder": "Separate Singles Folder", - "@downloadSeparateSinglesFolder": { - "description": "Setting - separate folder for singles" - }, - "downloadAlbumFolderStructure": "Album Folder Structure", - "@downloadAlbumFolderStructure": { - "description": "Setting - album folder organization" - }, - "albumFolderStructureDescription": "Choose how album folders are structured", - "@albumFolderStructureDescription": { - "description": "Album folder structure picker description" - }, - "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", - "@downloadUseAlbumArtistForFolders": { - "description": "Setting - choose whether artist folders use Album Artist or Track Artist" - }, - "downloadUsePrimaryArtistOnly": "Primary artist only for folders", - "@downloadUsePrimaryArtistOnly": { - "description": "Setting - strip featured artists from folder name" - }, - "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", - "@downloadUsePrimaryArtistOnlyEnabled": { - "description": "Subtitle when primary artist only is enabled" - }, - "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", - "@downloadUsePrimaryArtistOnlyDisabled": { - "description": "Subtitle when primary artist only is disabled" - }, - "downloadSelectQuality": "Select Quality", - "@downloadSelectQuality": { - "description": "Dialog title - choose audio quality" - }, - "downloadFrom": "Download From", - "@downloadFrom": { - "description": "Label - download source" - }, - "appearanceAmoledDark": "AMOLED Dark", - "@appearanceAmoledDark": { - "description": "Theme option - pure black" - }, - "appearanceAmoledDarkSubtitle": "Pure black background", - "@appearanceAmoledDarkSubtitle": { - "description": "Subtitle for AMOLED dark" - }, - "queueClearAll": "Clear All", - "@queueClearAll": { - "description": "Button - clear all queue items" - }, - "queueClearAllMessage": "Are you sure you want to clear all downloads?", - "@queueClearAllMessage": { - "description": "Clear queue confirmation" - }, - "settingsAutoExportFailed": "Auto-export failed downloads", - "@settingsAutoExportFailed": { - "description": "Setting toggle for auto-export" - }, - "settingsAutoExportFailedSubtitle": "Save failed downloads to TXT file automatically", - "@settingsAutoExportFailedSubtitle": { - "description": "Subtitle for auto-export setting" - }, - "settingsDownloadNetwork": "Download Network", - "@settingsDownloadNetwork": { - "description": "Setting for network type preference" - }, - "settingsDownloadNetworkAny": "WiFi + Mobile Data", - "@settingsDownloadNetworkAny": { - "description": "Network option - use any connection" - }, - "settingsDownloadNetworkWifiOnly": "WiFi Only", - "@settingsDownloadNetworkWifiOnly": { - "description": "Network option - only use WiFi" - }, - "settingsDownloadNetworkSubtitle": "Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.", - "@settingsDownloadNetworkSubtitle": { - "description": "Subtitle explaining network preference" - }, - "albumFolderArtistAlbum": "Artist / Album", - "@albumFolderArtistAlbum": { - "description": "Album folder option" - }, - "albumFolderArtistAlbumSubtitle": "Albums/Artist Name/Album Name/", - "@albumFolderArtistAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistYearAlbum": "Artist / [Year] Album", - "@albumFolderArtistYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderArtistYearAlbumSubtitle": "Albums/Artist Name/[2005] Album Name/", - "@albumFolderArtistYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderAlbumOnly": "Album Only", - "@albumFolderAlbumOnly": { - "description": "Album folder option" - }, - "albumFolderAlbumOnlySubtitle": "Albums/Album Name/", - "@albumFolderAlbumOnlySubtitle": { - "description": "Folder structure example" - }, - "albumFolderYearAlbum": "[Year] Album", - "@albumFolderYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderYearAlbumSubtitle": "Albums/[2005] Album Name/", - "@albumFolderYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistAlbumSingles": "Artist / Album + Singles", - "@albumFolderArtistAlbumSingles": { - "description": "Album folder option with singles inside artist" - }, - "albumFolderArtistAlbumSinglesSubtitle": "Artist/Album/ and Artist/Singles/", - "@albumFolderArtistAlbumSinglesSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", - "@albumFolderArtistAlbumFlat": { - "description": "Album folder option with singles directly in artist folder" - }, - "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", - "@albumFolderArtistAlbumFlatSubtitle": { - "description": "Folder structure example for flat singles" - }, - "downloadedAlbumDeleteSelected": "Delete Selected", - "@downloadedAlbumDeleteSelected": { - "description": "Button - delete selected tracks" - }, - "downloadedAlbumDeleteMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from this album?\n\nThis will also delete the files from storage.", - "@downloadedAlbumDeleteMessage": { - "description": "Delete confirmation with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectedCount": "{count} selected", - "@downloadedAlbumSelectedCount": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumTapToSelect": "Tap tracks to select", - "@downloadedAlbumTapToSelect": { - "description": "Selection hint" - }, - "downloadedAlbumDeleteCount": "Delete {count} {count, plural, =1{track} other{tracks}}", - "@downloadedAlbumDeleteCount": { - "description": "Delete button text with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectToDelete": "Select tracks to delete", - "@downloadedAlbumSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "downloadedAlbumDiscHeader": "Disc {discNumber}", - "@downloadedAlbumDiscHeader": { - "description": "Header for disc separator in multi-disc albums", - "placeholders": { - "discNumber": { - "type": "int", - "example": "1" - } - } - }, - "recentTypeArtist": "Artist", - "@recentTypeArtist": { - "description": "Recent access item type - artist" - }, - "recentTypeAlbum": "Album", - "@recentTypeAlbum": { - "description": "Recent access item type - album" - }, - "recentTypeSong": "Song", - "@recentTypeSong": { - "description": "Recent access item type - song/track" - }, - "recentTypePlaylist": "Playlist", - "@recentTypePlaylist": { - "description": "Recent access item type - playlist" - }, - "recentEmpty": "No recent items yet", - "@recentEmpty": { - "description": "Empty state text for recent access list" - }, - "recentShowAllDownloads": "Show All Downloads", - "@recentShowAllDownloads": { - "description": "Button label to unhide hidden downloads in recent access" - }, - "recentPlaylistInfo": "Playlist: {name}", - "@recentPlaylistInfo": { - "description": "Snackbar message when tapping playlist in recent access", - "placeholders": { - "name": { - "type": "String", - "description": "Playlist name" - } - } - }, - "discographyDownload": "Download Discography", - "@discographyDownload": { - "description": "Button - download artist discography" - }, - "discographyDownloadAll": "Download All", - "@discographyDownloadAll": { - "description": "Option - download entire discography" - }, - "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", - "@discographyDownloadAllSubtitle": { - "description": "Subtitle showing total tracks and albums", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographyAlbumsOnly": "Albums Only", - "@discographyAlbumsOnly": { - "description": "Option - download only albums" - }, - "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", - "@discographyAlbumsOnlySubtitle": { - "description": "Subtitle showing album tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySinglesOnly": "Singles & EPs Only", - "@discographySinglesOnly": { - "description": "Option - download only singles" - }, - "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", - "@discographySinglesOnlySubtitle": { - "description": "Subtitle showing singles tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySelectAlbums": "Select Albums...", - "@discographySelectAlbums": { - "description": "Option - manually select albums to download" - }, - "discographySelectAlbumsSubtitle": "Choose specific albums or singles", - "@discographySelectAlbumsSubtitle": { - "description": "Subtitle for select albums option" - }, - "discographyFetchingTracks": "Fetching tracks...", - "@discographyFetchingTracks": { - "description": "Progress - fetching album tracks" - }, - "discographyFetchingAlbum": "Fetching {current} of {total}...", - "@discographyFetchingAlbum": { - "description": "Progress - fetching specific album", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "discographySelectedCount": "{count} selected", - "@discographySelectedCount": { - "description": "Selection count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographyDownloadSelected": "Download Selected", - "@discographyDownloadSelected": { - "description": "Button - download selected albums" - }, - "discographyAddedToQueue": "Added {count} tracks to queue", - "@discographyAddedToQueue": { - "description": "Snackbar - tracks added from discography", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", - "@discographySkippedDownloaded": { - "description": "Snackbar - with skipped tracks count", - "placeholders": { - "added": { - "type": "int" - }, - "skipped": { - "type": "int" - } - } - }, - "discographyNoAlbums": "No albums available", - "@discographyNoAlbums": { - "description": "Error - no albums found for artist" - }, - "discographyFailedToFetch": "Failed to fetch some albums", - "@discographyFailedToFetch": { - "description": "Error - some albums failed to load" - }, - "sectionStorageAccess": "Storage Access", - "@sectionStorageAccess": { - "description": "Section header for storage access settings" - }, - "allFilesAccess": "All Files Access", - "@allFilesAccess": { - "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" - }, - "allFilesAccessEnabledSubtitle": "Can write to any folder", - "@allFilesAccessEnabledSubtitle": { - "description": "Subtitle when all files access is enabled" - }, - "allFilesAccessDisabledSubtitle": "Limited to media folders only", - "@allFilesAccessDisabledSubtitle": { - "description": "Subtitle when all files access is disabled" - }, - "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", - "@allFilesAccessDescription": { - "description": "Description explaining when to enable all files access" - }, - "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", - "@allFilesAccessDeniedMessage": { - "description": "Message when permission is permanently denied" - }, - "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", - "@allFilesAccessDisabledMessage": { - "description": "Snackbar message when user disables all files access" - }, - "settingsLocalLibrary": "Local Library", - "@settingsLocalLibrary": { - "description": "Settings menu item - local library" - }, - "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", - "@settingsLocalLibrarySubtitle": { - "description": "Subtitle for local library settings" - }, - "settingsCache": "Storage & Cache", - "@settingsCache": { - "description": "Settings menu item - cache management" - }, - "settingsCacheSubtitle": "View size and clear cached data", - "@settingsCacheSubtitle": { - "description": "Subtitle for cache management menu" - }, - "libraryTitle": "Local Library", - "@libraryTitle": { - "description": "Library settings page title" - }, - "libraryScanSettings": "Scan Settings", - "@libraryScanSettings": { - "description": "Section header for scan settings" - }, - "libraryEnableLocalLibrary": "Enable Local Library", - "@libraryEnableLocalLibrary": { - "description": "Toggle to enable library scanning" - }, - "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", - "@libraryEnableLocalLibrarySubtitle": { - "description": "Subtitle for enable toggle" - }, - "libraryFolder": "Library Folder", - "@libraryFolder": { - "description": "Folder selection setting" - }, - "libraryFolderHint": "Tap to select folder", - "@libraryFolderHint": { - "description": "Placeholder when no folder selected" - }, - "libraryShowDuplicateIndicator": "Show Duplicate Indicator", - "@libraryShowDuplicateIndicator": { - "description": "Toggle for duplicate indicator in search" - }, - "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", - "@libraryShowDuplicateIndicatorSubtitle": { - "description": "Subtitle for duplicate indicator toggle" - }, - "libraryAutoScan": "Auto Scan", - "@libraryAutoScan": { - "description": "Setting for automatic library scanning" - }, - "libraryAutoScanSubtitle": "Automatically scan your library for new files", - "@libraryAutoScanSubtitle": { - "description": "Subtitle for auto scan setting" - }, - "libraryAutoScanOff": "Off", - "@libraryAutoScanOff": { - "description": "Auto scan disabled" - }, - "libraryAutoScanOnOpen": "Every app open", - "@libraryAutoScanOnOpen": { - "description": "Auto scan when app opens" - }, - "libraryAutoScanDaily": "Daily", - "@libraryAutoScanDaily": { - "description": "Auto scan once per day" - }, - "libraryAutoScanWeekly": "Weekly", - "@libraryAutoScanWeekly": { - "description": "Auto scan once per week" - }, - "libraryActions": "Actions", - "@libraryActions": { - "description": "Section header for library actions" - }, - "libraryScan": "Scan Library", - "@libraryScan": { - "description": "Button to start library scan" - }, - "libraryScanSubtitle": "Scan for audio files", - "@libraryScanSubtitle": { - "description": "Subtitle for scan button" - }, - "libraryScanSelectFolderFirst": "Select a folder first", - "@libraryScanSelectFolderFirst": { - "description": "Message when trying to scan without folder" - }, - "libraryCleanupMissingFiles": "Cleanup Missing Files", - "@libraryCleanupMissingFiles": { - "description": "Button to remove entries for missing files" - }, - "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", - "@libraryCleanupMissingFilesSubtitle": { - "description": "Subtitle for cleanup button" - }, - "libraryClear": "Clear Library", - "@libraryClear": { - "description": "Button to clear all library entries" - }, - "libraryClearSubtitle": "Remove all scanned tracks", - "@libraryClearSubtitle": { - "description": "Subtitle for clear button" - }, - "libraryClearConfirmTitle": "Clear Library", - "@libraryClearConfirmTitle": { - "description": "Dialog title for clear confirmation" - }, - "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", - "@libraryClearConfirmMessage": { - "description": "Dialog message for clear confirmation" - }, - "libraryAbout": "About Local Library", - "@libraryAbout": { - "description": "Section header for about info" - }, - "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", - "@libraryAboutDescription": { - "description": "Description of local library feature" - }, - "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", - "@libraryTracksUnit": { - "description": "Unit label for tracks count (without the number itself)", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryFilesUnit": "{count, plural, =1{file} other{files}}", - "@libraryFilesUnit": { - "description": "Unit label for files count during library scanning", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryLastScanned": "Last scanned: {time}", - "@libraryLastScanned": { - "description": "Last scan time display", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "libraryLastScannedNever": "Never", - "@libraryLastScannedNever": { - "description": "Shown when library has never been scanned" - }, - "libraryScanning": "Scanning...", - "@libraryScanning": { - "description": "Status during scan" - }, - "libraryScanFinalizing": "Finalizing library...", - "@libraryScanFinalizing": { - "description": "Status shown after file scanning finishes but library persistence is still running" - }, - "libraryScanProgress": "{progress}% of {total} files", - "@libraryScanProgress": { - "description": "Scan progress display", - "placeholders": { - "progress": { - "type": "String" - }, - "total": { - "type": "int" - } - } - }, - "libraryInLibrary": "In Library", - "@libraryInLibrary": { - "description": "Badge shown on tracks that exist in local library" - }, - "libraryRemovedMissingFiles": "Removed {count} missing files from library", - "@libraryRemovedMissingFiles": { - "description": "Snackbar after cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryCleared": "Library cleared", - "@libraryCleared": { - "description": "Snackbar after clearing library" - }, - "libraryStorageAccessRequired": "Storage Access Required", - "@libraryStorageAccessRequired": { - "description": "Dialog title for storage permission" - }, - "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", - "@libraryStorageAccessMessage": { - "description": "Dialog message for storage permission" - }, - "libraryFolderNotExist": "Selected folder does not exist", - "@libraryFolderNotExist": { - "description": "Error when folder doesn't exist" - }, - "librarySourceDownloaded": "Downloaded", - "@librarySourceDownloaded": { - "description": "Badge for tracks downloaded via SpotiFLAC" - }, - "librarySourceLocal": "Local", - "@librarySourceLocal": { - "description": "Badge for tracks from local library scan" - }, - "libraryFilterAll": "All", - "@libraryFilterAll": { - "description": "Filter chip - show all library items" - }, - "libraryFilterDownloaded": "Downloaded", - "@libraryFilterDownloaded": { - "description": "Filter chip - show only downloaded items" - }, - "libraryFilterLocal": "Local", - "@libraryFilterLocal": { - "description": "Filter chip - show only local library items" - }, - "libraryFilterTitle": "Filters", - "@libraryFilterTitle": { - "description": "Filter bottom sheet title" - }, - "libraryFilterReset": "Reset", - "@libraryFilterReset": { - "description": "Reset all filters button" - }, - "libraryFilterApply": "Apply", - "@libraryFilterApply": { - "description": "Apply filters button" - }, - "libraryFilterSource": "Source", - "@libraryFilterSource": { - "description": "Filter section - source type" - }, - "libraryFilterQuality": "Quality", - "@libraryFilterQuality": { - "description": "Filter section - audio quality" - }, - "libraryFilterQualityHiRes": "Hi-Res (24bit)", - "@libraryFilterQualityHiRes": { - "description": "Filter option - high resolution audio" - }, - "libraryFilterQualityCD": "CD (16bit)", - "@libraryFilterQualityCD": { - "description": "Filter option - CD quality audio" - }, - "libraryFilterQualityLossy": "Lossy", - "@libraryFilterQualityLossy": { - "description": "Filter option - lossy compressed audio" - }, - "libraryFilterFormat": "Format", - "@libraryFilterFormat": { - "description": "Filter section - file format" - }, - "libraryFilterMetadata": "Metadata", - "@libraryFilterMetadata": { - "description": "Filter section - metadata completeness" - }, - "libraryFilterMetadataComplete": "Complete metadata", - "@libraryFilterMetadataComplete": { - "description": "Filter option - items with complete metadata" - }, - "libraryFilterMetadataMissingAny": "Missing any metadata", - "@libraryFilterMetadataMissingAny": { - "description": "Filter option - items missing any tracked metadata field" - }, - "libraryFilterMetadataMissingYear": "Missing year", - "@libraryFilterMetadataMissingYear": { - "description": "Filter option - items missing release year/date" - }, - "libraryFilterMetadataMissingGenre": "Missing genre", - "@libraryFilterMetadataMissingGenre": { - "description": "Filter option - items missing genre" - }, - "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", - "@libraryFilterMetadataMissingAlbumArtist": { - "description": "Filter option - items missing album artist" - }, - "libraryFilterSort": "Sort", - "@libraryFilterSort": { - "description": "Filter section - sort order" - }, - "libraryFilterSortLatest": "Latest", - "@libraryFilterSortLatest": { - "description": "Sort option - newest first" - }, - "libraryFilterSortOldest": "Oldest", - "@libraryFilterSortOldest": { - "description": "Sort option - oldest first" - }, - "libraryFilterSortAlbumAsc": "Album (A-Z)", - "@libraryFilterSortAlbumAsc": { - "description": "Sort option - album ascending" - }, - "libraryFilterSortAlbumDesc": "Album (Z-A)", - "@libraryFilterSortAlbumDesc": { - "description": "Sort option - album descending" - }, - "libraryFilterSortGenreAsc": "Genre (A-Z)", - "@libraryFilterSortGenreAsc": { - "description": "Sort option - genre ascending" - }, - "libraryFilterSortGenreDesc": "Genre (Z-A)", - "@libraryFilterSortGenreDesc": { - "description": "Sort option - genre descending" - }, - "timeJustNow": "Just now", - "@timeJustNow": { - "description": "Relative time - less than a minute ago" - }, - "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", - "@timeMinutesAgo": { - "description": "Relative time - minutes ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", - "@timeHoursAgo": { - "description": "Relative time - hours ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC!", - "@tutorialWelcomeTitle": { - "description": "Tutorial welcome page title" - }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", - "@tutorialWelcomeDesc": { - "description": "Tutorial welcome page description" - }, - "tutorialWelcomeTip1": "Download music from Spotify, Deezer, or paste any supported URL", - "@tutorialWelcomeTip1": { - "description": "Tutorial welcome tip 1" - }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", - "@tutorialWelcomeTip2": { - "description": "Tutorial welcome tip 2" - }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", - "@tutorialWelcomeTip3": { - "description": "Tutorial welcome tip 3" - }, - "tutorialSearchTitle": "Finding Music", - "@tutorialSearchTitle": { - "description": "Tutorial search page title" - }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", - "@tutorialSearchDesc": { - "description": "Tutorial search page description" - }, - "tutorialDownloadTitle": "Downloading Music", - "@tutorialDownloadTitle": { - "description": "Tutorial download page title" - }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", - "@tutorialDownloadDesc": { - "description": "Tutorial download page description" - }, - "tutorialLibraryTitle": "Your Library", - "@tutorialLibraryTitle": { - "description": "Tutorial library page title" - }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", - "@tutorialLibraryDesc": { - "description": "Tutorial library page description" - }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", - "@tutorialLibraryTip1": { - "description": "Tutorial library tip 1" - }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", - "@tutorialLibraryTip2": { - "description": "Tutorial library tip 2" - }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", - "@tutorialLibraryTip3": { - "description": "Tutorial library tip 3" - }, - "tutorialExtensionsTitle": "Extensions", - "@tutorialExtensionsTitle": { - "description": "Tutorial extensions page title" - }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", - "@tutorialExtensionsDesc": { - "description": "Tutorial extensions page description" - }, - "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", - "@tutorialExtensionsTip1": { - "description": "Tutorial extensions tip 1" - }, - "tutorialExtensionsTip2": "Add new download providers or search sources", - "@tutorialExtensionsTip2": { - "description": "Tutorial extensions tip 2" - }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", - "@tutorialExtensionsTip3": { - "description": "Tutorial extensions tip 3" - }, - "tutorialSettingsTitle": "Customize Your Experience", - "@tutorialSettingsTitle": { - "description": "Tutorial settings page title" - }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", - "@tutorialSettingsDesc": { - "description": "Tutorial settings page description" - }, - "tutorialSettingsTip1": "Change download location and folder organization", - "@tutorialSettingsTip1": { - "description": "Tutorial settings tip 1" - }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", - "@tutorialSettingsTip2": { - "description": "Tutorial settings tip 2" - }, - "tutorialSettingsTip3": "Customize app theme and appearance", - "@tutorialSettingsTip3": { - "description": "Tutorial settings tip 3" - }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", - "@tutorialReadyMessage": { - "description": "Tutorial completion message" - }, - "libraryForceFullScan": "Force Full Scan", - "@libraryForceFullScan": { - "description": "Button to force a complete rescan of library" - }, - "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", - "@libraryForceFullScanSubtitle": { - "description": "Subtitle for force full scan button" - }, - "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", - "@cleanupOrphanedDownloads": { - "description": "Button to remove history entries for deleted files" - }, - "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", - "@cleanupOrphanedDownloadsSubtitle": { - "description": "Subtitle for orphaned cleanup button" - }, - "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", - "@cleanupOrphanedDownloadsResult": { - "description": "Snackbar after orphan cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cleanupOrphanedDownloadsNone": "No orphaned entries found", - "@cleanupOrphanedDownloadsNone": { - "description": "Snackbar when no orphans found" - }, - "cacheTitle": "Storage & Cache", - "@cacheTitle": { - "description": "Cache management page title" - }, - "cacheSummaryTitle": "Cache overview", - "@cacheSummaryTitle": { - "description": "Heading for cache summary card" - }, - "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", - "@cacheSummarySubtitle": { - "description": "Helper text for cache summary card" - }, - "cacheEstimatedTotal": "Estimated cache usage: {size}", - "@cacheEstimatedTotal": { - "description": "Total cache size shown in summary", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheSectionStorage": "Cached Data", - "@cacheSectionStorage": { - "description": "Section header for cache entries" - }, - "cacheSectionMaintenance": "Maintenance", - "@cacheSectionMaintenance": { - "description": "Section header for cleanup actions" - }, - "cacheAppDirectory": "App cache directory", - "@cacheAppDirectory": { - "description": "Cache item title for app cache directory" - }, - "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", - "@cacheAppDirectoryDesc": { - "description": "Description of what app cache directory contains" - }, - "cacheTempDirectory": "Temporary directory", - "@cacheTempDirectory": { - "description": "Cache item title for temporary files directory" - }, - "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", - "@cacheTempDirectoryDesc": { - "description": "Description of what temporary directory contains" - }, - "cacheCoverImage": "Cover image cache", - "@cacheCoverImage": { - "description": "Cache item title for persistent cover images" - }, - "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", - "@cacheCoverImageDesc": { - "description": "Description of what cover image cache contains" - }, - "cacheLibraryCover": "Library cover cache", - "@cacheLibraryCover": { - "description": "Cache item title for local library cover art images" - }, - "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", - "@cacheLibraryCoverDesc": { - "description": "Description of what library cover cache contains" - }, - "cacheExploreFeed": "Explore feed cache", - "@cacheExploreFeed": { - "description": "Cache item title for explore home feed cache" - }, - "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", - "@cacheExploreFeedDesc": { - "description": "Description of what explore feed cache contains" - }, - "cacheTrackLookup": "Track lookup cache", - "@cacheTrackLookup": { - "description": "Cache item title for track ID lookup cache" - }, - "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", - "@cacheTrackLookupDesc": { - "description": "Description of what track lookup cache contains" - }, - "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", - "@cacheCleanupUnusedDesc": { - "description": "Description of what cleanup unused data does" - }, - "cacheNoData": "No cached data", - "@cacheNoData": { - "description": "Label when cache category has no data" - }, - "cacheSizeWithFiles": "{size} in {count} files", - "@cacheSizeWithFiles": { - "description": "Cache size and file count", - "placeholders": { - "size": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "cacheSizeOnly": "{size}", - "@cacheSizeOnly": { - "description": "Cache size only", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheEntries": "{count} entries", - "@cacheEntries": { - "description": "Track cache entry count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cacheClearSuccess": "Cleared: {target}", - "@cacheClearSuccess": { - "description": "Snackbar after clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearConfirmTitle": "Clear cache?", - "@cacheClearConfirmTitle": { - "description": "Dialog title before clearing one cache category" - }, - "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", - "@cacheClearConfirmMessage": { - "description": "Dialog message before clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearAllConfirmTitle": "Clear all cache?", - "@cacheClearAllConfirmTitle": { - "description": "Dialog title before clearing all caches" - }, - "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", - "@cacheClearAllConfirmMessage": { - "description": "Dialog message before clearing all caches" - }, - "cacheClearAll": "Clear all cache", - "@cacheClearAll": { - "description": "Button label to clear all caches" - }, - "cacheCleanupUnused": "Cleanup unused data", - "@cacheCleanupUnused": { - "description": "Action title for cleaning unused entries" - }, - "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", - "@cacheCleanupUnusedSubtitle": { - "description": "Subtitle for cleanup unused data action" - }, - "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", - "@cacheCleanupResult": { - "description": "Snackbar after unused data cleanup", - "placeholders": { - "downloadCount": { - "type": "int" - }, - "libraryCount": { - "type": "int" - } - } - }, - "cacheRefreshStats": "Refresh stats", - "@cacheRefreshStats": { - "description": "Button label to refresh cache statistics" - }, - "trackSaveCoverArt": "Save Cover Art", - "@trackSaveCoverArt": { - "description": "Menu action - save album cover art as file" - }, - "trackSaveLyrics": "Save Lyrics (.lrc)", - "@trackSaveLyrics": { - "description": "Menu action - save lyrics as .lrc file" - }, - "trackSaveLyricsProgress": "Saving lyrics...", - "@trackSaveLyricsProgress": { - "description": "Snackbar while saving lyrics to file" - }, - "trackReEnrich": "Re-enrich", - "@trackReEnrich": { - "description": "Menu action - re-embed metadata into audio file" - }, - "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", - "@trackReEnrichOnlineSubtitle": { - "description": "Subtitle for re-enrich metadata action for local items" - }, - "trackReEnrichFieldCover": "Cover Art", - "@trackReEnrichFieldCover": { - "description": "Checkbox label for cover art field in re-enrich" - }, - "trackReEnrichFieldLyrics": "Lyrics", - "@trackReEnrichFieldLyrics": { - "description": "Checkbox label for lyrics field in re-enrich" - }, - "trackReEnrichFieldBasicTags": "Album, Album Artist", - "@trackReEnrichFieldBasicTags": { - "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" - }, - "trackReEnrichFieldTrackInfo": "Track & Disc Number", - "@trackReEnrichFieldTrackInfo": { - "description": "Checkbox label for track info in re-enrich" - }, - "trackReEnrichFieldReleaseInfo": "Date & ISRC", - "@trackReEnrichFieldReleaseInfo": { - "description": "Checkbox label for release info in re-enrich" - }, - "trackReEnrichFieldExtra": "Genre, Label, Copyright", - "@trackReEnrichFieldExtra": { - "description": "Checkbox label for extra metadata in re-enrich" - }, - "trackReEnrichSelectAll": "Select All", - "@trackReEnrichSelectAll": { - "description": "Select all fields checkbox in re-enrich" - }, - "trackEditMetadata": "Edit Metadata", - "@trackEditMetadata": { - "description": "Menu action - edit embedded metadata" - }, - "trackCoverSaved": "Cover art saved to {fileName}", - "@trackCoverSaved": { - "description": "Snackbar after cover art saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackCoverNoSource": "No cover art source available", - "@trackCoverNoSource": { - "description": "Snackbar when no cover art URL or embedded cover" - }, - "trackLyricsSaved": "Lyrics saved to {fileName}", - "@trackLyricsSaved": { - "description": "Snackbar after lyrics saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackReEnrichProgress": "Re-enriching metadata...", - "@trackReEnrichProgress": { - "description": "Snackbar while re-enriching metadata" - }, - "trackReEnrichSearching": "Searching metadata online...", - "@trackReEnrichSearching": { - "description": "Snackbar while searching metadata from internet for local items" - }, - "trackReEnrichSuccess": "Metadata re-enriched successfully", - "@trackReEnrichSuccess": { - "description": "Snackbar after successful re-enrichment" - }, - "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", - "@trackReEnrichFfmpegFailed": { - "description": "Snackbar when FFmpeg embed fails for MP3/Opus" - }, - "queueFlacAction": "Queue FLAC", - "@queueFlacAction": { - "description": "Action/button label for queueing FLAC redownloads for local tracks" - }, - "queueFlacConfirmMessage": "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", - "@queueFlacConfirmMessage": { - "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueFlacNoReliableMatches": "No reliable online matches found for the selection", - "@queueFlacNoReliableMatches": { - "description": "Snackbar when no safe FLAC redownload matches were found" - }, - "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", - "@queueFlacQueuedWithSkipped": { - "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", - "placeholders": { - "addedCount": { - "type": "int" - }, - "skippedCount": { - "type": "int" - } - } - }, - "trackSaveFailed": "Failed: {error}", - "@trackSaveFailed": { - "description": "Snackbar when save operation fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "trackConvertFormat": "Convert Format", - "@trackConvertFormat": { - "description": "Menu item - convert audio format" - }, - "trackConvertTitle": "Convert Audio", - "@trackConvertTitle": { - "description": "Title of convert bottom sheet" - }, - "trackConvertTargetFormat": "Target Format", - "@trackConvertTargetFormat": { - "description": "Label for format selection" - }, - "trackConvertBitrate": "Bitrate", - "@trackConvertBitrate": { - "description": "Label for bitrate selection" - }, - "trackConvertConfirmTitle": "Confirm Conversion", - "@trackConvertConfirmTitle": { - "description": "Confirmation dialog title" - }, - "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", - "@trackConvertConfirmMessage": { - "description": "Confirmation dialog message", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", - "@trackConvertConfirmMessageLossless": { - "description": "Confirmation dialog message for lossless-to-lossless conversion", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - } - } - }, - "trackConvertLosslessHint": "Lossless conversion — no quality loss", - "@trackConvertLosslessHint": { - "description": "Hint shown when converting between lossless formats" - }, - "trackConvertConverting": "Converting audio...", - "@trackConvertConverting": { - "description": "Snackbar while converting" - }, - "trackConvertSuccess": "Converted to {format} successfully", - "@trackConvertSuccess": { - "description": "Snackbar after successful conversion", - "placeholders": { - "format": { - "type": "String" - } - } - }, - "trackConvertFailed": "Conversion failed", - "@trackConvertFailed": { - "description": "Snackbar when conversion fails" - }, - "cueSplitTitle": "Split CUE Sheet", - "@cueSplitTitle": { - "description": "Title for CUE split bottom sheet" - }, - "cueSplitAlbum": "Album: {album}", - "@cueSplitAlbum": { - "description": "Album name in CUE split sheet", - "placeholders": { - "album": { - "type": "String" - } - } - }, - "cueSplitArtist": "Artist: {artist}", - "@cueSplitArtist": { - "description": "Artist name in CUE split sheet", - "placeholders": { - "artist": { - "type": "String" - } - } - }, - "cueSplitTrackCount": "{count} tracks", - "@cueSplitTrackCount": { - "description": "Number of tracks in CUE sheet", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cueSplitConfirmTitle": "Split CUE Album", - "@cueSplitConfirmTitle": { - "description": "CUE split confirmation dialog title" - }, - "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", - "@cueSplitConfirmMessage": { - "description": "CUE split confirmation dialog message", - "placeholders": { - "album": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", - "@cueSplitSplitting": { - "description": "Snackbar while splitting CUE", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "cueSplitSuccess": "Split into {count} tracks successfully", - "@cueSplitSuccess": { - "description": "Snackbar after successful CUE split", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cueSplitFailed": "CUE split failed", - "@cueSplitFailed": { - "description": "Snackbar when CUE split fails" - }, - "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", - "@cueSplitNoAudioFile": { - "description": "Error when CUE audio file is missing" - }, - "cueSplitButton": "Split into Tracks", - "@cueSplitButton": { - "description": "Button text to start CUE splitting" - }, - "actionCreate": "Create", - "@actionCreate": { - "description": "Generic action button - create" - }, - "collectionFoldersTitle": "My folders", - "@collectionFoldersTitle": { - "description": "Library section title for custom folders" - }, - "collectionWishlist": "Wishlist", - "@collectionWishlist": { - "description": "Custom folder for saved tracks to download later" - }, - "collectionLoved": "Loved", - "@collectionLoved": { - "description": "Custom folder for favorite tracks" - }, - "collectionFavoriteArtists": "Favorite Artists", - "@collectionFavoriteArtists": { - "description": "Custom folder for favorite artists" - }, - "collectionPlaylist": "Playlist", - "@collectionPlaylist": { - "description": "Single playlist label" - }, - "collectionAddToPlaylist": "Add to playlist", - "@collectionAddToPlaylist": { - "description": "Action to add a track to user playlist" - }, - "collectionCreatePlaylist": "Create playlist", - "@collectionCreatePlaylist": { - "description": "Action to create a new playlist" - }, - "collectionNoPlaylistsYet": "No playlists yet", - "@collectionNoPlaylistsYet": { - "description": "Empty state title when user has no playlists" - }, - "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", - "@collectionPlaylistTracks": { - "description": "Track count label for custom playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", - "@collectionArtistCount": { - "description": "Artist count label for favorite artists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionAddedToPlaylist": "Added to \"{playlistName}\"", - "@collectionAddedToPlaylist": { - "description": "Snackbar after adding track to playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", - "@collectionAlreadyInPlaylist": { - "description": "Snackbar when track already exists in playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistNameHint": "Playlist name", - "@collectionPlaylistNameHint": { - "description": "Hint text for playlist name input" - }, - "collectionPlaylistNameRequired": "Playlist name is required", - "@collectionPlaylistNameRequired": { - "description": "Validation error for empty playlist name" - }, - "collectionRenamePlaylist": "Rename playlist", - "@collectionRenamePlaylist": { - "description": "Action to rename playlist" - }, - "collectionDeletePlaylist": "Delete playlist", - "@collectionDeletePlaylist": { - "description": "Action to delete playlist" - }, - "collectionPlaylistRenamed": "Playlist renamed", - "@collectionPlaylistRenamed": { - "description": "Snackbar after renaming playlist" - }, - "collectionWishlistEmptyTitle": "Wishlist is empty", - "@collectionWishlistEmptyTitle": { - "description": "Wishlist empty state title" - }, - "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", - "@collectionWishlistEmptySubtitle": { - "description": "Wishlist empty state subtitle" - }, - "collectionLovedEmptyTitle": "Loved folder is empty", - "@collectionLovedEmptyTitle": { - "description": "Loved empty state title" - }, - "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", - "@collectionLovedEmptySubtitle": { - "description": "Loved empty state subtitle" - }, - "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", - "@collectionFavoriteArtistsEmptyTitle": { - "description": "Favorite artists empty state title" - }, - "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", - "@collectionFavoriteArtistsEmptySubtitle": { - "description": "Favorite artists empty state subtitle" - }, - "collectionPlaylistEmptyTitle": "Playlist is empty", - "@collectionPlaylistEmptyTitle": { - "description": "Playlist empty state title" - }, - "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", - "@collectionPlaylistEmptySubtitle": { - "description": "Playlist empty state subtitle" - }, - "collectionRemoveFromPlaylist": "Remove from playlist", - "@collectionRemoveFromPlaylist": { - "description": "Tooltip for removing track from playlist" - }, - "collectionRemoveFromFolder": "Remove from folder", - "@collectionRemoveFromFolder": { - "description": "Tooltip for removing track from wishlist/loved folder" - }, - "collectionAddedToLoved": "\"{trackName}\" added to Loved", - "@collectionAddedToLoved": { - "description": "Snackbar after adding track to loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", - "@collectionRemovedFromLoved": { - "description": "Snackbar after removing track from loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", - "@collectionAddedToWishlist": { - "description": "Snackbar after adding track to wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", - "@collectionRemovedFromWishlist": { - "description": "Snackbar after removing track from wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", - "@collectionAddedToFavoriteArtists": { - "description": "Snackbar after adding artist to favorite artists", - "placeholders": { - "artistName": { - "type": "String" - } - } - }, - "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", - "@collectionRemovedFromFavoriteArtists": { - "description": "Snackbar after removing artist from favorite artists", - "placeholders": { - "artistName": { - "type": "String" - } - } - }, - "trackOptionAddToLoved": "Add to Loved", - "@trackOptionAddToLoved": { - "description": "Bottom sheet action label - add track to loved folder" - }, - "trackOptionRemoveFromLoved": "Remove from Loved", - "@trackOptionRemoveFromLoved": { - "description": "Bottom sheet action label - remove track from loved folder" - }, - "trackOptionAddToWishlist": "Add to Wishlist", - "@trackOptionAddToWishlist": { - "description": "Bottom sheet action label - add track to wishlist" - }, - "trackOptionRemoveFromWishlist": "Remove from Wishlist", - "@trackOptionRemoveFromWishlist": { - "description": "Bottom sheet action label - remove track from wishlist" - }, - "artistOptionAddToFavorites": "Add to Favorite Artists", - "@artistOptionAddToFavorites": { - "description": "Action label - add artist to favorite artists" - }, - "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", - "@artistOptionRemoveFromFavorites": { - "description": "Action label - remove artist from favorite artists" - }, - "collectionPlaylistChangeCover": "Change cover image", - "@collectionPlaylistChangeCover": { - "description": "Bottom sheet action to pick a custom cover image for a playlist" - }, - "collectionPlaylistRemoveCover": "Remove cover image", - "@collectionPlaylistRemoveCover": { - "description": "Bottom sheet action to remove custom cover image from a playlist" - }, - "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", - "@selectionShareCount": { - "description": "Share button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionShareNoFiles": "No shareable files found", - "@selectionShareNoFiles": { - "description": "Snackbar when no selected files exist on disk" - }, - "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", - "@selectionConvertCount": { - "description": "Convert button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionConvertNoConvertible": "No convertible tracks selected", - "@selectionConvertNoConvertible": { - "description": "Snackbar when no selected tracks support conversion" - }, - "selectionBatchConvertConfirmTitle": "Batch Convert", - "@selectionBatchConvertConfirmTitle": { - "description": "Confirmation dialog title for batch conversion" - }, - "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessage": { - "description": "Confirmation dialog message for batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessageLossless": { - "description": "Confirmation dialog message for lossless batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", - "@selectionBatchConvertSuccess": { - "description": "Snackbar after batch conversion completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "downloadedAlbumDownloadedCount": "{count} downloaded", - "@downloadedAlbumDownloadedCount": { - "description": "Downloaded tracks count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", - "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { - "description": "Subtitle when album artist is used for folder names" - }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", - "@downloadUseAlbumArtistForFoldersTrackSubtitle": { - "description": "Subtitle when track artist is used for folder names" - }, - "lyricsProvidersTitle": "Lyrics Provider Priority", - "@lyricsProvidersTitle": { - "description": "Settings item title for lyrics provider order" - }, - "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", - "@lyricsProvidersDescription": { - "description": "Description on the lyrics provider priority page" - }, - "lyricsProvidersInfoText": "Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.", - "@lyricsProvidersInfoText": { - "description": "Info tip on lyrics provider priority page" - }, - "lyricsProvidersEnabledSection": "Enabled ({count})", - "@lyricsProvidersEnabledSection": { - "description": "Section header for enabled providers", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "lyricsProvidersDisabledSection": "Disabled ({count})", - "@lyricsProvidersDisabledSection": { - "description": "Section header for disabled providers", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", - "@lyricsProvidersAtLeastOne": { - "description": "Snackbar when user tries to disable the last enabled provider" - }, - "lyricsProvidersSaved": "Lyrics provider priority saved", - "@lyricsProvidersSaved": { - "description": "Snackbar after saving lyrics provider priority" - }, - "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", - "@lyricsProvidersDiscardContent": { - "description": "Body text of the discard-changes dialog on lyrics provider page" - }, - "lyricsProviderLrclibDesc": "Open-source synced lyrics database", - "@lyricsProviderLrclibDesc": { - "description": "Description for LRCLIB provider" - }, - "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", - "@lyricsProviderNeteaseDesc": { - "description": "Description for Netease provider" - }, - "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", - "@lyricsProviderMusixmatchDesc": { - "description": "Description for Musixmatch provider" - }, - "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", - "@lyricsProviderAppleMusicDesc": { - "description": "Description for Apple Music provider" - }, - "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", - "@lyricsProviderQqMusicDesc": { - "description": "Description for QQ Music provider" - }, - "lyricsProviderLyricsPlusDesc": "Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)", - "@lyricsProviderLyricsPlusDesc": { - "description": "Description for LyricsPlus provider" - }, - "lyricsProviderExtensionDesc": "Extension provider", - "@lyricsProviderExtensionDesc": { - "description": "Generic description for extension-based lyrics providers" - }, - "safMigrationTitle": "Storage Update Required", - "@safMigrationTitle": { - "description": "Title of SAF migration dialog" - }, - "safMigrationMessage1": "SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.", - "@safMigrationMessage1": { - "description": "First paragraph of SAF migration dialog" - }, - "safMigrationMessage2": "Please select your download folder again to switch to the new storage system.", - "@safMigrationMessage2": { - "description": "Second paragraph of SAF migration dialog" - }, - "safMigrationSuccess": "Download folder updated to SAF mode", - "@safMigrationSuccess": { - "description": "Snackbar after successfully migrating to SAF" - }, - "settingsDonate": "Support Development", - "@settingsDonate": { - "description": "Settings menu item - donate page" - }, - "settingsDonateSubtitle": "Buy the developer a coffee", - "@settingsDonateSubtitle": { - "description": "Subtitle for donate menu item" - }, - "settingsBackup": "Backup & Restore", - "@settingsBackup": { - "description": "Settings menu item - backup and restore page" - }, - "settingsBackupSubtitle": "Move your library, history and settings to a new device", - "@settingsBackupSubtitle": { - "description": "Subtitle for backup and restore settings item" - }, - "backupTitle": "Backup & Restore", - "@backupTitle": { - "description": "App bar title for the backup and restore page" - }, - "backupExportSectionTitle": "Create backup", - "@backupExportSectionTitle": { - "description": "Section title for the export/backup card" - }, - "backupExportSectionDescription": "Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.", - "@backupExportSectionDescription": { - "description": "Description of what a backup contains" - }, - "backupExportButton": "Create backup file", - "@backupExportButton": { - "description": "Button to create and share a backup file" - }, - "backupImportSectionTitle": "Restore backup", - "@backupImportSectionTitle": { - "description": "Section title for the import/restore card" - }, - "backupImportSectionDescription": "Pick a backup file to restore your data. This replaces the current settings, history and library on this device.", - "@backupImportSectionDescription": { - "description": "Description for the restore action" - }, - "backupImportButton": "Choose backup file", - "@backupImportButton": { - "description": "Button to pick a backup file to restore" - }, - "backupCreated": "Backup created", - "@backupCreated": { - "description": "Snackbar after a backup file is created" - }, - "backupCreateFailed": "Failed to create backup", - "@backupCreateFailed": { - "description": "Snackbar when backup creation fails" - }, - "backupRestoreConfirmTitle": "Restore this backup?", - "@backupRestoreConfirmTitle": { - "description": "Confirmation dialog title before restoring a backup" - }, - "backupRestoreConfirmMessage": "This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.", - "@backupRestoreConfirmMessage": { - "description": "Confirmation dialog message before restoring a backup" - }, - "backupRestoreConfirmButton": "Restore", - "@backupRestoreConfirmButton": { - "description": "Confirm button to proceed with restore" - }, - "backupRestored": "Backup restored successfully", - "@backupRestored": { - "description": "Snackbar after a successful restore" - }, - "backupRestoreFailed": "Failed to restore backup", - "@backupRestoreFailed": { - "description": "Snackbar when restore fails" - }, - "backupInvalidFile": "This file is not a valid SpotiFLAC backup", - "@backupInvalidFile": { - "description": "Snackbar when the chosen file is not a valid backup" - }, - "backupRestoreRestartHint": "Restart the app to make sure every change is applied.", - "@backupRestoreRestartHint": { - "description": "Hint shown after restoring that an app restart is recommended" - }, - "backupContentsTitle": "Backup contents", - "@backupContentsTitle": { - "description": "Header above the list summarizing what the backup contains" - }, - "backupContentsSettings": "App settings", - "@backupContentsSettings": { - "description": "Backup contents row label for settings" - }, - "backupContentsHistory": "{count} history {count, plural, =1{item} other{items}}", - "@backupContentsHistory": { - "description": "Backup contents row for history count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsLiked": "{count} liked {count, plural, =1{track} other{tracks}}", - "@backupContentsLiked": { - "description": "Backup contents row for liked tracks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsWishlist": "{count} wishlist {count, plural, =1{track} other{tracks}}", - "@backupContentsWishlist": { - "description": "Backup contents row for wishlist tracks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsPlaylists": "{count, plural, =1{1 playlist} other{{count} playlists}}", - "@backupContentsPlaylists": { - "description": "Backup contents row for playlist count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsArtists": "{count, plural, =1{1 favorite artist} other{{count} favorite artists}}", - "@backupContentsArtists": { - "description": "Backup contents row for favorite artists count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupContentsExtensions": "{count, plural, =1{1 extension} other{{count} extensions}}", - "@backupContentsExtensions": { - "description": "Backup contents row for installed extensions count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "backupIncludeSecrets": "Include extension credentials", - "@backupIncludeSecrets": { - "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" - }, - "backupIncludeSecretsDescription": "Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.", - "@backupIncludeSecretsDescription": { - "description": "Explanation for the include-credentials toggle" - }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", - "@backupExtensionsRestoreFailed": { - "description": "Snackbar/hint when some extensions failed to reinstall during restore", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tooltipLoveAll": "Love All", - "@tooltipLoveAll": { - "description": "Tooltip for the Love All button on album/playlist screens" - }, - "tooltipAddToPlaylist": "Add to Playlist", - "@tooltipAddToPlaylist": { - "description": "Tooltip for the Add to Playlist button" - }, - "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", - "@snackbarRemovedTracksFromLoved": { - "description": "Snackbar after removing multiple tracks from Loved folder", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", - "@snackbarAddedTracksToLoved": { - "description": "Snackbar after adding multiple tracks to Loved folder", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogDownloadAllTitle": "Download All", - "@dialogDownloadAllTitle": { - "description": "Dialog title for bulk download confirmation" - }, - "dialogDownloadAllMessage": "Download {count} tracks?", - "@dialogDownloadAllMessage": { - "description": "Body of the Download All confirmation dialog", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "homeSkipAlreadyDownloaded": "Skip already downloaded songs", - "@homeSkipAlreadyDownloaded": { - "description": "Checkbox label in import dialog to skip already-downloaded songs" - }, - "homeGoToAlbum": "Go to Album", - "@homeGoToAlbum": { - "description": "Context menu item to navigate to the album page" - }, - "homeAlbumInfoUnavailable": "Album info not available", - "@homeAlbumInfoUnavailable": { - "description": "Snackbar when album info cannot be loaded" - }, - "snackbarLoadingCueSheet": "Loading CUE sheet...", - "@snackbarLoadingCueSheet": { - "description": "Snackbar while loading a CUE sheet file" - }, - "snackbarMetadataSaved": "Metadata saved successfully", - "@snackbarMetadataSaved": { - "description": "Snackbar after successfully saving track metadata" - }, - "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", - "@snackbarFailedToEmbedLyrics": { - "description": "Snackbar when lyrics embedding fails" - }, - "snackbarFailedToWriteStorage": "Failed to write back to storage", - "@snackbarFailedToWriteStorage": { - "description": "Snackbar when writing metadata back to file fails" - }, - "snackbarError": "Error: {error}", - "@snackbarError": { - "description": "Generic error snackbar with error detail", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "snackbarNoActionDefined": "No action defined for this button", - "@snackbarNoActionDefined": { - "description": "Snackbar when an extension button has no action configured" - }, - "noTracksFoundForAlbum": "No tracks found for this album", - "@noTracksFoundForAlbum": { - "description": "Empty state message when an album has no tracks" - }, - "downloadLocationSubtitle": "Choose where to save your downloaded tracks", - "@downloadLocationSubtitle": { - "description": "Subtitle shown in the download location picker sheet" - }, - "storageModeAppFolder": "App Folder (Recommended)", - "@storageModeAppFolder": { - "description": "Storage mode option - app-managed folder" - }, - "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", - "@storageModeAppFolderSubtitle": { - "description": "Subtitle for app folder storage mode" - }, - "storageModeSaf": "Custom Folder (SAF)", - "@storageModeSaf": { - "description": "Storage mode option - Storage Access Framework" - }, - "storageModeSafSubtitle": "Pick any folder, including SD card", - "@storageModeSafSubtitle": { - "description": "Subtitle for SAF storage mode" - }, - "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", - "@downloadFilenameDescription": { - "description": "Description shown in filename format editor" - }, - "downloadFilenameInsertTag": "Tap to insert tag:", - "@downloadFilenameInsertTag": { - "description": "Label above filename tag chips" - }, - "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", - "@downloadSeparateSinglesEnabled": { - "description": "Subtitle when separate singles folder is on" - }, - "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", - "@downloadSeparateSinglesDisabled": { - "description": "Subtitle when separate singles folder is off" - }, - "downloadArtistNameFilters": "Artist Name Filters", - "@downloadArtistNameFilters": { - "description": "Setting title for artist folder filter options" - }, - "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", - "@downloadCreatePlaylistSourceFolder": { - "description": "Setting to create a subfolder per playlist source" - }, - "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", - "@downloadCreatePlaylistSourceFolderEnabled": { - "description": "Subtitle when playlist folder is enabled" - }, - "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", - "@downloadCreatePlaylistSourceFolderDisabled": { - "description": "Subtitle when playlist folder is disabled" - }, - "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", - "@downloadCreatePlaylistSourceFolderRedundant": { - "description": "Subtitle when folder organization is already set to playlist" - }, - "downloadSongLinkRegion": "SongLink Region", - "@downloadSongLinkRegion": { - "description": "Setting for SongLink region used during fallback resolution" - }, - "downloadNetworkCompatibilityMode": "Network Compatibility Mode", - "@downloadNetworkCompatibilityMode": { - "description": "Setting for legacy TLS/network handling" - }, - "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", - "@downloadNetworkCompatibilityModeEnabled": { - "description": "Subtitle when network compatibility mode is on" - }, - "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", - "@downloadNetworkCompatibilityModeDisabled": { - "description": "Subtitle when network compatibility mode is off" - }, - "downloadAllowLocalNetwork": "Allow Local Network Access", - "@downloadAllowLocalNetwork": { - "description": "Setting title for allowing requests to private/local network targets" - }, - "downloadAllowLocalNetworkEnabled": "Requests to local/private addresses are allowed (for local proxy or custom DNS)", - "@downloadAllowLocalNetworkEnabled": { - "description": "Subtitle when allow local network access is on" - }, - "downloadAllowLocalNetworkDisabled": "Local/private addresses are blocked for security", - "@downloadAllowLocalNetworkDisabled": { - "description": "Subtitle when allow local network access is off" - }, - "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", - "@downloadSelectServiceToEnable": { - "description": "Subtitle when quality picker is disabled due to extension service" - }, - "downloadEmbedLyricsDisabled": "Enable metadata embedding first", - "@downloadEmbedLyricsDisabled": { - "description": "Subtitle when lyrics embedding is blocked by metadata toggle" - }, - "downloadNeteaseIncludeTranslation": "Netease: Include Translation", - "@downloadNeteaseIncludeTranslation": { - "description": "Setting to include translated lyrics from Netease" - }, - "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", - "@downloadNeteaseIncludeTranslationEnabled": { - "description": "Subtitle when Netease translation is on" - }, - "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", - "@downloadNeteaseIncludeTranslationDisabled": { - "description": "Subtitle when Netease translation is off" - }, - "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", - "@downloadNeteaseIncludeRomanization": { - "description": "Setting to include romanized lyrics from Netease" - }, - "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", - "@downloadNeteaseIncludeRomanizationEnabled": { - "description": "Subtitle when Netease romanization is on" - }, - "downloadNeteaseIncludeRomanizationDisabled": "No romanization", - "@downloadNeteaseIncludeRomanizationDisabled": { - "description": "Subtitle when Netease romanization is off" - }, - "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", - "@downloadAppleQqMultiPerson": { - "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" - }, - "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", - "@downloadAppleQqMultiPersonEnabled": { - "description": "Subtitle when multi-person lyrics is on" - }, - "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", - "@downloadAppleQqMultiPersonDisabled": { - "description": "Subtitle when multi-person lyrics is off" - }, - "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", - "@downloadAppleElrcWordSync": { - "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" - }, - "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", - "@downloadAppleElrcWordSyncEnabled": { - "description": "Subtitle when Apple Music eLRC word sync is enabled" - }, - "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", - "@downloadAppleElrcWordSyncDisabled": { - "description": "Subtitle when Apple Music eLRC word sync is disabled" - }, - "downloadMusixmatchLanguage": "Musixmatch Language", - "@downloadMusixmatchLanguage": { - "description": "Setting for Musixmatch lyrics translation language" - }, - "downloadMusixmatchLanguageAuto": "Auto (original language)", - "@downloadMusixmatchLanguageAuto": { - "description": "Subtitle when no language is set" - }, - "downloadFilterContributing": "Filter Contributing Artists", - "@downloadFilterContributing": { - "description": "Setting to strip contributing artists from Album Artist folder name" - }, - "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", - "@downloadFilterContributingEnabled": { - "description": "Subtitle when contributing artist filter is on" - }, - "downloadFilterContributingDisabled": "Full Album Artist string used", - "@downloadFilterContributingDisabled": { - "description": "Subtitle when contributing artist filter is off" - }, - "downloadProvidersNoneEnabled": "No providers enabled", - "@downloadProvidersNoneEnabled": { - "description": "Shown when no lyrics providers are active" - }, - "downloadMusixmatchLanguageCode": "Language code", - "@downloadMusixmatchLanguageCode": { - "description": "Label for Musixmatch language input field" - }, - "downloadMusixmatchLanguageHint": "e.g. en, de, ja", - "@downloadMusixmatchLanguageHint": { - "description": "Placeholder for Musixmatch language input" - }, - "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", - "@downloadMusixmatchLanguageDesc": { - "description": "Description in Musixmatch language picker" - }, - "downloadMusixmatchAuto": "Auto", - "@downloadMusixmatchAuto": { - "description": "Button to clear Musixmatch language (use auto)" - }, - "downloadNetworkAnySubtitle": "Use WiFi or mobile data", - "@downloadNetworkAnySubtitle": { - "description": "Subtitle for any-network option in picker" - }, - "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", - "@downloadNetworkWifiOnlySubtitle": { - "description": "Subtitle for WiFi-only option in picker" - }, - "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", - "@downloadSongLinkRegionDesc": { - "description": "Description in SongLink region picker" - }, - "snackbarUnsupportedAudioFormat": "Unsupported audio format", - "@snackbarUnsupportedAudioFormat": { - "description": "Snackbar when the audio format is not supported for the requested operation" - }, - "cacheRefresh": "Refresh", - "@cacheRefresh": { - "description": "Tooltip for refresh button on cache management page" - }, - "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", - "@dialogDownloadPlaylistsMessage": { - "description": "Dialog message for bulk playlist download confirmation", - "placeholders": { - "trackCount": { - "type": "int" - }, - "playlistCount": { - "type": "int" - } - } - }, - "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", - "@bulkDownloadPlaylistsButton": { - "description": "Button label for bulk downloading selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "bulkDownloadSelectPlaylists": "Select playlists to download", - "@bulkDownloadSelectPlaylists": { - "description": "Button label when no playlists are selected for download" - }, - "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", - "@snackbarSelectedPlaylistsEmpty": { - "description": "Snackbar when selected playlists contain no tracks" - }, - "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", - "@playlistsCount": { - "description": "Playlist count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "editMetadataAutoFill": "Auto-fill from online", - "@editMetadataAutoFill": { - "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" - }, - "editMetadataAutoFillDesc": "Select fields to fill automatically from online metadata", - "@editMetadataAutoFillDesc": { - "description": "Description for the auto-fill section" - }, - "editMetadataAutoFillFetch": "Fetch & Fill", - "@editMetadataAutoFillFetch": { - "description": "Button label to fetch online metadata and fill selected fields" - }, - "editMetadataAutoFillSearching": "Searching online...", - "@editMetadataAutoFillSearching": { - "description": "Snackbar shown while searching for online metadata" - }, - "editMetadataAutoFillNoResults": "No matching metadata found online", - "@editMetadataAutoFillNoResults": { - "description": "Snackbar when online metadata search returns no results" - }, - "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", - "@editMetadataAutoFillDone": { - "description": "Snackbar confirming how many fields were auto-filled", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", - "@editMetadataAutoFillNoneSelected": { - "description": "Snackbar when user taps Fetch without selecting any fields" - }, - "editMetadataFieldTitle": "Title", - "@editMetadataFieldTitle": { - "description": "Chip label for title field in auto-fill selector" - }, - "editMetadataFieldArtist": "Artist", - "@editMetadataFieldArtist": { - "description": "Chip label for artist field in auto-fill selector" - }, - "editMetadataFieldAlbum": "Album", - "@editMetadataFieldAlbum": { - "description": "Chip label for album field in auto-fill selector" - }, - "editMetadataFieldAlbumArtist": "Album Artist", - "@editMetadataFieldAlbumArtist": { - "description": "Chip label for album artist field in auto-fill selector" - }, - "editMetadataFieldDate": "Date", - "@editMetadataFieldDate": { - "description": "Chip label for date field in auto-fill selector" - }, - "editMetadataFieldTrackNum": "Track #", - "@editMetadataFieldTrackNum": { - "description": "Chip label for track number field in auto-fill selector" - }, - "editMetadataFieldDiscNum": "Disc #", - "@editMetadataFieldDiscNum": { - "description": "Chip label for disc number field in auto-fill selector" - }, - "editMetadataFieldGenre": "Genre", - "@editMetadataFieldGenre": { - "description": "Chip label for genre field in auto-fill selector" - }, - "editMetadataFieldIsrc": "ISRC", - "@editMetadataFieldIsrc": { - "description": "Chip label for ISRC field in auto-fill selector" - }, - "editMetadataFieldLabel": "Label", - "@editMetadataFieldLabel": { - "description": "Chip label for label field in auto-fill selector" - }, - "editMetadataFieldCopyright": "Copyright", - "@editMetadataFieldCopyright": { - "description": "Chip label for copyright field in auto-fill selector" - }, - "editMetadataFieldCover": "Cover Art", - "@editMetadataFieldCover": { - "description": "Chip label for cover art field in auto-fill selector" - }, - "editMetadataSelectAll": "All", - "@editMetadataSelectAll": { - "description": "Button to select all fields for auto-fill" - }, - "editMetadataSelectEmpty": "Empty only", - "@editMetadataSelectEmpty": { - "description": "Button to select only fields that are currently empty" - }, - "queueDownloadingCount": "Downloading ({count})", - "@queueDownloadingCount": { - "description": "Header for active downloads section with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueFilteringIndicator": "Filtering...", - "@queueFilteringIndicator": { - "description": "Shown while filter results are being computed" - }, - "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", - "@queueTrackCount": { - "description": "Track count label with plural support", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueAlbumCount": "{count, plural, =1{1 album} other{{count} albums}}", - "@queueAlbumCount": { - "description": "Album count label with plural support", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueEmptyAlbums": "No album downloads", - "@queueEmptyAlbums": { - "description": "Empty state title when no album downloads exist" - }, - "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", - "@queueEmptyAlbumsSubtitle": { - "description": "Empty state subtitle for album downloads" - }, - "queueEmptySingles": "No single downloads", - "@queueEmptySingles": { - "description": "Empty state title when no single track downloads exist" - }, - "queueEmptySinglesSubtitle": "Single track downloads will appear here", - "@queueEmptySinglesSubtitle": { - "description": "Empty state subtitle for single track downloads" - }, - "queueEmptyHistory": "No download history", - "@queueEmptyHistory": { - "description": "Empty state title when download history is empty" - }, - "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", - "@queueEmptyHistorySubtitle": { - "description": "Empty state subtitle for download history" - }, - "selectionAllPlaylistsSelected": "All playlists selected", - "@selectionAllPlaylistsSelected": { - "description": "Shown when all playlists are selected in selection mode" - }, - "selectionTapPlaylistsToSelect": "Tap playlists to select", - "@selectionTapPlaylistsToSelect": { - "description": "Hint shown in playlist selection mode" - }, - "selectionSelectPlaylistsToDelete": "Select playlists to delete", - "@selectionSelectPlaylistsToDelete": { - "description": "Hint shown when no playlists are selected for deletion" - }, - "audioAnalysisTitle": "Audio Quality Analysis", - "@audioAnalysisTitle": { - "description": "Title for audio analysis section" - }, - "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", - "@audioAnalysisDescription": { - "description": "Description for audio analysis tap-to-analyze prompt" - }, - "audioAnalysisAnalyzing": "Analyzing audio...", - "@audioAnalysisAnalyzing": { - "description": "Loading text while analyzing audio" - }, - "audioAnalysisSampleRate": "Sample Rate", - "@audioAnalysisSampleRate": { - "description": "Sample rate metric label" - }, - "audioAnalysisCodec": "Codec", - "@audioAnalysisCodec": { - "description": "Audio codec metric label" - }, - "audioAnalysisContainer": "Container", - "@audioAnalysisContainer": { - "description": "Audio container metric label" - }, - "audioAnalysisDecodedFormat": "Decoded Format", - "@audioAnalysisDecodedFormat": { - "description": "Decoded sample format metric label" - }, - "audioAnalysisBitDepth": "Bit Depth", - "@audioAnalysisBitDepth": { - "description": "Bit depth metric label" - }, - "audioAnalysisChannels": "Channels", - "@audioAnalysisChannels": { - "description": "Channels metric label" - }, - "audioAnalysisDuration": "Duration", - "@audioAnalysisDuration": { - "description": "Duration metric label" - }, - "audioAnalysisNyquist": "Nyquist", - "@audioAnalysisNyquist": { - "description": "Nyquist frequency metric label" - }, - "audioAnalysisFileSize": "Size", - "@audioAnalysisFileSize": { - "description": "File size metric label" - }, - "audioAnalysisDynamicRange": "Dynamic Range", - "@audioAnalysisDynamicRange": { - "description": "Dynamic range metric label" - }, - "audioAnalysisPeak": "Peak", - "@audioAnalysisPeak": { - "description": "Peak amplitude metric label" - }, - "audioAnalysisRms": "RMS", - "@audioAnalysisRms": { - "description": "RMS level metric label" - }, - "audioAnalysisLufs": "LUFS", - "@audioAnalysisLufs": { - "description": "Integrated loudness metric label" - }, - "audioAnalysisTruePeak": "True Peak", - "@audioAnalysisTruePeak": { - "description": "True peak metric label" - }, - "audioAnalysisClipping": "Clipping", - "@audioAnalysisClipping": { - "description": "Clipping metric label" - }, - "audioAnalysisNoClipping": "No clipping", - "@audioAnalysisNoClipping": { - "description": "Displayed when no clipped samples were detected" - }, - "audioAnalysisSpectralCutoff": "Spectral Cutoff", - "@audioAnalysisSpectralCutoff": { - "description": "Estimated spectral cutoff metric label" - }, - "audioAnalysisChannelStats": "Per-channel Stats", - "@audioAnalysisChannelStats": { - "description": "Per-channel audio analysis section label" - }, - "audioAnalysisSamples": "Samples", - "@audioAnalysisSamples": { - "description": "Total samples metric label" - }, - "audioAnalysisRescan": "Re-analyze", - "@audioAnalysisRescan": { - "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" - }, - "audioAnalysisRescanning": "Re-analyzing audio...", - "@audioAnalysisRescanning": { - "description": "Loading text while audio is being re-analyzed after an explicit refresh" - }, - "extensionsHomeFeedProvider": "Home Feed Provider", - "@extensionsHomeFeedProvider": { - "description": "Extensions page - label for home feed provider selector" - }, - "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", - "@extensionsHomeFeedDescription": { - "description": "Extensions page - description for home feed provider picker" - }, - "extensionsHomeFeedAuto": "Auto", - "@extensionsHomeFeedAuto": { - "description": "Label for auto-selected search provider" - }, - "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", - "@extensionsHomeFeedAutoSubtitle": { - "description": "Extensions page - subtitle for auto home feed option" - }, - "extensionsHomeFeedOff": "Off", - "@extensionsHomeFeedOff": { - "description": "Extensions page - home feed provider option: off" - }, - "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", - "@extensionsHomeFeedOffSubtitle": { - "description": "Extensions page - subtitle for off home feed option" - }, - "extensionsHomeFeedUse": "Use {extensionName} home feed", - "@extensionsHomeFeedUse": { - "description": "Extensions page - subtitle for a specific extension home feed option", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "extensionsNoHomeFeedExtensions": "No extensions with home feed", - "@extensionsNoHomeFeedExtensions": { - "description": "Extensions page - shown when no installed extension has home feed" - }, - "cancelDownloadTitle": "Cancel download?", - "@cancelDownloadTitle": { - "description": "Dialog title when confirming cancellation of an active download" - }, - "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", - "@cancelDownloadContent": { - "description": "Dialog body when confirming cancellation of an active download", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "cancelDownloadKeep": "Keep", - "@cancelDownloadKeep": { - "description": "Dialog button - keep the active download (do not cancel)" - }, - "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", - "@metadataSaveFailedFfmpeg": { - "description": "Snackbar error when FFmpeg fails to write metadata" - }, - "metadataSaveFailedStorage": "Failed to write metadata back to storage", - "@metadataSaveFailedStorage": { - "description": "Snackbar error when writing metadata file back to storage fails" - }, - "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", - "@snackbarFolderPickerFailed": { - "description": "Snackbar shown when folder picker fails to open", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "notifDownloadingTrack": "Downloading {trackName}", - "@notifDownloadingTrack": { - "description": "Notification title while downloading a track", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "notifFinalizingTrack": "Finalizing {trackName}", - "@notifFinalizingTrack": { - "description": "Notification title while finalizing (embedding metadata) a track", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "notifEmbeddingMetadata": "Embedding metadata...", - "@notifEmbeddingMetadata": { - "description": "Notification body while embedding metadata into a downloaded track" - }, - "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", - "@notifAlreadyInLibraryCount": { - "description": "Notification title when track is already in library, with count", - "placeholders": { - "completed": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "notifAlreadyInLibrary": "Already in Library", - "@notifAlreadyInLibrary": { - "description": "Notification title when track is already in library" - }, - "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", - "@notifDownloadCompleteCount": { - "description": "Notification title when download is complete, with count", - "placeholders": { - "completed": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "notifDownloadComplete": "Download Complete", - "@notifDownloadComplete": { - "description": "Notification title when a single download is complete" - }, - "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", - "@notifDownloadsFinished": { - "description": "Notification title when queue finishes with some failures", - "placeholders": { - "completed": { - "type": "int" - }, - "failed": { - "type": "int" - } - } - }, - "notifAllDownloadsComplete": "All Downloads Complete", - "@notifAllDownloadsComplete": { - "description": "Notification title when all downloads finish successfully" - }, - "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", - "@notifTracksDownloadedSuccess": { - "description": "Notification body for queue complete - how many tracks were downloaded", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", - "@notifDownloadsFinishedBody": { - "description": "Notification body when queue finishes with failures", - "placeholders": { - "completed": { - "type": "int" - }, - "failed": { - "type": "int" - } - } - }, - "notifDownloadsCanceledTitle": "Downloads canceled", - "@notifDownloadsCanceledTitle": { - "description": "Notification title when downloads are canceled by the user" - }, - "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", - "@notifDownloadsCanceledBody": { - "description": "Notification body when downloads are canceled by the user", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifScanningLibrary": "Scanning local library", - "@notifScanningLibrary": { - "description": "Notification title while scanning local library" - }, - "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", - "@notifLibraryScanProgressWithTotal": { - "description": "Notification body for library scan progress when total is known", - "placeholders": { - "scanned": { - "type": "int" - }, - "total": { - "type": "int" - }, - "percentage": { - "type": "int" - } - } - }, - "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", - "@notifLibraryScanProgressNoTotal": { - "description": "Notification body for library scan progress when total is unknown", - "placeholders": { - "scanned": { - "type": "int" - }, - "percentage": { - "type": "int" - } - } - }, - "notifLibraryScanComplete": "Library scan complete", - "@notifLibraryScanComplete": { - "description": "Notification title when library scan finishes" - }, - "notifLibraryScanCompleteBody": "{count} tracks indexed", - "@notifLibraryScanCompleteBody": { - "description": "Notification body for library scan complete - number of indexed tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanExcluded": "{count} excluded", - "@notifLibraryScanExcluded": { - "description": "Library scan complete suffix - excluded track count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanErrors": "{count} errors", - "@notifLibraryScanErrors": { - "description": "Library scan complete suffix - error count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "notifLibraryScanFailed": "Library scan failed", - "@notifLibraryScanFailed": { - "description": "Notification title when library scan fails" - }, - "notifLibraryScanCancelled": "Library scan cancelled", - "@notifLibraryScanCancelled": { - "description": "Notification title when library scan is cancelled by the user" - }, - "notifLibraryScanStopped": "Scan stopped before completion.", - "@notifLibraryScanStopped": { - "description": "Notification body when library scan is cancelled" - }, - "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", - "@notifDownloadingUpdate": { - "description": "Notification title while downloading an app update", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "notifUpdateProgress": "{received} / {total} MB • {percentage}%", - "@notifUpdateProgress": { - "description": "Notification body showing update download progress", - "placeholders": { - "received": { - "type": "String" - }, - "total": { - "type": "String" - }, - "percentage": { - "type": "int" - } - } - }, - "notifUpdateReady": "Update Ready", - "@notifUpdateReady": { - "description": "Notification title when app update download is complete" - }, - "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", - "@notifUpdateReadyBody": { - "description": "Notification body when app update is ready to install", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "notifUpdateFailed": "Update Failed", - "@notifUpdateFailed": { - "description": "Notification title when app update download fails" - }, - "notifUpdateFailedBody": "Could not download update. Try again later.", - "@notifUpdateFailedBody": { - "description": "Notification body when app update download fails" - }, - "searchTracks": "Tracks", - "@searchTracks": { - "description": "Search filter label - tracks" - }, - "homeSearchHintDefault": "Paste supported URL or search...", - "@homeSearchHintDefault": { - "description": "Default placeholder for the main search field on Home" - }, - "homeSearchHintProvider": "Search with {providerName}...", - "@homeSearchHintProvider": { - "description": "Placeholder for the main search field when a provider is selected", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, - "homeImportCsvTooltip": "Import CSV", - "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" - }, - "homeChangeSearchProviderTooltip": "Change search provider", - "@homeChangeSearchProviderTooltip": { - "description": "Tooltip for the Home search provider picker" - }, - "actionPaste": "Paste", - "@actionPaste": { - "description": "Generic action - paste from clipboard" - }, - "tutorialSearchHint": "Paste or search...", - "@tutorialSearchHint": { - "description": "Placeholder shown in the tutorial search demo" - }, - "tutorialDownloadCompletedSemantics": "Download completed", - "@tutorialDownloadCompletedSemantics": { - "description": "Accessibility label for completed download state in tutorial demo" - }, - "tutorialDownloadInProgressSemantics": "Download in progress", - "@tutorialDownloadInProgressSemantics": { - "description": "Accessibility label for active download state in tutorial demo" - }, - "tutorialStartDownloadSemantics": "Start download", - "@tutorialStartDownloadSemantics": { - "description": "Accessibility label for idle download button in tutorial demo" - }, - "optionsEmbedMetadata": "Embed Metadata", - "@optionsEmbedMetadata": { - "description": "Settings toggle title for writing metadata into downloaded files" - }, - "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", - "@optionsEmbedMetadataSubtitleOn": { - "description": "Subtitle when metadata embedding is enabled" - }, - "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", - "@optionsEmbedMetadataSubtitleOff": { - "description": "Subtitle when metadata embedding is disabled" - }, - "trackCoverNoEmbeddedArt": "No embedded album art found", - "@trackCoverNoEmbeddedArt": { - "description": "Message shown when a track file has no embedded cover art" - }, - "trackCoverReplace": "Replace Cover", - "@trackCoverReplace": { - "description": "Button label for replacing selected cover art" - }, - "trackCoverPick": "Pick Cover", - "@trackCoverPick": { - "description": "Button label for selecting cover art" - }, - "trackCoverClearSelected": "Clear selected cover", - "@trackCoverClearSelected": { - "description": "Tooltip for clearing the newly selected cover art" - }, - "trackCoverCurrent": "Current cover", - "@trackCoverCurrent": { - "description": "Label for the currently embedded cover preview" - }, - "trackCoverSelected": "Selected cover", - "@trackCoverSelected": { - "description": "Label for the newly selected cover preview" - }, - "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", - "@trackCoverReplaceNotice": { - "description": "Notice shown when a new cover has been selected but not saved yet" - }, - "actionStop": "Stop", - "@actionStop": { - "description": "Generic action - stop" - }, - "queueFinalizingDownload": "Finalizing download", - "@queueFinalizingDownload": { - "description": "Accessibility label for a queue item that is finalizing" - }, - "queueDownloadedFileMissing": "Downloaded file missing", - "@queueDownloadedFileMissing": { - "description": "Accessibility label when a downloaded file is missing from disk" - }, - "queueDownloadCompleted": "Download completed", - "@queueDownloadCompleted": { - "description": "Accessibility label for completed download state in queue" - }, - "queueRateLimitTitle": "Service rate limited", - "@queueRateLimitTitle": { - "description": "Title shown on a failed queue item when the download service rate limits requests" - }, - "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", - "@queueRateLimitMessage": { - "description": "Explanation shown on a failed queue item when the download service rate limits requests" - }, - "appearanceSelectAccentColor": "Select accent color {hex}", - "@appearanceSelectAccentColor": { - "description": "Accessibility label for picking an accent color", - "placeholders": { - "hex": { - "type": "String" - } - } - }, - "logAutoScrollOn": "Auto-scroll ON", - "@logAutoScrollOn": { - "description": "Tooltip when auto-scroll is enabled on the log screen" - }, - "logAutoScrollOff": "Auto-scroll OFF", - "@logAutoScrollOff": { - "description": "Tooltip when auto-scroll is disabled on the log screen" - }, - "logCopyLogs": "Copy logs", - "@logCopyLogs": { - "description": "Tooltip for copying logs" - }, - "logClearSearch": "Clear search", - "@logClearSearch": { - "description": "Tooltip for clearing the log search field" - }, - "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", - "@logIssueIspBlockingLabel": { - "description": "Diagnostic badge label when ISP blocking is detected" - }, - "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", - "@logIssueIspBlockingDescription": { - "description": "Diagnostic badge description for ISP blocking" - }, - "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", - "@logIssueIspBlockingSuggestion": { - "description": "Diagnostic badge suggestion for ISP blocking" - }, - "logIssueRateLimitedLabel": "RATE LIMITED", - "@logIssueRateLimitedLabel": { - "description": "Diagnostic badge label when the service rate limits requests" - }, - "logIssueRateLimitedDescription": "Too many requests to the service", - "@logIssueRateLimitedDescription": { - "description": "Diagnostic badge description for rate limiting" - }, - "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", - "@logIssueRateLimitedSuggestion": { - "description": "Diagnostic badge suggestion for rate limiting" - }, - "logIssueNetworkErrorLabel": "NETWORK ERROR", - "@logIssueNetworkErrorLabel": { - "description": "Diagnostic badge label for generic network errors" - }, - "logIssueNetworkErrorDescription": "Connection issues detected", - "@logIssueNetworkErrorDescription": { - "description": "Diagnostic badge description for generic network errors" - }, - "logIssueNetworkErrorSuggestion": "Check your internet connection", - "@logIssueNetworkErrorSuggestion": { - "description": "Diagnostic badge suggestion for generic network errors" - }, - "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", - "@logIssueTrackNotFoundLabel": { - "description": "Diagnostic badge label when a track is unavailable" - }, - "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", - "@logIssueTrackNotFoundDescription": { - "description": "Diagnostic badge description when a track is unavailable" - }, - "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", - "@logIssueTrackNotFoundSuggestion": { - "description": "Diagnostic badge suggestion when a track is unavailable" - }, - "clickableLookingUpArtist": "Looking up artist...", - "@clickableLookingUpArtist": { - "description": "Snackbar shown while clickable artist metadata is being resolved" - }, - "clickableInformationUnavailable": "{type} information not available", - "@clickableInformationUnavailable": { - "description": "Snackbar shown when clickable metadata cannot open a destination", - "placeholders": { - "type": { - "type": "String" - } - } - }, - "extensionDetailsTags": "Tags", - "@extensionDetailsTags": { - "description": "Section title for extension tags" - }, - "extensionDetailsInformation": "Information", - "@extensionDetailsInformation": { - "description": "Section title for extension metadata information" - }, - "extensionUtilityFunctions": "Utility Functions", - "@extensionUtilityFunctions": { - "description": "Capability label for utility-only extensions" - }, - "actionDismiss": "Dismiss", - "@actionDismiss": { - "description": "Generic action - dismiss" - }, - "setupChangeFolderTooltip": "Change folder", - "@setupChangeFolderTooltip": { - "description": "Tooltip for editing the selected download folder" - }, - "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", - "@a11yOpenTrackByArtist": { - "description": "Accessibility label for opening a track item", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "a11yOpenItem": "Open {itemType} {name}", - "@a11yOpenItem": { - "description": "Accessibility label for opening a generic item", - "placeholders": { - "itemType": { - "type": "String" - }, - "name": { - "type": "String" - } - } - }, - "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", - "@a11yOpenItemCount": { - "description": "Accessibility label for opening a grouped item with count", - "placeholders": { - "title": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", - "@a11yOpenAlbumByArtistTrackCount": { - "description": "Accessibility label for opening an album item with track count", - "placeholders": { - "albumName": { - "type": "String" - }, - "artistName": { - "type": "String" - }, - "trackCount": { - "type": "int" - } - } - }, - "a11yTrackByArtist": "{trackName} by {artistName}", - "@a11yTrackByArtist": { - "description": "Accessibility label for a queue or list track item", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "a11ySelectAlbum": "Select album {albumName}", - "@a11ySelectAlbum": { - "description": "Accessibility label for selecting an album", - "placeholders": { - "albumName": { - "type": "String" - } - } - }, - "a11yOpenAlbum": "Open album {albumName}", - "@a11yOpenAlbum": { - "description": "Accessibility label for opening an album", - "placeholders": { - "albumName": { - "type": "String" - } - } - }, - "settingsFiles": "Files & Folders", - "@settingsFiles": { - "description": "Settings menu item - file and folder settings" - }, - "settingsFilesSubtitle": "Download location, filename, folder structure", - "@settingsFilesSubtitle": { - "description": "Subtitle for files & folders settings" - }, - "settingsMetadata": "Metadata", - "@settingsMetadata": { - "description": "Settings menu item - metadata settings" - }, - "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", - "@settingsMetadataSubtitle": { - "description": "Subtitle for metadata settings" - }, - "settingsLyrics": "Lyrics", - "@settingsLyrics": { - "description": "Settings menu item - lyrics settings" - }, - "settingsLyricsSubtitle": "Embed, mode, providers, language options", - "@settingsLyricsSubtitle": { - "description": "Subtitle for lyrics settings" - }, - "settingsApp": "App", - "@settingsApp": { - "description": "Settings menu item - app settings" - }, - "settingsAppSubtitle": "Updates, data, extension repo, debug", - "@settingsAppSubtitle": { - "description": "Subtitle for app settings" - }, - "sectionMetadataProviders": "Providers", - "@sectionMetadataProviders": { - "description": "Settings section header for metadata providers" - }, - "sectionDuplicates": "Duplicates", - "@sectionDuplicates": { - "description": "Settings section header for deduplication" - }, - "sectionLyricsProviderOptions": "Provider Options", - "@sectionLyricsProviderOptions": { - "description": "Settings section header for per-provider lyrics options" - }, - "metadataProvidersTitle": "Metadata Provider Priority", - "@metadataProvidersTitle": { - "description": "Settings item title for metadata provider order" - }, - "metadataProvidersSubtitle": "Drag to set search and metadata source order", - "@metadataProvidersSubtitle": { - "description": "Subtitle for metadata provider priority item" - }, - "downloadDeduplication": "Skip Duplicate Downloads", - "@downloadDeduplication": { - "description": "Setting - skip tracks already in download history" - }, - "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", - "@downloadDeduplicationEnabled": { - "description": "Subtitle when deduplication is on" - }, - "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", - "@downloadDeduplicationDisabled": { - "description": "Subtitle when deduplication is off" - }, - "downloadFallbackExtensions": "Fallback Extensions", - "@downloadFallbackExtensions": { - "description": "Settings item for configuring fallback extension providers" - }, - "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", - "@downloadFallbackExtensionsSubtitle": { - "description": "Subtitle for fallback extensions item" - }, - "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", - "@editMetadataFieldDateHint": { - "description": "Hint text for the edit metadata date field" - }, - "editMetadataFieldTrackTotal": "Track Total", - "@editMetadataFieldTrackTotal": { - "description": "Label for total tracks field in the edit metadata sheet" - }, - "editMetadataFieldDiscTotal": "Disc Total", - "@editMetadataFieldDiscTotal": { - "description": "Label for total discs field in the edit metadata sheet" - }, - "editMetadataFieldComposer": "Composer", - "@editMetadataFieldComposer": { - "description": "Label for composer field in the edit metadata sheet" - }, - "editMetadataFieldComment": "Comment", - "@editMetadataFieldComment": { - "description": "Label for comment field in the edit metadata sheet" - }, - "editMetadataAdvanced": "Advanced", - "@editMetadataAdvanced": { - "description": "Expandable section label for advanced metadata fields" - }, - "libraryFilterMetadataMissingTrackNumber": "Missing track number", - "@libraryFilterMetadataMissingTrackNumber": { - "description": "Filter option - items missing track number" - }, - "libraryFilterMetadataMissingDiscNumber": "Missing disc number", - "@libraryFilterMetadataMissingDiscNumber": { - "description": "Filter option - items missing disc number" - }, - "libraryFilterMetadataMissingArtist": "Missing artist", - "@libraryFilterMetadataMissingArtist": { - "description": "Filter option - items missing artist" - }, - "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", - "@libraryFilterMetadataIncorrectIsrcFormat": { - "description": "Filter option - items with an invalid ISRC format" - }, - "libraryFilterMetadataMissingLabel": "Missing label", - "@libraryFilterMetadataMissingLabel": { - "description": "Filter option - items missing record label" - }, - "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", - "@collectionDeletePlaylistsMessage": { - "description": "Confirmation message for deleting selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", - "@collectionPlaylistsDeleted": { - "description": "Snackbar after deleting selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", - "@collectionAddedTracksToPlaylist": { - "description": "Snackbar after adding multiple tracks to a playlist", - "placeholders": { - "count": { - "type": "int" - }, - "playlistName": { - "type": "String" - } - } - }, - "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", - "@collectionAddedTracksToPlaylistWithExisting": { - "description": "Snackbar after adding multiple tracks to a playlist when some were already present", - "placeholders": { - "count": { - "type": "int" - }, - "playlistName": { - "type": "String" - }, - "alreadyCount": { - "type": "int" - } - } - }, - "itemCount": "{count} {count, plural, =1{item} other{items}}", - "@itemCount": { - "description": "Generic item count label", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", - "@trackReEnrichSuccessWithFailures": { - "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", - "placeholders": { - "successCount": { - "type": "int" - }, - "total": { - "type": "int" - }, - "failedCount": { - "type": "int" - } - } - }, - "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", - "@selectionDeleteTracksCount": { - "description": "Button label for deleting selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", - "@queueDownloadSpeedStatus": { - "description": "Queue status while downloading with speed", - "placeholders": { - "speed": { - "type": "String" - } - } - }, - "queueDownloadStarting": "Starting...", - "@queueDownloadStarting": { - "description": "Queue status before download progress is available" - }, - "a11ySelectTrack": "Select track", - "@a11ySelectTrack": { - "description": "Accessibility label for selecting a track" - }, - "a11yDeselectTrack": "Deselect track", - "@a11yDeselectTrack": { - "description": "Accessibility label for deselecting a track" - }, - "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", - "@a11yPlayTrackByArtist": { - "description": "Accessibility label for playing a local library track", - "placeholders": { - "trackName": { - "type": "String" - }, - "artistName": { - "type": "String" - } - } - }, - "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", - "@storeExtensionsCount": { - "description": "Store extension result count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "storeRequiresVersion": "Requires v{version}+", - "@storeRequiresVersion": { - "description": "Store compatibility badge for minimum app version", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "actionGo": "Go", - "@actionGo": { - "description": "Generic action button label" - }, - "logIssueSummary": "Issue Summary", - "@logIssueSummary": { - "description": "Header for log issue analysis summary" - }, - "logTotalErrors": "Total errors: {count}", - "@logTotalErrors": { - "description": "Total error count in log issue analysis", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "logAffectedDomains": "Affected: {domains}", - "@logAffectedDomains": { - "description": "Affected domains in log issue analysis", - "placeholders": { - "domains": { - "type": "String" - } - } - }, - "libraryScanCancelled": "Scan cancelled", - "@libraryScanCancelled": { - "description": "Library scan status when a scan was cancelled" - }, - "libraryScanCancelledSubtitle": "You can retry the scan when ready.", - "@libraryScanCancelledSubtitle": { - "description": "Library scan status subtitle after cancellation" - }, - "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", - "@libraryDownloadsHistoryExcluded": { - "description": "Library count note for downloaded history items excluded from the local list", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadNativeWorker": "Native download worker", - "@downloadNativeWorker": { - "description": "Setting title for Android native download worker" - }, - "downloadNativeWorkerSubtitle": "用於擴充功能下載的 Android 背景服務", - "@downloadNativeWorkerSubtitle": { - "description": "Setting subtitle for Android native download worker" - }, - "badgeBeta": "BETA", - "@badgeBeta": { - "description": "Badge label for beta features" - }, - "extensionServiceStatus": "Service Status", - "@extensionServiceStatus": { - "description": "Extension detail section header for service status" - }, - "extensionServiceHealth": "Service health", - "@extensionServiceHealth": { - "description": "Extension capability label for service health checks" - }, - "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", - "@extensionHealthChecksConfigured": { - "description": "Extension service health check count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", - "@extensionOauthConnectHint": { - "description": "Hint for an OAuth login link field before connecting Spotify" - }, - "extensionLastChecked": "Last checked {time}", - "@extensionLastChecked": { - "description": "Timestamp for the latest extension service health check", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "extensionRefreshStatus": "Refresh status", - "@extensionRefreshStatus": { - "description": "Tooltip for refreshing extension service health status" - }, - "extensionCustomUrlHandling": "Custom URL Handling", - "@extensionCustomUrlHandling": { - "description": "Extension detail section title for custom URL handling" - }, - "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", - "@extensionCustomUrlHandlingSubtitle": { - "description": "Extension detail subtitle for custom URL handling" - }, - "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", - "@extensionCustomUrlHandlingShareHint": { - "description": "Extension detail hint explaining share-to-app URL handling" - }, - "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", - "@extensionSettingsCount": { - "description": "Count of settings exposed by an extension quality option", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionHealthOnline": "Online", - "@extensionHealthOnline": { - "description": "Extension service health status - online" - }, - "extensionHealthDegraded": "Degraded", - "@extensionHealthDegraded": { - "description": "Extension service health status - degraded" - }, - "extensionHealthOffline": "Offline", - "@extensionHealthOffline": { - "description": "Extension service health status - offline" - }, - "extensionHealthNotConfigured": "Not configured", - "@extensionHealthNotConfigured": { - "description": "Extension service health status - not configured" - }, - "extensionHealthUnknown": "Unknown", - "@extensionHealthUnknown": { - "description": "Extension service health status - unknown" - }, - "extensionHealthRequired": "required", - "@extensionHealthRequired": { - "description": "Label for a required extension service health check" - }, - "extensionSettingNotSet": "Not set", - "@extensionSettingNotSet": { - "description": "Value shown when an extension setting has no value" - }, - "extensionActionFailed": "Action failed", - "@extensionActionFailed": { - "description": "Fallback error when an extension action fails without details" - }, - "extensionEnterValue": "Enter value", - "@extensionEnterValue": { - "description": "Hint for editing an extension setting value" - }, - "extensionHealthServiceOnline": "Service online", - "@extensionHealthServiceOnline": { - "description": "Tooltip for online extension service" - }, - "extensionHealthServiceDegraded": "Service degraded", - "@extensionHealthServiceDegraded": { - "description": "Tooltip for degraded extension service" - }, - "extensionHealthServiceOffline": "Service offline", - "@extensionHealthServiceOffline": { - "description": "Tooltip for offline extension service" - }, - "extensionHealthServiceUnknown": "Service status unknown", - "@extensionHealthServiceUnknown": { - "description": "Tooltip for unknown extension service health" - }, - "audioAnalysisStereo": "Stereo", - "@audioAnalysisStereo": { - "description": "Audio channel layout label - stereo" - }, - "audioAnalysisMono": "Mono", - "@audioAnalysisMono": { - "description": "Audio channel layout label - mono" - }, - "trackOpenInService": "Open in {serviceName}", - "@trackOpenInService": { - "description": "Button label to open a track in a named music service", - "placeholders": { - "serviceName": { - "type": "String" - } - } - }, - "trackLyricsEmbeddedSource": "Embedded", - "@trackLyricsEmbeddedSource": { - "description": "Lyrics source label for embedded lyrics" - }, - "unknownAlbum": "Unknown Album", - "@unknownAlbum": { - "description": "Fallback album name when metadata is missing" - }, - "unknownArtist": "Unknown Artist", - "@unknownArtist": { - "description": "Fallback artist name when metadata is missing" - }, - "permissionAudio": "Audio", - "@permissionAudio": { - "description": "Audio permission type label" - }, - "permissionStorage": "Storage", - "@permissionStorage": { - "description": "Storage permission type label" - }, - "permissionNotification": "Notification", - "@permissionNotification": { - "description": "Notification permission type label" - }, - "errorInvalidFolderSelected": "Invalid folder selected", - "@errorInvalidFolderSelected": { - "description": "Error when the selected folder is invalid" - }, - "storeAnyVersion": "Any", - "@storeAnyVersion": { - "description": "Store detail value when any app version is accepted" - }, - "storeCategoryMetadata": "Metadata", - "@storeCategoryMetadata": { - "description": "Store extension category - metadata" - }, - "storeCategoryDownload": "Download", - "@storeCategoryDownload": { - "description": "Store extension category - download" - }, - "storeCategoryUtility": "Utility", - "@storeCategoryUtility": { - "description": "Store extension category - utility" - }, - "storeCategoryLyrics": "Lyrics", - "@storeCategoryLyrics": { - "description": "Store extension category - lyrics" - }, - "storeCategoryIntegration": "Integration", - "@storeCategoryIntegration": { - "description": "Store extension category - integration" - }, - "artistReleases": "Releases", - "@artistReleases": { - "description": "Section header for all artist releases" - }, - "editMetadataSelectNone": "None", - "@editMetadataSelectNone": { - "description": "Button to clear selected fields for auto-fill" - }, - "queueRetryAllFailed": "Retry {count} failed", - "@queueRetryAllFailed": { - "description": "Button to retry every failed download in the queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "settingsSaveDownloadHistory": "Save download history", - "@settingsSaveDownloadHistory": { - "description": "Settings switch title for storing completed downloads in history" - }, - "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", - "@settingsSaveDownloadHistorySubtitle": { - "description": "Settings switch subtitle for storing completed downloads in history" - }, - "dialogDisableHistoryTitle": "Turn off download history?", - "@dialogDisableHistoryTitle": { - "description": "Confirmation dialog title shown before disabling download history" - }, - "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", - "@dialogDisableHistoryMessage": { - "description": "Confirmation dialog message shown before disabling download history" - }, - "dialogDisableAndClear": "Turn off and clear", - "@dialogDisableAndClear": { - "description": "Confirmation action to disable download history and clear existing entries" - }, - "openInOtherServices": "Open in Other Services", - "@openInOtherServices": { - "description": "Title and tooltip for finding the current collection in other services" - }, - "shareSheetNoExtensions": "No other compatible services", - "@shareSheetNoExtensions": { - "description": "Empty state when no extensions can be searched for cross-service links" - }, - "shareSheetNotFound": "Not found", - "@shareSheetNotFound": { - "description": "Cross-service share sheet row subtitle when a service has no match" - }, - "shareSheetCopyLink": "Copy Link", - "@shareSheetCopyLink": { - "description": "Tooltip for copying a cross-service link" - }, - "shareSheetLinkCopied": "{service} link copied", - "@shareSheetLinkCopied": { - "description": "Snackbar after copying a cross-service link", - "placeholders": { - "service": {} - } - }, - "libraryPlayback": "Playback", - "@libraryPlayback": { - "description": "Section header for playback settings in library settings" - }, - "libraryExternalPlayer": "External player", - "@libraryExternalPlayer": { - "description": "Setting option to use an external music player" - }, - "libraryExternalPlayerSubtitle": "Recommended for listening, best quality, gapless playback, EQ, and wider format support", - "@libraryExternalPlayerSubtitle": { - "description": "Subtitle for external player option" - }, - "libraryBuiltInPreviewPlayer": "Built-in preview player", - "@libraryBuiltInPreviewPlayer": { - "description": "Setting option to use the built-in preview player" - }, - "libraryBuiltInPreviewPlayerSubtitle": "Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening", - "@libraryBuiltInPreviewPlayerSubtitle": { - "description": "Subtitle for built-in preview player option" - }, - "libraryBuiltInPlayerInfo": "The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.", - "@libraryBuiltInPlayerInfo": { - "description": "Info note explaining the built-in player is for previews only" - }, - "nowPlayingTitle": "Now Playing", - "@nowPlayingTitle": { - "description": "Title for the now playing screen" - }, - "nowPlayingNothingPlaying": "Nothing is playing", - "@nowPlayingNothingPlaying": { - "description": "Empty state when no track is currently playing" - }, - "nowPlayingMinimize": "Minimize", - "@nowPlayingMinimize": { - "description": "Tooltip for minimizing the now playing screen" - }, - "nowPlayingUpNext": "Up next", - "@nowPlayingUpNext": { - "description": "Title for the playback queue sheet" - }, - "nowPlayingDetails": "Details", - "@nowPlayingDetails": { - "description": "Menu item and section title for track metadata details" - }, - "nowPlayingOpenInExternalPlayer": "Open in external player", - "@nowPlayingOpenInExternalPlayer": { - "description": "Menu item to open the current track in an external player" - }, - "nowPlayingTabPlayer": "Player", - "@nowPlayingTabPlayer": { - "description": "Tab label for the player view" - }, - "nowPlayingTabLyrics": "Lyrics", - "@nowPlayingTabLyrics": { - "description": "Tab label for the lyrics view" - }, - "nowPlayingNoLyrics": "No lyrics in this file", - "@nowPlayingNoLyrics": { - "description": "Empty state when the playing file has no embedded lyrics" - }, - "nowPlayingLibraryEmpty": "Your library is empty", - "@nowPlayingLibraryEmpty": { - "description": "Snackbar when shuffle library is requested but library has no tracks" - }, - "nowPlayingShuffleLibraryFailed": "Could not shuffle library: {error}", - "@nowPlayingShuffleLibraryFailed": { - "description": "Snackbar when shuffling the library fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "nowPlayingShuffleOn": "Shuffle on", - "@nowPlayingShuffleOn": { - "description": "Tooltip when shuffle mode is enabled" - }, - "nowPlayingPlayInOrder": "Play in order", - "@nowPlayingPlayInOrder": { - "description": "Tooltip when shuffle mode is disabled" - }, - "nowPlayingShuffleLibrary": "Shuffle library", - "@nowPlayingShuffleLibrary": { - "description": "Button label to shuffle and play the entire local library" - }, - "nowPlayingQueueEmpty": "Queue is empty", - "@nowPlayingQueueEmpty": { - "description": "Empty state when the playback queue has no items" - }, - "nowPlayingNoMetadata": "No metadata available", - "@nowPlayingNoMetadata": { - "description": "Empty state when track metadata cannot be loaded" - }, - "announcementUnableToOpenLink": "Unable to open link. Please try again.", - "@announcementUnableToOpenLink": { - "description": "Snackbar shown when an announcement CTA link cannot be opened" - }, - "trackConvertLosslessOutputWithCap": "Lossless output with {quality} cap", - "@trackConvertLosslessOutputWithCap": { - "description": "Hint shown when lossless conversion will cap bit depth or sample rate", - "placeholders": { - "quality": { - "type": "String" - } - } - }, - "trackConvertConfirmMessageLosslessCapped": "Convert from {sourceFormat} to {targetFormat} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.", - "@trackConvertConfirmMessageLosslessCapped": { - "description": "Confirmation dialog message for capped lossless conversion of a single file", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "selectionBatchConvertConfirmMessageLosslessCapped": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessageLosslessCapped": { - "description": "Confirmation dialog message for capped lossless batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "trackConvertActionLabelLossless": "{sourceFormat} → {targetFormat} ({quality})", - "@trackConvertActionLabelLossless": { - "description": "Convert button label for lossless conversion with quality cap", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "quality": { - "type": "String" - } - } - }, - "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", - "@trackConvertActionLabelLossy": { - "description": "Convert button label for lossy conversion", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "aboutPaxsenixSubtitle": "Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius", - "@aboutPaxsenixSubtitle": { - "description": "Subtitle for Paxsenix special thanks entry on the about page" - }, - "snackbarPlayingNext": "Playing next", - "@snackbarPlayingNext": { - "description": "Snackbar when a track is inserted as the next queue item" - }, - "snackbarAddedToQueueGeneric": "Added to queue", - "@snackbarAddedToQueueGeneric": { - "description": "Snackbar when a track is added to the playback queue without naming it" - }, - "selectionDeletePlaylistsCount": "Delete {count} {count, plural, =1{playlist} other{playlists}}", - "@selectionDeletePlaylistsCount": { - "description": "Button label for deleting multiple selected playlists", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "actionShuffle": "Shuffle", - "@actionShuffle": { - "description": "Tooltip for shuffle playback action" - }, - "downloadPrimaryArtistOnlyOn": "Primary only: On", - "@downloadPrimaryArtistOnlyOn": { - "description": "Status label when primary-artist-only folder naming is enabled" - }, - "downloadPrimaryArtistOnlyOff": "Primary only: Off", - "@downloadPrimaryArtistOnlyOff": { - "description": "Status label when primary-artist-only folder naming is disabled" - }, - "downloadAlbumArtistMetadataPrimaryOnly": "Album Artist metadata: Primary only", - "@downloadAlbumArtistMetadataPrimaryOnly": { - "description": "Status label when album-artist folder filtering uses primary artist only" - }, - "downloadAlbumArtistMetadataFull": "Album Artist metadata: Full", - "@downloadAlbumArtistMetadataFull": { - "description": "Status label when album-artist folder filtering uses full metadata" - }, - "trackConvertOriginal": "Original", - "@trackConvertOriginal": { - "description": "Label for keeping original bit depth or sample rate during conversion" - }, - "trackConvertOriginalQuality": "Original quality", - "@trackConvertOriginalQuality": { - "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" - }, - "trackConvertLosslessSuffix": "Lossless", - "@trackConvertLosslessSuffix": { - "description": "Suffix used in converted lossless quality labels" - }, - "trackConvertDithering": "Dithering", - "@trackConvertDithering": { - "description": "Section label for lossless conversion dithering options" - }, - "trackConvertResampler": "Resampler", - "@trackConvertResampler": { - "description": "Section label for lossless conversion resampler options" - }, - "trackConvertDitherNone": "None", - "@trackConvertDitherNone": { - "description": "Lossless conversion dither option with no dithering applied" - }, - "trackConvertDitherTriangular": "TPDF", - "@trackConvertDitherTriangular": { - "description": "Lossless conversion triangular probability density function dither option" - }, - "trackConvertDitherTriangularHp": "Triangular HP", - "@trackConvertDitherTriangularHp": { - "description": "Lossless conversion high-pass triangular dither option" - }, - "trackConvertResamplerSwr": "SWR", - "@trackConvertResamplerSwr": { - "description": "Lossless conversion default FFmpeg swresample resampler option" - }, - "trackConvertResamplerSoxr": "SoXr", - "@trackConvertResamplerSoxr": { - "description": "Lossless conversion SoX resampler option" - }, - "updateSeeReleaseNotes": "See release notes for details.", - "@updateSeeReleaseNotes": { - "description": "Fallback changelog text when release notes cannot be parsed" - }, - "unknownTitle": "Unknown title", - "@unknownTitle": { - "description": "Fallback track title when metadata is missing" - }, - "trackPlayNext": "Play next", - "@trackPlayNext": { - "description": "Menu action to play a track as the next queue item" - }, - "trackAddToQueue": "Add to queue", - "@trackAddToQueue": { - "description": "Menu action to add a track to the playback queue" - }, - "snackbarExtensionInstalledEnable": "{extensionName} installed. Enable it in Settings > Extensions", - "@snackbarExtensionInstalledEnable": { - "description": "Snackbar after installing an extension from the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarExtensionUpdatedVersion": "{extensionName} updated to v{version}", - "@snackbarExtensionUpdatedVersion": { - "description": "Snackbar after updating an extension from the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - }, - "version": { - "type": "String" - } - } - }, - "snackbarFailedToInstallNamed": "Failed to install {extensionName}", - "@snackbarFailedToInstallNamed": { - "description": "Snackbar when extension install fails in the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarFailedToUpdateNamed": "Failed to update {extensionName}", - "@snackbarFailedToUpdateNamed": { - "description": "Snackbar when extension update fails in the repo tab", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "releaseTypeEp": "EP", - "@releaseTypeEp": { - "description": "Badge label for EP releases" - }, - "releaseTypeSingle": "Single", - "@releaseTypeSingle": { - "description": "Badge label for single releases" - }, - "trackCoverOnline": "Online cover", - "@trackCoverOnline": { - "description": "Label shown when metadata autofill downloaded cover art from the internet" - }, - "regionCountryUS": "United States", - "@regionCountryUS": { - "description": "Country name for SongLink region picker" - }, - "regionCountryGB": "United Kingdom", - "@regionCountryGB": { - "description": "Country name for SongLink region picker" - }, - "regionCountryFR": "France", - "@regionCountryFR": { - "description": "Country name for SongLink region picker" - }, - "regionCountryDE": "Germany", - "@regionCountryDE": { - "description": "Country name for SongLink region picker" - }, - "regionCountryJP": "Japan", - "@regionCountryJP": { - "description": "Country name for SongLink region picker" - }, - "regionCountryKR": "South Korea", - "@regionCountryKR": { - "description": "Country name for SongLink region picker" - }, - "regionCountryIN": "India", - "@regionCountryIN": { - "description": "Country name for SongLink region picker" - }, - "regionCountryID": "Indonesia", - "@regionCountryID": { - "description": "Country name for SongLink region picker" - }, - "regionCountryBR": "Brazil", - "@regionCountryBR": { - "description": "Country name for SongLink region picker" - }, - "regionCountryMX": "Mexico", - "@regionCountryMX": { - "description": "Country name for SongLink region picker" - }, - "regionCountryAU": "Australia", - "@regionCountryAU": { - "description": "Country name for SongLink region picker" - }, - "regionCountryCA": "Canada", - "@regionCountryCA": { - "description": "Country name for SongLink region picker" - }, - "regionCountryXK": "Kosovo", - "@regionCountryXK": { - "description": "Country name for SongLink region picker" - }, - "extensionVerificationBrowserTitle": "Verification browser", - "@extensionVerificationBrowserTitle": { - "description": "Settings option title for extension verification browser preference" - }, - "extensionVerificationBrowserSubtitleExternal": "Open challenges in the default browser first", - "@extensionVerificationBrowserSubtitleExternal": { - "description": "Subtitle when external browser is preferred for extension verification" - }, - "extensionVerificationBrowserSubtitleInApp": "Open challenges in the in-app browser first", - "@extensionVerificationBrowserSubtitleInApp": { - "description": "Subtitle when in-app browser is preferred for extension verification" - }, - "extensionVerificationBrowserExternal": "External", - "@extensionVerificationBrowserExternal": { - "description": "Chip label for external browser verification mode" - }, - "extensionVerificationBrowserInApp": "In-app", - "@extensionVerificationBrowserInApp": { - "description": "Chip label for in-app browser verification mode" - }, - "extensionVerificationHelpTitleManual": "Open verification manually", - "@extensionVerificationHelpTitleManual": { - "description": "Dialog title when automatic browser launch for verification fails" - }, - "extensionVerificationHelpTitleWaiting": "Verification still waiting", - "@extensionVerificationHelpTitleWaiting": { - "description": "Dialog title when verification is taking longer than expected" - }, - "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.", - "@extensionVerificationHelpMessageManual": { - "description": "Dialog message when automatic browser launch for verification fails" - }, - "extensionVerificationHelpMessageWaiting": "If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.", - "@extensionVerificationHelpMessageWaiting": { - "description": "Dialog message when verification may need manual browser help" - }, - "extensionVerificationClose": "Close", - "@extensionVerificationClose": { - "description": "Button to dismiss the extension verification help dialog" - }, - "extensionVerificationCopyLink": "Copy link", - "@extensionVerificationCopyLink": { - "description": "Button to copy the extension verification URL" - }, - "extensionVerificationLinkCopied": "Verification link copied", - "@extensionVerificationLinkCopied": { - "description": "Snackbar after copying the extension verification URL" - }, - "extensionVerificationOpenBrowser": "Open browser", - "@extensionVerificationOpenBrowser": { - "description": "Button to open the extension verification URL in a browser" - } -} diff --git a/lib/l10n/supported_locales.dart b/lib/l10n/supported_locales.dart index 36595c93..d70362d1 100644 --- a/lib/l10n/supported_locales.dart +++ b/lib/l10n/supported_locales.dart @@ -15,26 +15,26 @@ const int translationThreshold = 70; const List filteredSupportedLocales = [ Locale('en'), Locale('fr'), - Locale('de'), Locale('es', 'ES'), + Locale('de'), Locale('uk'), Locale('ru'), Locale('tr'), Locale('id'), - Locale('ja'), Locale('pt', 'PT'), + Locale('ja'), ]; /// Set of locale codes for quick lookup. const Set filteredLocaleCodes = { 'en', 'fr', - 'de', 'es_ES', + 'de', 'uk', 'ru', 'tr', 'id', - 'ja', 'pt_PT', + 'ja', }; diff --git a/lib/providers/playback_provider.dart b/lib/providers/playback_provider.dart index ef18d22f..2447cfc3 100644 --- a/lib/providers/playback_provider.dart +++ b/lib/providers/playback_provider.dart @@ -214,6 +214,11 @@ class PlaybackController extends Notifier { ); } + /// Public wrapper so non-playback features (e.g. M3U export) reuse the + /// same library+history file resolution. + Future> resolveTrackFilePaths(List tracks) => + _resolveTrackPaths(tracks); + List _orderedTracksFromStartIndex(List tracks, int startIndex) { final safeStart = startIndex.clamp(0, tracks.length - 1); if (safeStart == 0) { diff --git a/lib/screens/library_tracks_folder_screen.dart b/lib/screens/library_tracks_folder_screen.dart index 75749b0c..8f7983e0 100644 --- a/lib/screens/library_tracks_folder_screen.dart +++ b/lib/screens/library_tracks_folder_screen.dart @@ -2,11 +2,14 @@ import 'dart:io'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; +import 'package:share_plus/share_plus.dart' show ShareParams, SharePlus, XFile; import 'package:spotiflac_android/widgets/album_detail_header.dart'; import 'package:spotiflac_android/widgets/cached_cover_image.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:spotiflac_android/l10n/l10n.dart'; import 'package:spotiflac_android/models/track.dart'; +import 'package:spotiflac_android/services/m3u_playlist_service.dart'; +import 'package:spotiflac_android/utils/file_access.dart'; import 'package:spotiflac_android/providers/download_queue_provider.dart'; import 'package:spotiflac_android/providers/extension_provider.dart'; import 'package:spotiflac_android/providers/library_collections_provider.dart'; @@ -71,6 +74,59 @@ class _LibraryTracksFolderScreenState } } + /// Exports the collection as an .m3u8 shared via the system sheet. Tracks + /// without a resolvable local file are skipped; SAF entries are written + /// relative to the download tree root. + Future _exportAsM3u8( + BuildContext context, + String title, + List entries, + ) async { + final l10n = context.l10n; + final messenger = ScaffoldMessenger.of(context); + try { + final tracks = entries.map((e) => e.track).toList(growable: false); + final paths = await ref + .read(playbackProvider.notifier) + .resolveTrackFilePaths(tracks); + + final exportEntries = []; + for (var i = 0; i < tracks.length; i++) { + final path = paths[i]; + if (path == null || isCueVirtualPath(path)) continue; + final entryPath = M3uPlaylistService.exportPathFor(path); + if (entryPath == null) continue; + exportEntries.add(M3uExportEntry(track: tracks[i], path: entryPath)); + } + + if (exportEntries.isEmpty) { + messenger.showSnackBar( + SnackBar(content: Text(l10n.collectionExportM3uNone)), + ); + return; + } + + final file = await M3uPlaylistService.writeExportFile( + title, + M3uPlaylistService.buildM3u8Content(exportEntries), + ); + messenger.showSnackBar( + SnackBar( + content: Text( + l10n.collectionExportM3uDone(exportEntries.length, tracks.length), + ), + ), + ); + await SharePlus.instance.share( + ShareParams(files: [XFile(file.path)], text: title), + ); + } catch (_) { + messenger.showSnackBar( + SnackBar(content: Text(l10n.collectionExportM3uFailed)), + ); + } + } + IconData _modeIcon() { return switch (widget.mode) { LibraryTracksFolderMode.wishlist => Icons.bookmark, @@ -568,6 +624,23 @@ class _LibraryTracksFolderScreenState ) : null, appBarActions: [ + if (!isSelectionMode && entries.isNotEmpty) + IconButton( + tooltip: context.l10n.collectionExportM3u, + icon: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.black.withValues(alpha: 0.4), + shape: BoxShape.circle, + ), + child: const Icon( + Icons.ios_share, + color: Colors.white, + size: 20, + ), + ), + onPressed: () => _exportAsM3u8(context, title, entries), + ), if (isPlaylistMode && !isSelectionMode) ...[ IconButton( tooltip: context.l10n.collectionRenamePlaylist, diff --git a/lib/services/csv_import_service.dart b/lib/services/csv_import_service.dart index 18f5bee8..89f15395 100644 --- a/lib/services/csv_import_service.dart +++ b/lib/services/csv_import_service.dart @@ -1,6 +1,8 @@ import 'dart:io'; import 'package:file_picker/file_picker.dart'; +import 'package:path/path.dart' as p; import 'package:spotiflac_android/models/track.dart'; +import 'package:spotiflac_android/services/m3u_playlist_service.dart'; import 'package:spotiflac_android/services/platform_bridge.dart'; import 'package:spotiflac_android/utils/logger.dart'; @@ -14,13 +16,16 @@ class CsvImportService { try { final FilePickerResult? result = await FilePicker.pickFiles( type: FileType.custom, - allowedExtensions: ['csv'], + allowedExtensions: ['csv', 'm3u', 'm3u8'], ); if (result != null && result.files.single.path != null) { final file = File(result.files.single.path!); final content = await file.readAsString(); - final tracks = _parseCsv(content); + final extension = p.extension(file.path).toLowerCase(); + final tracks = (extension == '.m3u' || extension == '.m3u8') + ? M3uPlaylistService.parseM3u(content) + : _parseCsv(content); if (tracks.isNotEmpty) { return await _enrichTracksMetadata(tracks, onProgress: onProgress); @@ -28,7 +33,7 @@ class CsvImportService { return tracks; } } catch (e) { - _log.e('Error picking/parsing CSV: $e'); + _log.e('Error picking/parsing playlist file: $e'); } return []; } diff --git a/lib/services/m3u_playlist_service.dart b/lib/services/m3u_playlist_service.dart new file mode 100644 index 00000000..9ec34f6e --- /dev/null +++ b/lib/services/m3u_playlist_service.dart @@ -0,0 +1,149 @@ +import 'dart:io'; + +import 'package:path/path.dart' as p; +import 'package:path_provider/path_provider.dart'; +import 'package:spotiflac_android/models/track.dart'; +import 'package:spotiflac_android/utils/logger.dart'; + +final _log = AppLogger('M3uPlaylist'); + +class M3uExportEntry { + final Track track; + final String path; + + const M3uExportEntry({required this.track, required this.path}); +} + +class M3uPlaylistService { + /// Parses M3U/M3U8 content into tracks for the import pipeline. EXTINF + /// display text is split on the first " - " into artist and title; path + /// lines without EXTINF fall back to the file name stem. + static List parseM3u(String content) { + final tracks = []; + final lines = content.split(RegExp(r'\r\n|\r|\n')); + final baseId = DateTime.now().millisecondsSinceEpoch; + + int? pendingDuration; + String? pendingDisplay; + + for (final rawLine in lines) { + final line = rawLine.trim(); + if (line.isEmpty) continue; + + if (line.startsWith('#EXTINF:')) { + final body = line.substring('#EXTINF:'.length); + final commaIdx = body.indexOf(','); + if (commaIdx >= 0) { + final durationRaw = body.substring(0, commaIdx).split(' ').first; + pendingDuration = double.tryParse(durationRaw)?.round(); + pendingDisplay = body.substring(commaIdx + 1).trim(); + } + continue; + } + if (line.startsWith('#')) continue; + + var display = pendingDisplay; + if (display == null || display.isEmpty) { + display = p.basenameWithoutExtension(line).trim(); + } + + String artist = ''; + String title = display; + final splitIdx = display.indexOf(' - '); + if (splitIdx > 0) { + artist = display.substring(0, splitIdx).trim(); + title = display.substring(splitIdx + 3).trim(); + } + + if (title.isNotEmpty) { + final duration = pendingDuration ?? 0; + tracks.add( + Track( + id: 'm3u_${baseId}_${tracks.length}', + name: title, + artistName: artist.isEmpty ? 'Unknown Artist' : artist, + albumName: 'Unknown Album', + duration: duration > 0 ? duration : 0, + coverUrl: null, + ), + ); + } + pendingDuration = null; + pendingDisplay = null; + } + + _log.i('Parsed ${tracks.length} tracks from M3U'); + return tracks; + } + + /// Builds `#EXTM3U` content with one EXTINF line per entry. + static String buildM3u8Content(List entries) { + final buffer = StringBuffer('#EXTM3U\n'); + for (final entry in entries) { + final track = entry.track; + final duration = track.duration > 0 ? track.duration : -1; + final artist = track.artistName.trim(); + final display = artist.isEmpty + ? track.name + : '$artist - ${track.name}'; + buffer + ..write('#EXTINF:') + ..write(duration) + ..write(',') + ..writeln(display) + ..writeln(entry.path); + } + return buffer.toString(); + } + + /// Converts a resolved library file path into an M3U entry path. Plain + /// paths pass through unchanged; SAF document URIs become paths relative + /// to their tree root (so the .m3u8 resolves when placed in the download + /// folder). Returns null when a content URI carries no usable path. + static String? exportPathFor(String rawPath) { + final trimmed = rawPath.trim(); + if (trimmed.isEmpty) return null; + if (!trimmed.startsWith('content://')) return trimmed; + + try { + // Uri.pathSegments already percent-decodes each segment once. + final segments = Uri.parse(trimmed).pathSegments; + final docIdx = segments.indexOf('document'); + if (docIdx < 0 || docIdx + 1 >= segments.length) return null; + final docPath = segments[docIdx + 1]; + + final treeIdx = segments.indexOf('tree'); + if (treeIdx >= 0 && treeIdx + 1 < segments.length) { + final treeId = segments[treeIdx + 1]; + if (treeId.isNotEmpty && docPath.startsWith(treeId)) { + var relative = docPath.substring(treeId.length); + if (relative.startsWith('/')) relative = relative.substring(1); + if (relative.isNotEmpty) return relative; + } + } + + // No tree context: strip the storage prefix + // ("primary:Music/A/b.flac" -> "Music/A/b.flac"). + final colonIdx = docPath.indexOf(':'); + if (colonIdx >= 0 && colonIdx + 1 < docPath.length) { + return docPath.substring(colonIdx + 1); + } + return docPath.isEmpty ? null : docPath; + } catch (_) { + return null; + } + } + + /// Writes the playlist to a shareable temp file named after the playlist. + static Future writeExportFile(String playlistName, String content) async { + final dir = await getTemporaryDirectory(); + final safeName = playlistName + .replaceAll(RegExp(r'[\\/:*?"<>|]'), '_') + .trim(); + final file = File( + p.join(dir.path, '${safeName.isEmpty ? 'playlist' : safeName}.m3u8'), + ); + await file.writeAsString(content); + return file; + } +} diff --git a/test/m3u_playlist_service_test.dart b/test/m3u_playlist_service_test.dart new file mode 100644 index 00000000..5808ecbe --- /dev/null +++ b/test/m3u_playlist_service_test.dart @@ -0,0 +1,96 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:spotiflac_android/models/track.dart'; +import 'package:spotiflac_android/services/m3u_playlist_service.dart'; + +void main() { + group('parseM3u', () { + test('reads EXTINF duration, artist, and title', () { + final tracks = M3uPlaylistService.parseM3u(''' +#EXTM3U +#EXTINF:245,Daft Punk - Harder Better Faster Stronger +Daft Punk/Discovery/04 Harder Better Faster Stronger.flac +#EXTINF:-1,Solo Title Only +music/solo.flac +'''); + + expect(tracks, hasLength(2)); + expect(tracks[0].name, 'Harder Better Faster Stronger'); + expect(tracks[0].artistName, 'Daft Punk'); + expect(tracks[0].duration, 245); + expect(tracks[1].name, 'Solo Title Only'); + expect(tracks[1].artistName, 'Unknown Artist'); + expect(tracks[1].duration, 0); + }); + + test('falls back to the file name stem without EXTINF', () { + final tracks = M3uPlaylistService.parseM3u(''' +# a comment +Some Artist - Some Song.mp3 +'''); + + expect(tracks, hasLength(1)); + expect(tracks[0].artistName, 'Some Artist'); + expect(tracks[0].name, 'Some Song'); + }); + }); + + group('buildM3u8Content', () { + test('writes EXTM3U header and EXTINF entries', () { + final content = M3uPlaylistService.buildM3u8Content([ + M3uExportEntry( + track: Track( + id: 't1', + name: 'Song', + artistName: 'Artist', + albumName: 'Album', + duration: 200, + coverUrl: null, + ), + path: 'Artist/Album/Song.flac', + ), + ]); + + expect( + content, + '#EXTM3U\n#EXTINF:200,Artist - Song\nArtist/Album/Song.flac\n', + ); + }); + }); + + group('exportPathFor', () { + test('passes plain paths through', () { + expect( + M3uPlaylistService.exportPathFor('/storage/emulated/0/Music/a.flac'), + '/storage/emulated/0/Music/a.flac', + ); + }); + + test('makes SAF document URIs relative to their tree root', () { + expect( + M3uPlaylistService.exportPathFor( + 'content://com.android.externalstorage.documents/tree/' + 'primary%3AMusic/document/' + 'primary%3AMusic%2FArtist%2FAlbum%2Fsong.flac', + ), + 'Artist/Album/song.flac', + ); + }); + + test('strips the storage prefix without tree context', () { + expect( + M3uPlaylistService.exportPathFor( + 'content://com.android.externalstorage.documents/document/' + 'primary%3AMusic%2Fsong.flac', + ), + 'Music/song.flac', + ); + }); + + test('returns null for content URIs without a document path', () { + expect( + M3uPlaylistService.exportPathFor('content://media/external/audio/1'), + isNull, + ); + }); + }); +}