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, + ); + }); + }); +}