import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart' as intl;

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_zh.dart';

// ignore_for_file: type=lint

/// Callers can lookup localized strings with an instance of AppLocalizations
/// returned by `AppLocalizations.of(context)`.
///
/// Applications need to include `AppLocalizations.delegate()` in their app's
/// `localizationDelegates` list, and the locales they support in the app's
/// `supportedLocales` list. For example:
///
/// ```dart
/// import 'l10n/app_localizations.dart';
///
/// return MaterialApp(
///   localizationsDelegates: AppLocalizations.localizationsDelegates,
///   supportedLocales: AppLocalizations.supportedLocales,
///   home: MyApplicationHome(),
/// );
/// ```
///
/// ## Update pubspec.yaml
///
/// Please make sure to update your pubspec.yaml to include the following
/// packages:
///
/// ```yaml
/// dependencies:
///   # Internationalization support.
///   flutter_localizations:
///     sdk: flutter
///   intl: any # Use the pinned version from flutter_localizations
///
///   # Rest of dependencies
/// ```
///
/// ## iOS Applications
///
/// iOS applications define key application metadata, including supported
/// locales, in an Info.plist file that is built into the application bundle.
/// To configure the locales supported by your app, you’ll need to edit this
/// file.
///
/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
/// Then, in the Project Navigator, open the Info.plist file under the Runner
/// project’s Runner folder.
///
/// Next, select the Information Property List item, select Add Item from the
/// Editor menu, then select Localizations from the pop-up menu.
///
/// Select and expand the newly-created Localizations item then, for each
/// locale your application supports, add a new item and select the locale
/// you wish to add from the pop-up menu in the Value field. This list should
/// be consistent with the languages listed in the AppLocalizations.supportedLocales
/// property.
abstract class AppLocalizations {
  AppLocalizations(String locale)
    : localeName = intl.Intl.canonicalizedLocale(locale.toString());

  final String localeName;

  static AppLocalizations of(BuildContext context) {
    return Localizations.of<AppLocalizations>(context, AppLocalizations)!;
  }

  static const LocalizationsDelegate<AppLocalizations> delegate =
      _AppLocalizationsDelegate();

  /// A list of this localizations delegate along with the default localizations
  /// delegates.
  ///
  /// Returns a list of localizations delegates containing this delegate along with
  /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
  /// and GlobalWidgetsLocalizations.delegate.
  ///
  /// Additional delegates can be added by appending to this list in
  /// MaterialApp. This list does not have to be used at all if a custom list
  /// of delegates is preferred or required.
  static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
      <LocalizationsDelegate<dynamic>>[
        delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ];

  /// A list of this localizations delegate's supported locales.
  static const List<Locale> supportedLocales = <Locale>[
    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('zh'),
    Locale('zh', 'CN'),
    Locale('zh', 'TW'),
  ];

  /// App name - DO NOT TRANSLATE
  ///
  /// In en, this message translates to:
  /// **'SpotiFLAC'**
  String get appName;

  /// App description shown in about page
  ///
  /// In en, this message translates to:
  /// **'Download Spotify tracks in lossless quality from Tidal, Qobuz, and Amazon Music.'**
  String get appDescription;

  /// Bottom navigation - Home tab
  ///
  /// In en, this message translates to:
  /// **'Home'**
  String get navHome;

  /// Bottom navigation - Library tab
  ///
  /// In en, this message translates to:
  /// **'Library'**
  String get navLibrary;

  /// Bottom navigation - History tab (legacy)
  ///
  /// In en, this message translates to:
  /// **'History'**
  String get navHistory;

  /// Bottom navigation - Settings tab
  ///
  /// In en, this message translates to:
  /// **'Settings'**
  String get navSettings;

  /// Bottom navigation - Extension store tab
  ///
  /// In en, this message translates to:
  /// **'Store'**
  String get navStore;

  /// Home screen title
  ///
  /// In en, this message translates to:
  /// **'Home'**
  String get homeTitle;

  /// Placeholder text in search box
  ///
  /// In en, this message translates to:
  /// **'Paste Spotify URL or search...'**
  String get homeSearchHint;

  /// Placeholder when extension search is active
  ///
  /// In en, this message translates to:
  /// **'Search with {extensionName}...'**
  String homeSearchHintExtension(String extensionName);

  /// Subtitle shown below search box
  ///
  /// In en, this message translates to:
  /// **'Paste a Spotify link or search by name'**
  String get homeSubtitle;

  /// Info text about supported URL types
  ///
  /// In en, this message translates to:
  /// **'Supports: Track, Album, Playlist, Artist URLs'**
  String get homeSupports;

  /// Section header for recent searches
  ///
  /// In en, this message translates to:
  /// **'Recent'**
  String get homeRecent;

  /// History screen title
  ///
  /// In en, this message translates to:
  /// **'History'**
  String get historyTitle;

  /// Tab showing active downloads count
  ///
  /// In en, this message translates to:
  /// **'Downloading ({count})'**
  String historyDownloading(int count);

  /// Tab showing completed downloads
  ///
  /// In en, this message translates to:
  /// **'Downloaded'**
  String get historyDownloaded;

  /// Filter chip - show all items
  ///
  /// In en, this message translates to:
  /// **'All'**
  String get historyFilterAll;

  /// Filter chip - show albums only
  ///
  /// In en, this message translates to:
  /// **'Albums'**
  String get historyFilterAlbums;

  /// Filter chip - show singles only
  ///
  /// In en, this message translates to:
  /// **'Singles'**
  String get historyFilterSingles;

  /// Track count with plural form
  ///
  /// In en, this message translates to:
  /// **'{count, plural, =1{1 track} other{{count} tracks}}'**
  String historyTracksCount(int count);

  /// Album count with plural form
  ///
  /// In en, this message translates to:
  /// **'{count, plural, =1{1 album} other{{count} albums}}'**
  String historyAlbumsCount(int count);

  /// Empty state title
  ///
  /// In en, this message translates to:
  /// **'No download history'**
  String get historyNoDownloads;

  /// Empty state subtitle
  ///
  /// In en, this message translates to:
  /// **'Downloaded tracks will appear here'**
  String get historyNoDownloadsSubtitle;

  /// Empty state when filtering albums
  ///
  /// In en, this message translates to:
  /// **'No album downloads'**
  String get historyNoAlbums;

  /// Empty state subtitle for albums filter
  ///
  /// In en, this message translates to:
  /// **'Download multiple tracks from an album to see them here'**
  String get historyNoAlbumsSubtitle;

  /// Empty state when filtering singles
  ///
  /// In en, this message translates to:
  /// **'No single downloads'**
  String get historyNoSingles;

  /// Empty state subtitle for singles filter
  ///
  /// In en, this message translates to:
  /// **'Single track downloads will appear here'**
  String get historyNoSinglesSubtitle;

  /// Search bar placeholder in history
  ///
  /// In en, this message translates to:
  /// **'Search history...'**
  String get historySearchHint;

  /// Settings screen title
  ///
  /// In en, this message translates to:
  /// **'Settings'**
  String get settingsTitle;

  /// Settings section - download options
  ///
  /// In en, this message translates to:
  /// **'Download'**
  String get settingsDownload;

  /// Settings section - visual customization
  ///
  /// In en, this message translates to:
  /// **'Appearance'**
  String get settingsAppearance;

  /// Settings section - app options
  ///
  /// In en, this message translates to:
  /// **'Options'**
  String get settingsOptions;

  /// Settings section - extension management
  ///
  /// In en, this message translates to:
  /// **'Extensions'**
  String get settingsExtensions;

  /// Settings section - app info
  ///
  /// In en, this message translates to:
  /// **'About'**
  String get settingsAbout;

  /// Download settings page title
  ///
  /// In en, this message translates to:
  /// **'Download'**
  String get downloadTitle;

  /// Setting for download folder
  ///
  /// In en, this message translates to:
  /// **'Download Location'**
  String get downloadLocation;

  /// Subtitle for download location
  ///
  /// In en, this message translates to:
  /// **'Choose where to save files'**
  String get downloadLocationSubtitle;

  /// Shown when using default folder
  ///
  /// In en, this message translates to:
  /// **'Default location'**
  String get downloadLocationDefault;

  /// Setting for preferred download service (Tidal/Qobuz/Amazon)
  ///
  /// In en, this message translates to:
  /// **'Default Service'**
  String get downloadDefaultService;

  /// Subtitle for default service
  ///
  /// In en, this message translates to:
  /// **'Service used for downloads'**
  String get downloadDefaultServiceSubtitle;

  /// Setting for audio quality
  ///
  /// In en, this message translates to:
  /// **'Default Quality'**
  String get downloadDefaultQuality;

  /// Toggle to show quality picker
  ///
  /// In en, this message translates to:
  /// **'Ask Quality Before Download'**
  String get downloadAskQuality;

  /// Subtitle for ask quality toggle
  ///
  /// In en, this message translates to:
  /// **'Show quality picker for each download'**
  String get downloadAskQualitySubtitle;

  /// Setting for output filename pattern
  ///
  /// In en, this message translates to:
  /// **'Filename Format'**
  String get downloadFilenameFormat;

  /// Setting for folder structure
  ///
  /// In en, this message translates to:
  /// **'Folder Organization'**
  String get downloadFolderOrganization;

  /// Toggle to separate single tracks
  ///
  /// In en, this message translates to:
  /// **'Separate Singles'**
  String get downloadSeparateSingles;

  /// Subtitle for separate singles toggle
  ///
  /// In en, this message translates to:
  /// **'Put single tracks in a separate folder'**
  String get downloadSeparateSinglesSubtitle;

  /// Audio quality option - highest available
  ///
  /// In en, this message translates to:
  /// **'Best Available'**
  String get qualityBest;

  /// Audio quality option - FLAC lossless
  ///
  /// In en, this message translates to:
  /// **'FLAC'**
  String get qualityFlac;

  /// Audio quality option - 320kbps MP3
  ///
  /// In en, this message translates to:
  /// **'320 kbps'**
  String get quality320;

  /// Audio quality option - 128kbps MP3
  ///
  /// In en, this message translates to:
  /// **'128 kbps'**
  String get quality128;

  /// Appearance settings page title
  ///
  /// In en, this message translates to:
  /// **'Appearance'**
  String get appearanceTitle;

  /// Theme mode setting
  ///
  /// In en, this message translates to:
  /// **'Theme'**
  String get appearanceTheme;

  /// Follow system theme
  ///
  /// In en, this message translates to:
  /// **'System'**
  String get appearanceThemeSystem;

  /// Light theme
  ///
  /// In en, this message translates to:
  /// **'Light'**
  String get appearanceThemeLight;

  /// Dark theme
  ///
  /// In en, this message translates to:
  /// **'Dark'**
  String get appearanceThemeDark;

  /// Material You dynamic colors
  ///
  /// In en, this message translates to:
  /// **'Dynamic Color'**
  String get appearanceDynamicColor;

  /// Subtitle for dynamic color
  ///
  /// In en, this message translates to:
  /// **'Use colors from your wallpaper'**
  String get appearanceDynamicColorSubtitle;

  /// Custom accent color picker
  ///
  /// In en, this message translates to:
  /// **'Accent Color'**
  String get appearanceAccentColor;

  /// Layout style for history
  ///
  /// In en, this message translates to:
  /// **'History View'**
  String get appearanceHistoryView;

  /// List layout option
  ///
  /// In en, this message translates to:
  /// **'List'**
  String get appearanceHistoryViewList;

  /// Grid layout option
  ///
  /// In en, this message translates to:
  /// **'Grid'**
  String get appearanceHistoryViewGrid;

  /// Options settings page title
  ///
  /// In en, this message translates to:
  /// **'Options'**
  String get optionsTitle;

  /// Section for search provider settings
  ///
  /// In en, this message translates to:
  /// **'Search Source'**
  String get optionsSearchSource;

  /// Main search provider setting
  ///
  /// In en, this message translates to:
  /// **'Primary Provider'**
  String get optionsPrimaryProvider;

  /// Subtitle for primary provider
  ///
  /// In en, this message translates to:
  /// **'Service used when searching by track name.'**
  String get optionsPrimaryProviderSubtitle;

  /// Shows active extension name
  ///
  /// In en, this message translates to:
  /// **'Using extension: {extensionName}'**
  String optionsUsingExtension(String extensionName);

  /// Hint to switch back to built-in providers
  ///
  /// In en, this message translates to:
  /// **'Tap Deezer or Spotify to switch back from extension'**
  String get optionsSwitchBack;

  /// Auto-retry with other services
  ///
  /// In en, this message translates to:
  /// **'Auto Fallback'**
  String get optionsAutoFallback;

  /// Subtitle for auto fallback
  ///
  /// In en, this message translates to:
  /// **'Try other services if download fails'**
  String get optionsAutoFallbackSubtitle;

  /// Enable extension download providers
  ///
  /// In en, this message translates to:
  /// **'Use Extension Providers'**
  String get optionsUseExtensionProviders;

  /// Status when extension providers enabled
  ///
  /// In en, this message translates to:
  /// **'Extensions will be tried first'**
  String get optionsUseExtensionProvidersOn;

  /// Status when extension providers disabled
  ///
  /// In en, this message translates to:
  /// **'Using built-in providers only'**
  String get optionsUseExtensionProvidersOff;

  /// Embed lyrics in audio files
  ///
  /// In en, this message translates to:
  /// **'Embed Lyrics'**
  String get optionsEmbedLyrics;

  /// Subtitle for embed lyrics
  ///
  /// In en, this message translates to:
  /// **'Embed synced lyrics into FLAC files'**
  String get optionsEmbedLyricsSubtitle;

  /// Download highest quality album art
  ///
  /// In en, this message translates to:
  /// **'Max Quality Cover'**
  String get optionsMaxQualityCover;

  /// Subtitle for max quality cover
  ///
  /// In en, this message translates to:
  /// **'Download highest resolution cover art'**
  String get optionsMaxQualityCoverSubtitle;

  /// Number of parallel downloads
  ///
  /// In en, this message translates to:
  /// **'Concurrent Downloads'**
  String get optionsConcurrentDownloads;

  /// Download one at a time
  ///
  /// In en, this message translates to:
  /// **'Sequential (1 at a time)'**
  String get optionsConcurrentSequential;

  /// Multiple parallel downloads
  ///
  /// In en, this message translates to:
  /// **'{count} parallel downloads'**
  String optionsConcurrentParallel(int count);

  /// Warning about rate limits
  ///
  /// In en, this message translates to:
  /// **'Parallel downloads may trigger rate limiting'**
  String get optionsConcurrentWarning;

  /// Show/hide store tab
  ///
  /// In en, this message translates to:
  /// **'Extension Store'**
  String get optionsExtensionStore;

  /// Subtitle for extension store toggle
  ///
  /// In en, this message translates to:
  /// **'Show Store tab in navigation'**
  String get optionsExtensionStoreSubtitle;

  /// Auto update check toggle
  ///
  /// In en, this message translates to:
  /// **'Check for Updates'**
  String get optionsCheckUpdates;

  /// Subtitle for update check
  ///
  /// In en, this message translates to:
  /// **'Notify when new version is available'**
  String get optionsCheckUpdatesSubtitle;

  /// Stable vs preview releases
  ///
  /// In en, this message translates to:
  /// **'Update Channel'**
  String get optionsUpdateChannel;

  /// Only stable updates
  ///
  /// In en, this message translates to:
  /// **'Stable releases only'**
  String get optionsUpdateChannelStable;

  /// Include beta/preview updates
  ///
  /// In en, this message translates to:
  /// **'Get preview releases'**
  String get optionsUpdateChannelPreview;

  /// Warning about preview channel
  ///
  /// In en, this message translates to:
  /// **'Preview may contain bugs or incomplete features'**
  String get optionsUpdateChannelWarning;

  /// Delete all download history
  ///
  /// In en, this message translates to:
  /// **'Clear Download History'**
  String get optionsClearHistory;

  /// Subtitle for clear history
  ///
  /// In en, this message translates to:
  /// **'Remove all downloaded tracks from history'**
  String get optionsClearHistorySubtitle;

  /// Enable verbose logs for debugging
  ///
  /// In en, this message translates to:
  /// **'Detailed Logging'**
  String get optionsDetailedLogging;

  /// Status when logging enabled
  ///
  /// In en, this message translates to:
  /// **'Detailed logs are being recorded'**
  String get optionsDetailedLoggingOn;

  /// Status when logging disabled
  ///
  /// In en, this message translates to:
  /// **'Enable for bug reports'**
  String get optionsDetailedLoggingOff;

  /// Spotify API credentials setting
  ///
  /// In en, this message translates to:
  /// **'Spotify Credentials'**
  String get optionsSpotifyCredentials;

  /// Shows configured client ID preview
  ///
  /// In en, this message translates to:
  /// **'Client ID: {clientId}...'**
  String optionsSpotifyCredentialsConfigured(String clientId);

  /// Prompt to set up credentials
  ///
  /// In en, this message translates to:
  /// **'Required - tap to configure'**
  String get optionsSpotifyCredentialsRequired;

  /// Info about Spotify API requirement
  ///
  /// In en, this message translates to:
  /// **'Spotify requires your own API credentials. Get them free from developer.spotify.com'**
  String get optionsSpotifyWarning;

  /// Warning about Spotify API deprecation
  ///
  /// In en, this message translates to:
  /// **'Spotify search will be deprecated on March 3, 2026 due to Spotify API changes. Please switch to Deezer.'**
  String get optionsSpotifyDeprecationWarning;

  /// Extensions page title
  ///
  /// In en, this message translates to:
  /// **'Extensions'**
  String get extensionsTitle;

  /// Section header for installed extensions
  ///
  /// In en, this message translates to:
  /// **'Installed Extensions'**
  String get extensionsInstalled;

  /// Empty state title
  ///
  /// In en, this message translates to:
  /// **'No extensions installed'**
  String get extensionsNone;

  /// Empty state subtitle
  ///
  /// In en, this message translates to:
  /// **'Install extensions from the Store tab'**
  String get extensionsNoneSubtitle;

  /// Extension status - active
  ///
  /// In en, this message translates to:
  /// **'Enabled'**
  String get extensionsEnabled;

  /// Extension status - inactive
  ///
  /// In en, this message translates to:
  /// **'Disabled'**
  String get extensionsDisabled;

  /// Extension version display
  ///
  /// In en, this message translates to:
  /// **'Version {version}'**
  String extensionsVersion(String version);

  /// Extension author credit
  ///
  /// In en, this message translates to:
  /// **'by {author}'**
  String extensionsAuthor(String author);

  /// Uninstall extension button
  ///
  /// In en, this message translates to:
  /// **'Uninstall'**
  String get extensionsUninstall;

  /// Use extension for search
  ///
  /// In en, this message translates to:
  /// **'Set as Search Provider'**
  String get extensionsSetAsSearch;

  /// Store screen title
  ///
  /// In en, this message translates to:
  /// **'Extension Store'**
  String get storeTitle;

  /// Store search placeholder
  ///
  /// In en, this message translates to:
  /// **'Search extensions...'**
  String get storeSearch;

  /// Install extension button
  ///
  /// In en, this message translates to:
  /// **'Install'**
  String get storeInstall;

  /// Already installed badge
  ///
  /// In en, this message translates to:
  /// **'Installed'**
  String get storeInstalled;

  /// Update available button
  ///
  /// In en, this message translates to:
  /// **'Update'**
  String get storeUpdate;

  /// About page title
  ///
  /// In en, this message translates to:
  /// **'About'**
  String get aboutTitle;

  /// Section for contributors
  ///
  /// In en, this message translates to:
  /// **'Contributors'**
  String get aboutContributors;

  /// Role description for mobile dev
  ///
  /// In en, this message translates to:
  /// **'Mobile version developer'**
  String get aboutMobileDeveloper;

  /// Role description for original creator
  ///
  /// In en, this message translates to:
  /// **'Creator of the original SpotiFLAC'**
  String get aboutOriginalCreator;

  /// Role description for logo artist
  ///
  /// In en, this message translates to:
  /// **'The talented artist who created our beautiful app logo!'**
  String get aboutLogoArtist;

  /// Section for translators
  ///
  /// In en, this message translates to:
  /// **'Translators'**
  String get aboutTranslators;

  /// Section for special thanks
  ///
  /// In en, this message translates to:
  /// **'Special Thanks'**
  String get aboutSpecialThanks;

  /// Section for external links
  ///
  /// In en, this message translates to:
  /// **'Links'**
  String get aboutLinks;

  /// Link to mobile GitHub repo
  ///
  /// In en, this message translates to:
  /// **'Mobile source code'**
  String get aboutMobileSource;

  /// Link to PC GitHub repo
  ///
  /// In en, this message translates to:
  /// **'PC source code'**
  String get aboutPCSource;

  /// Link to report bugs
  ///
  /// In en, this message translates to:
  /// **'Report an issue'**
  String get aboutReportIssue;

  /// Subtitle for report issue
  ///
  /// In en, this message translates to:
  /// **'Report any problems you encounter'**
  String get aboutReportIssueSubtitle;

  /// Link to suggest features
  ///
  /// In en, this message translates to:
  /// **'Feature request'**
  String get aboutFeatureRequest;

  /// Subtitle for feature request
  ///
  /// In en, this message translates to:
  /// **'Suggest new features for the app'**
  String get aboutFeatureRequestSubtitle;

  /// Link to Telegram channel
  ///
  /// In en, this message translates to:
  /// **'Telegram Channel'**
  String get aboutTelegramChannel;

  /// Subtitle for Telegram channel
  ///
  /// In en, this message translates to:
  /// **'Announcements and updates'**
  String get aboutTelegramChannelSubtitle;

  /// Link to Telegram chat group
  ///
  /// In en, this message translates to:
  /// **'Telegram Community'**
  String get aboutTelegramChat;

  /// Subtitle for Telegram chat
  ///
  /// In en, this message translates to:
  /// **'Chat with other users'**
  String get aboutTelegramChatSubtitle;

  /// Section for social links
  ///
  /// In en, this message translates to:
  /// **'Social'**
  String get aboutSocial;

  /// Section for support/donation links
  ///
  /// In en, this message translates to:
  /// **'Support'**
  String get aboutSupport;

  /// Section for app info
  ///
  /// In en, this message translates to:
  /// **'App'**
  String get aboutApp;

  /// Version info label
  ///
  /// In en, this message translates to:
  /// **'Version'**
  String get aboutVersion;

  /// Credit description for binimum
  ///
  /// In en, this message translates to:
  /// **'The creator of QQDL & HiFi API. Without this API, Tidal downloads wouldn\'t exist!'**
  String get aboutBinimumDesc;

  /// Credit description for sachinsenal0x64
  ///
  /// In en, this message translates to:
  /// **'The original HiFi project creator. The foundation of Tidal integration!'**
  String get aboutSachinsenalDesc;

  /// Credit description for sjdonado
  ///
  /// In en, this message translates to:
  /// **'Creator of I Don\'t Have Spotify (IDHS). The fallback link resolver that saves the day!'**
  String get aboutSjdonadoDesc;

  /// Name of Amazon API service - DO NOT TRANSLATE
  ///
  /// In en, this message translates to:
  /// **'DoubleDouble'**
  String get aboutDoubleDouble;

  /// Credit for DoubleDouble API
  ///
  /// In en, this message translates to:
  /// **'Amazing API for Amazon Music downloads. Thank you for making it free!'**
  String get aboutDoubleDoubleDesc;

  /// Name of Qobuz API service - DO NOT TRANSLATE
  ///
  /// In en, this message translates to:
  /// **'DAB Music'**
  String get aboutDabMusic;

  /// Credit for DAB Music API
  ///
  /// In en, this message translates to:
  /// **'The best Qobuz streaming API. Hi-Res downloads wouldn\'t be possible without this!'**
  String get aboutDabMusicDesc;

  /// Name of SpotiSaver API service - DO NOT TRANSLATE
  ///
  /// In en, this message translates to:
  /// **'SpotiSaver'**
  String get aboutSpotiSaver;

  /// Credit for SpotiSaver API
  ///
  /// In en, this message translates to:
  /// **'Tidal Hi-Res FLAC streaming endpoints. A key piece of the lossless puzzle!'**
  String get aboutSpotiSaverDesc;

  /// App description in header card
  ///
  /// In en, this message translates to:
  /// **'Download Spotify tracks in lossless quality from Tidal, Qobuz, and Amazon Music.'**
  String get aboutAppDescription;

  /// Album screen title
  ///
  /// In en, this message translates to:
  /// **'Album'**
  String get albumTitle;

  /// Album track count
  ///
  /// In en, this message translates to:
  /// **'{count, plural, =1{1 track} other{{count} tracks}}'**
  String albumTracks(int count);

  /// Button to download all tracks
  ///
  /// In en, this message translates to:
  /// **'Download All'**
  String get albumDownloadAll;

  /// Button to download remaining tracks
  ///
  /// In en, this message translates to:
  /// **'Download Remaining'**
  String get albumDownloadRemaining;

  /// Playlist screen title
  ///
  /// In en, this message translates to:
  /// **'Playlist'**
  String get playlistTitle;

  /// Artist screen title
  ///
  /// In en, this message translates to:
  /// **'Artist'**
  String get artistTitle;

  /// Section header for artist albums
  ///
  /// In en, this message translates to:
  /// **'Albums'**
  String get artistAlbums;

  /// Section header for singles/EPs
  ///
  /// In en, this message translates to:
  /// **'Singles & EPs'**
  String get artistSingles;

  /// Section header for compilations
  ///
  /// In en, this message translates to:
  /// **'Compilations'**
  String get artistCompilations;

  /// Artist release count
  ///
  /// In en, this message translates to:
  /// **'{count, plural, =1{1 release} other{{count} releases}}'**
  String artistReleases(int count);

  /// Section header for popular/top tracks
  ///
  /// In en, this message translates to:
  /// **'Popular'**
  String get artistPopular;

  /// Monthly listener count display
  ///
  /// In en, this message translates to:
  /// **'{count} monthly listeners'**
  String artistMonthlyListeners(String count);

  /// Track metadata screen title
  ///
  /// In en, this message translates to:
  /// **'Track Info'**
  String get trackMetadataTitle;

  /// Metadata field - artist name
  ///
  /// In en, this message translates to:
  /// **'Artist'**
  String get trackMetadataArtist;

  /// Metadata field - album name
  ///
  /// In en, this message translates to:
  /// **'Album'**
  String get trackMetadataAlbum;

  /// Metadata field - track length
  ///
  /// In en, this message translates to:
  /// **'Duration'**
  String get trackMetadataDuration;

  /// Metadata field - audio quality
  ///
  /// In en, this message translates to:
  /// **'Quality'**
  String get trackMetadataQuality;

  /// Metadata field - file location
  ///
  /// In en, this message translates to:
  /// **'File Path'**
  String get trackMetadataPath;

  /// Metadata field - download date
  ///
  /// In en, this message translates to:
  /// **'Downloaded'**
  String get trackMetadataDownloadedAt;

  /// Metadata field - download service used
  ///
  /// In en, this message translates to:
  /// **'Service'**
  String get trackMetadataService;

  /// Action button - play track
  ///
  /// In en, this message translates to:
  /// **'Play'**
  String get trackMetadataPlay;

  /// Action button - share track
  ///
  /// In en, this message translates to:
  /// **'Share'**
  String get trackMetadataShare;

  /// Action button - delete track
  ///
  /// In en, this message translates to:
  /// **'Delete'**
  String get trackMetadataDelete;

  /// Action button - download again
  ///
  /// In en, this message translates to:
  /// **'Re-download'**
  String get trackMetadataRedownload;

  /// Action button - open containing folder
  ///
  /// In en, this message translates to:
  /// **'Open Folder'**
  String get trackMetadataOpenFolder;

  /// Setup wizard title
  ///
  /// In en, this message translates to:
  /// **'Welcome to SpotiFLAC'**
  String get setupTitle;

  /// Setup wizard subtitle
  ///
  /// In en, this message translates to:
  /// **'Let\'s get you started'**
  String get setupSubtitle;

  /// Storage permission step title
  ///
  /// In en, this message translates to:
  /// **'Storage Permission'**
  String get setupStoragePermission;

  /// Explanation for storage permission
  ///
  /// In en, this message translates to:
  /// **'Required to save downloaded files'**
  String get setupStoragePermissionSubtitle;

  /// Status when permission granted
  ///
  /// In en, this message translates to:
  /// **'Permission granted'**
  String get setupStoragePermissionGranted;

  /// Status when permission denied
  ///
  /// In en, this message translates to:
  /// **'Permission denied'**
  String get setupStoragePermissionDenied;

  /// Button to request permission
  ///
  /// In en, this message translates to:
  /// **'Grant Permission'**
  String get setupGrantPermission;

  /// Download folder step title
  ///
  /// In en, this message translates to:
  /// **'Download Location'**
  String get setupDownloadLocation;

  /// Button to pick folder
  ///
  /// In en, this message translates to:
  /// **'Choose Folder'**
  String get setupChooseFolder;

  /// Continue to next step button
  ///
  /// In en, this message translates to:
  /// **'Continue'**
  String get setupContinue;

  /// Skip current step button
  ///
  /// In en, this message translates to:
  /// **'Skip for now'**
  String get setupSkip;

  /// Title when storage access needed
  ///
  /// In en, this message translates to:
  /// **'Storage Access Required'**
  String get setupStorageAccessRequired;

  /// Explanation for storage access
  ///
  /// In en, this message translates to:
  /// **'SpotiFLAC needs \"All files access\" permission to save music files to your chosen folder.'**
  String get setupStorageAccessMessage;

  /// Android 11+ specific explanation
  ///
  /// In en, this message translates to:
  /// **'Android 11+ requires \"All files access\" permission to save files to your chosen download folder.'**
  String get setupStorageAccessMessageAndroid11;

  /// Button to open system settings
  ///
  /// In en, this message translates to:
  /// **'Open Settings'**
  String get setupOpenSettings;

  /// Error when permission denied
  ///
  /// In en, this message translates to:
  /// **'Permission denied. Please grant all permissions to continue.'**
  String get setupPermissionDeniedMessage;

  /// Generic permission required title
  ///
  /// In en, this message translates to:
  /// **'{permissionType} Permission Required'**
  String setupPermissionRequired(String permissionType);

  /// Generic permission required message
  ///
  /// In en, this message translates to:
  /// **'{permissionType} permission is required for the best experience. You can change this later in Settings.'**
  String setupPermissionRequiredMessage(String permissionType);

  /// Folder selection step title
  ///
  /// In en, this message translates to:
  /// **'Select Download Folder'**
  String get setupSelectDownloadFolder;

  /// Dialog title for default folder
  ///
  /// In en, this message translates to:
  /// **'Use Default Folder?'**
  String get setupUseDefaultFolder;

  /// Prompt when no folder selected
  ///
  /// In en, this message translates to:
  /// **'No folder selected. Would you like to use the default Music folder?'**
  String get setupNoFolderSelected;

  /// Button to use default folder
  ///
  /// In en, this message translates to:
  /// **'Use Default'**
  String get setupUseDefault;

  /// Download location dialog title
  ///
  /// In en, this message translates to:
  /// **'Download Location'**
  String get setupDownloadLocationTitle;

  /// iOS-specific folder info
  ///
  /// In en, this message translates to:
  /// **'On iOS, downloads are saved to the app\'s Documents folder. You can access them via the Files app.'**
  String get setupDownloadLocationIosMessage;

  /// iOS documents folder option
  ///
  /// In en, this message translates to:
  /// **'App Documents Folder'**
  String get setupAppDocumentsFolder;

  /// Subtitle for documents folder
  ///
  /// In en, this message translates to:
  /// **'Recommended - accessible via Files app'**
  String get setupAppDocumentsFolderSubtitle;

  /// iOS file picker option
  ///
  /// In en, this message translates to:
  /// **'Choose from Files'**
  String get setupChooseFromFiles;

  /// Subtitle for file picker
  ///
  /// In en, this message translates to:
  /// **'Select iCloud or other location'**
  String get setupChooseFromFilesSubtitle;

  /// iOS folder selection warning
  ///
  /// In en, this message translates to:
  /// **'iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.'**
  String get setupIosEmptyFolderWarning;

  /// Error when user selects iCloud Drive on iOS
  ///
  /// In en, this message translates to:
  /// **'iCloud Drive is not supported. Please use the app Documents folder.'**
  String get setupIcloudNotSupported;

  /// App tagline in setup
  ///
  /// In en, this message translates to:
  /// **'Download Spotify tracks in FLAC'**
  String get setupDownloadInFlac;

  /// Setup step indicator - storage
  ///
  /// In en, this message translates to:
  /// **'Storage'**
  String get setupStepStorage;

  /// Setup step indicator - notification
  ///
  /// In en, this message translates to:
  /// **'Notification'**
  String get setupStepNotification;

  /// Setup step indicator - folder
  ///
  /// In en, this message translates to:
  /// **'Folder'**
  String get setupStepFolder;

  /// Setup step indicator - Spotify API
  ///
  /// In en, this message translates to:
  /// **'Spotify'**
  String get setupStepSpotify;

  /// Setup step indicator - permission
  ///
  /// In en, this message translates to:
  /// **'Permission'**
  String get setupStepPermission;

  /// Success message for storage permission
  ///
  /// In en, this message translates to:
  /// **'Storage Permission Granted!'**
  String get setupStorageGranted;

  /// Title when storage permission needed
  ///
  /// In en, this message translates to:
  /// **'Storage Permission Required'**
  String get setupStorageRequired;

  /// Explanation for storage permission
  ///
  /// In en, this message translates to:
  /// **'SpotiFLAC needs storage permission to save your downloaded music files.'**
  String get setupStorageDescription;

  /// Success message for notification permission
  ///
  /// In en, this message translates to:
  /// **'Notification Permission Granted!'**
  String get setupNotificationGranted;

  /// Button to enable notifications
  ///
  /// In en, this message translates to:
  /// **'Enable Notifications'**
  String get setupNotificationEnable;

  /// Explanation for notifications
  ///
  /// In en, this message translates to:
  /// **'Get notified when downloads complete or require attention.'**
  String get setupNotificationDescription;

  /// Success message for folder selection
  ///
  /// In en, this message translates to:
  /// **'Download Folder Selected!'**
  String get setupFolderSelected;

  /// Button to choose folder
  ///
  /// In en, this message translates to:
  /// **'Choose Download Folder'**
  String get setupFolderChoose;

  /// Explanation for folder selection
  ///
  /// In en, this message translates to:
  /// **'Select a folder where your downloaded music will be saved.'**
  String get setupFolderDescription;

  /// Button to change selected folder
  ///
  /// In en, this message translates to:
  /// **'Change Folder'**
  String get setupChangeFolder;

  /// Button to select folder
  ///
  /// In en, this message translates to:
  /// **'Select Folder'**
  String get setupSelectFolder;

  /// Spotify API step title
  ///
  /// In en, this message translates to:
  /// **'Spotify API (Optional)'**
  String get setupSpotifyApiOptional;

  /// Explanation for Spotify API
  ///
  /// In en, this message translates to:
  /// **'Add your Spotify API credentials for better search results and access to Spotify-exclusive content.'**
  String get setupSpotifyApiDescription;

  /// Toggle to enable Spotify API
  ///
  /// In en, this message translates to:
  /// **'Use Spotify API'**
  String get setupUseSpotifyApi;

  /// Prompt to enter credentials
  ///
  /// In en, this message translates to:
  /// **'Enter your credentials below'**
  String get setupEnterCredentialsBelow;

  /// Status when using Deezer
  ///
  /// In en, this message translates to:
  /// **'Using Deezer (no account needed)'**
  String get setupUsingDeezer;

  /// Placeholder for client ID field
  ///
  /// In en, this message translates to:
  /// **'Enter Spotify Client ID'**
  String get setupEnterClientId;

  /// Placeholder for client secret field
  ///
  /// In en, this message translates to:
  /// **'Enter Spotify Client Secret'**
  String get setupEnterClientSecret;

  /// Info about getting Spotify credentials
  ///
  /// In en, this message translates to:
  /// **'Get your free API credentials from the Spotify Developer Dashboard.'**
  String get setupGetFreeCredentials;

  /// Button to enable notifications
  ///
  /// In en, this message translates to:
  /// **'Enable Notifications'**
  String get setupEnableNotifications;

  /// Message after completing a step
  ///
  /// In en, this message translates to:
  /// **'You can now proceed to the next step.'**
  String get setupProceedToNextStep;

  /// Info about notification usage
  ///
  /// In en, this message translates to:
  /// **'You will receive download progress notifications.'**
  String get setupNotificationProgressDescription;

  /// Detailed notification explanation
  ///
  /// In en, this message translates to:
  /// **'Get notified about download progress and completion. This helps you track downloads when the app is in background.'**
  String get setupNotificationBackgroundDescription;

  /// Skip button text
  ///
  /// In en, this message translates to:
  /// **'Skip for now'**
  String get setupSkipForNow;

  /// Back button text
  ///
  /// In en, this message translates to:
  /// **'Back'**
  String get setupBack;

  /// Next button text
  ///
  /// In en, this message translates to:
  /// **'Next'**
  String get setupNext;

  /// Final setup button
  ///
  /// In en, this message translates to:
  /// **'Get Started'**
  String get setupGetStarted;

  /// Skip setup and start app
  ///
  /// In en, this message translates to:
  /// **'Skip & Start'**
  String get setupSkipAndStart;

  /// Instruction for file access permission
  ///
  /// In en, this message translates to:
  /// **'Please enable \"Allow access to manage all files\" in the next screen.'**
  String get setupAllowAccessToManageFiles;

  /// Link text for Spotify developer portal
  ///
  /// In en, this message translates to:
  /// **'Get credentials from developer.spotify.com'**
  String get setupGetCredentialsFromSpotify;

  /// Dialog button - cancel action
  ///
  /// In en, this message translates to:
  /// **'Cancel'**
  String get dialogCancel;

  /// Dialog button - confirm/acknowledge
  ///
  /// In en, this message translates to:
  /// **'OK'**
  String get dialogOk;

  /// Dialog button - save changes
  ///
  /// In en, this message translates to:
  /// **'Save'**
  String get dialogSave;

  /// Dialog button - delete item
  ///
  /// In en, this message translates to:
  /// **'Delete'**
  String get dialogDelete;

  /// Dialog button - retry action
  ///
  /// In en, this message translates to:
  /// **'Retry'**
  String get dialogRetry;

  /// Dialog button - close dialog
  ///
  /// In en, this message translates to:
  /// **'Close'**
  String get dialogClose;

  /// Dialog button - confirm yes
  ///
  /// In en, this message translates to:
  /// **'Yes'**
  String get dialogYes;

  /// Dialog button - confirm no
  ///
  /// In en, this message translates to:
  /// **'No'**
  String get dialogNo;

  /// Dialog button - clear items
  ///
  /// In en, this message translates to:
  /// **'Clear'**
  String get dialogClear;

  /// Dialog button - confirm action
  ///
  /// In en, this message translates to:
  /// **'Confirm'**
  String get dialogConfirm;

  /// Dialog button - action completed
  ///
  /// In en, this message translates to:
  /// **'Done'**
  String get dialogDone;

  /// Dialog button - import data
  ///
  /// In en, this message translates to:
  /// **'Import'**
  String get dialogImport;

  /// Dialog button - discard changes
  ///
  /// In en, this message translates to:
  /// **'Discard'**
  String get dialogDiscard;

  /// Dialog button - remove item
  ///
  /// In en, this message translates to:
  /// **'Remove'**
  String get dialogRemove;

  /// Dialog button - uninstall extension
  ///
  /// In en, this message translates to:
  /// **'Uninstall'**
  String get dialogUninstall;

  /// Dialog title - unsaved changes warning
  ///
  /// In en, this message translates to:
  /// **'Discard Changes?'**
  String get dialogDiscardChanges;

  /// Dialog message - unsaved changes
  ///
  /// In en, this message translates to:
  /// **'You have unsaved changes. Do you want to discard them?'**
  String get dialogUnsavedChanges;

  /// Dialog title - download error
  ///
  /// In en, this message translates to:
  /// **'Download Failed'**
  String get dialogDownloadFailed;

  /// Label for track name in error dialog
  ///
  /// In en, this message translates to:
  /// **'Track:'**
  String get dialogTrackLabel;

  /// Label for artist name in error dialog
  ///
  /// In en, this message translates to:
  /// **'Artist:'**
  String get dialogArtistLabel;

  /// Label for error message
  ///
  /// In en, this message translates to:
  /// **'Error:'**
  String get dialogErrorLabel;

  /// Dialog title - clear all items
  ///
  /// In en, this message translates to:
  /// **'Clear All'**
  String get dialogClearAll;

  /// Dialog message - clear downloads confirmation
  ///
  /// In en, this message translates to:
  /// **'Are you sure you want to clear all downloads?'**
  String get dialogClearAllDownloads;

  /// Dialog title - delete file confirmation
  ///
  /// In en, this message translates to:
  /// **'Remove from device?'**
  String get dialogRemoveFromDevice;

  /// Dialog title - uninstall extension
  ///
  /// In en, this message translates to:
  /// **'Remove Extension'**
  String get dialogRemoveExtension;

  /// Dialog message - uninstall confirmation
  ///
  /// In en, this message translates to:
  /// **'Are you sure you want to remove this extension? This cannot be undone.'**
  String get dialogRemoveExtensionMessage;

  /// Dialog title - uninstall extension
  ///
  /// In en, this message translates to:
  /// **'Uninstall Extension?'**
  String get dialogUninstallExtension;

  /// Dialog message - uninstall specific extension
  ///
  /// In en, this message translates to:
  /// **'Are you sure you want to remove {extensionName}?'**
  String dialogUninstallExtensionMessage(String extensionName);

  /// Dialog title - clear download history
  ///
  /// In en, this message translates to:
  /// **'Clear History'**
  String get dialogClearHistoryTitle;

  /// Dialog message - clear history confirmation
  ///
  /// In en, this message translates to:
  /// **'Are you sure you want to clear all download history? This cannot be undone.'**
  String get dialogClearHistoryMessage;

  /// Dialog title - delete selected items
  ///
  /// In en, this message translates to:
  /// **'Delete Selected'**
  String get dialogDeleteSelectedTitle;

  /// Dialog message - delete selected tracks
  ///
  /// In en, this message translates to:
  /// **'Delete {count} {count, plural, =1{track} other{tracks}} from history?\n\nThis will also delete the files from storage.'**
  String dialogDeleteSelectedMessage(int count);

  /// Dialog title - import CSV playlist
  ///
  /// In en, this message translates to:
  /// **'Import Playlist'**
  String get dialogImportPlaylistTitle;

  /// Dialog message - import playlist confirmation
  ///
  /// In en, this message translates to:
  /// **'Found {count} tracks in CSV. Add them to download queue?'**
  String dialogImportPlaylistMessage(int count);

  /// Label shown in quality picker for CSV import
  ///
  /// In en, this message translates to:
  /// **'{count} tracks from CSV'**
  String csvImportTracks(int count);

  /// Snackbar - track added to download queue
  ///
  /// In en, this message translates to:
  /// **'Added \"{trackName}\" to queue'**
  String snackbarAddedToQueue(String trackName);

  /// Snackbar - multiple tracks added to queue
  ///
  /// In en, this message translates to:
  /// **'Added {count} tracks to queue'**
  String snackbarAddedTracksToQueue(int count);

  /// Snackbar - track already exists
  ///
  /// In en, this message translates to:
  /// **'\"{trackName}\" already downloaded'**
  String snackbarAlreadyDownloaded(String trackName);

  /// Snackbar - track already exists in local library
  ///
  /// In en, this message translates to:
  /// **'\"{trackName}\" already exists in your library'**
  String snackbarAlreadyInLibrary(String trackName);

  /// Snackbar - history deleted
  ///
  /// In en, this message translates to:
  /// **'History cleared'**
  String get snackbarHistoryCleared;

  /// Snackbar - Spotify credentials saved
  ///
  /// In en, this message translates to:
  /// **'Credentials saved'**
  String get snackbarCredentialsSaved;

  /// Snackbar - Spotify credentials removed
  ///
  /// In en, this message translates to:
  /// **'Credentials cleared'**
  String get snackbarCredentialsCleared;

  /// Snackbar - tracks deleted
  ///
  /// In en, this message translates to:
  /// **'Deleted {count} {count, plural, =1{track} other{tracks}}'**
  String snackbarDeletedTracks(int count);

  /// Snackbar - file open error
  ///
  /// In en, this message translates to:
  /// **'Cannot open file: {error}'**
  String snackbarCannotOpenFile(String error);

  /// Snackbar - validation error
  ///
  /// In en, this message translates to:
  /// **'Please fill all fields'**
  String get snackbarFillAllFields;

  /// Snackbar action - view download queue
  ///
  /// In en, this message translates to:
  /// **'View Queue'**
  String get snackbarViewQueue;

  /// Snackbar - loading error
  ///
  /// In en, this message translates to:
  /// **'Failed to load: {error}'**
  String snackbarFailedToLoad(String error);

  /// Snackbar - URL copied
  ///
  /// In en, this message translates to:
  /// **'{platform} URL copied to clipboard'**
  String snackbarUrlCopied(String platform);

  /// Snackbar - file doesn't exist
  ///
  /// In en, this message translates to:
  /// **'File not found'**
  String get snackbarFileNotFound;

  /// Snackbar - wrong file type selected
  ///
  /// In en, this message translates to:
  /// **'Please select a .spotiflac-ext file'**
  String get snackbarSelectExtFile;

  /// Snackbar - provider order saved
  ///
  /// In en, this message translates to:
  /// **'Provider priority saved'**
  String get snackbarProviderPrioritySaved;

  /// Snackbar - metadata provider order saved
  ///
  /// In en, this message translates to:
  /// **'Metadata provider priority saved'**
  String get snackbarMetadataProviderSaved;

  /// Snackbar - extension installed successfully
  ///
  /// In en, this message translates to:
  /// **'{extensionName} installed.'**
  String snackbarExtensionInstalled(String extensionName);

  /// Snackbar - extension updated successfully
  ///
  /// In en, this message translates to:
  /// **'{extensionName} updated.'**
  String snackbarExtensionUpdated(String extensionName);

  /// Snackbar - extension install error
  ///
  /// In en, this message translates to:
  /// **'Failed to install extension'**
  String get snackbarFailedToInstall;

  /// Snackbar - extension update error
  ///
  /// In en, this message translates to:
  /// **'Failed to update extension'**
  String get snackbarFailedToUpdate;

  /// Error title - too many requests
  ///
  /// In en, this message translates to:
  /// **'Rate Limited'**
  String get errorRateLimited;

  /// Error message - rate limit explanation
  ///
  /// In en, this message translates to:
  /// **'Too many requests. Please wait a moment before searching again.'**
  String get errorRateLimitedMessage;

  /// Error message - loading failed
  ///
  /// In en, this message translates to:
  /// **'Failed to load {item}'**
  String errorFailedToLoad(String item);

  /// Error - search returned no results
  ///
  /// In en, this message translates to:
  /// **'No tracks found'**
  String get errorNoTracksFound;

  /// Error - extension source not available
  ///
  /// In en, this message translates to:
  /// **'Cannot load {item}: missing extension source'**
  String errorMissingExtensionSource(String item);

  /// Download status - waiting in queue
  ///
  /// In en, this message translates to:
  /// **'Queued'**
  String get statusQueued;

  /// Download status - in progress
  ///
  /// In en, this message translates to:
  /// **'Downloading'**
  String get statusDownloading;

  /// Download status - writing metadata
  ///
  /// In en, this message translates to:
  /// **'Finalizing'**
  String get statusFinalizing;

  /// Download status - finished
  ///
  /// In en, this message translates to:
  /// **'Completed'**
  String get statusCompleted;

  /// Download status - error occurred
  ///
  /// In en, this message translates to:
  /// **'Failed'**
  String get statusFailed;

  /// Download status - already exists
  ///
  /// In en, this message translates to:
  /// **'Skipped'**
  String get statusSkipped;

  /// Download status - paused
  ///
  /// In en, this message translates to:
  /// **'Paused'**
  String get statusPaused;

  /// Action button - pause download
  ///
  /// In en, this message translates to:
  /// **'Pause'**
  String get actionPause;

  /// Action button - resume download
  ///
  /// In en, this message translates to:
  /// **'Resume'**
  String get actionResume;

  /// Action button - cancel operation
  ///
  /// In en, this message translates to:
  /// **'Cancel'**
  String get actionCancel;

  /// Action button - stop operation
  ///
  /// In en, this message translates to:
  /// **'Stop'**
  String get actionStop;

  /// Action button - enter selection mode
  ///
  /// In en, this message translates to:
  /// **'Select'**
  String get actionSelect;

  /// Action button - select all items
  ///
  /// In en, this message translates to:
  /// **'Select All'**
  String get actionSelectAll;

  /// Action button - deselect all
  ///
  /// In en, this message translates to:
  /// **'Deselect'**
  String get actionDeselect;

  /// Action button - paste from clipboard
  ///
  /// In en, this message translates to:
  /// **'Paste'**
  String get actionPaste;

  /// Action button - import CSV file
  ///
  /// In en, this message translates to:
  /// **'Import CSV'**
  String get actionImportCsv;

  /// Action button - delete Spotify credentials
  ///
  /// In en, this message translates to:
  /// **'Remove Credentials'**
  String get actionRemoveCredentials;

  /// Action button - save Spotify credentials
  ///
  /// In en, this message translates to:
  /// **'Save Credentials'**
  String get actionSaveCredentials;

  /// Selection count indicator
  ///
  /// In en, this message translates to:
  /// **'{count} selected'**
  String selectionSelected(int count);

  /// Status - all items selected
  ///
  /// In en, this message translates to:
  /// **'All tracks selected'**
  String get selectionAllSelected;

  /// Hint - how to select items
  ///
  /// In en, this message translates to:
  /// **'Tap tracks to select'**
  String get selectionTapToSelect;

  /// Delete button with count
  ///
  /// In en, this message translates to:
  /// **'Delete {count} {count, plural, =1{track} other{tracks}}'**
  String selectionDeleteTracks(int count);

  /// Placeholder when nothing selected
  ///
  /// In en, this message translates to:
  /// **'Select tracks to delete'**
  String get selectionSelectToDelete;

  /// Progress indicator - loading track info
  ///
  /// In en, this message translates to:
  /// **'Fetching metadata... {current}/{total}'**
  String progressFetchingMetadata(int current, int total);

  /// Progress indicator - parsing CSV file
  ///
  /// In en, this message translates to:
  /// **'Reading CSV...'**
  String get progressReadingCsv;

  /// Search result category - songs
  ///
  /// In en, this message translates to:
  /// **'Songs'**
  String get searchSongs;

  /// Search result category - artists
  ///
  /// In en, this message translates to:
  /// **'Artists'**
  String get searchArtists;

  /// Search result category - albums
  ///
  /// In en, this message translates to:
  /// **'Albums'**
  String get searchAlbums;

  /// Search result category - playlists
  ///
  /// In en, this message translates to:
  /// **'Playlists'**
  String get searchPlaylists;

  /// Tooltip - play button
  ///
  /// In en, this message translates to:
  /// **'Play'**
  String get tooltipPlay;

  /// Tooltip - cancel button
  ///
  /// In en, this message translates to:
  /// **'Cancel'**
  String get tooltipCancel;

  /// Tooltip - stop button
  ///
  /// In en, this message translates to:
  /// **'Stop'**
  String get tooltipStop;

  /// Tooltip - retry button
  ///
  /// In en, this message translates to:
  /// **'Retry'**
  String get tooltipRetry;

  /// Tooltip - remove button
  ///
  /// In en, this message translates to:
  /// **'Remove'**
  String get tooltipRemove;

  /// Tooltip - clear button
  ///
  /// In en, this message translates to:
  /// **'Clear'**
  String get tooltipClear;

  /// Tooltip - paste button
  ///
  /// In en, this message translates to:
  /// **'Paste'**
  String get tooltipPaste;

  /// Setting title - filename pattern
  ///
  /// In en, this message translates to:
  /// **'Filename Format'**
  String get filenameFormat;

  /// Preview of filename pattern
  ///
  /// In en, this message translates to:
  /// **'Preview: {preview}'**
  String filenameFormatPreview(String preview);

  /// Label for placeholder list
  ///
  /// In en, this message translates to:
  /// **'Available placeholders:'**
  String get filenameAvailablePlaceholders;

  /// Default filename format hint
  ///
  /// In en, this message translates to:
  /// **'{artist} - {title}'**
  String filenameHint(Object artist, Object title);

  /// Toggle label for showing advanced filename tags
  ///
  /// In en, this message translates to:
  /// **'Show advanced tags'**
  String get filenameShowAdvancedTags;

  /// Description for advanced filename tag toggle
  ///
  /// In en, this message translates to:
  /// **'Enable formatted tags for track padding and date patterns'**
  String get filenameShowAdvancedTagsDescription;

  /// Setting title - folder structure
  ///
  /// In en, this message translates to:
  /// **'Folder Organization'**
  String get folderOrganization;

  /// Folder option - flat structure
  ///
  /// In en, this message translates to:
  /// **'No organization'**
  String get folderOrganizationNone;

  /// Folder option - artist folders
  ///
  /// In en, this message translates to:
  /// **'By Artist'**
  String get folderOrganizationByArtist;

  /// Folder option - album folders
  ///
  /// In en, this message translates to:
  /// **'By Album'**
  String get folderOrganizationByAlbum;

  /// Folder option - nested folders
  ///
  /// In en, this message translates to:
  /// **'Artist/Album'**
  String get folderOrganizationByArtistAlbum;

  /// Folder organization sheet description
  ///
  /// In en, this message translates to:
  /// **'Organize downloaded files into folders'**
  String get folderOrganizationDescription;

  /// Subtitle for no organization option
  ///
  /// In en, this message translates to:
  /// **'All files in download folder'**
  String get folderOrganizationNoneSubtitle;

  /// Subtitle for artist folder option
  ///
  /// In en, this message translates to:
  /// **'Separate folder for each artist'**
  String get folderOrganizationByArtistSubtitle;

  /// Subtitle for album folder option
  ///
  /// In en, this message translates to:
  /// **'Separate folder for each album'**
  String get folderOrganizationByAlbumSubtitle;

  /// Subtitle for nested folder option
  ///
  /// In en, this message translates to:
  /// **'Nested folders for artist and album'**
  String get folderOrganizationByArtistAlbumSubtitle;

  /// Update dialog title
  ///
  /// In en, this message translates to:
  /// **'Update Available'**
  String get updateAvailable;

  /// Update available message
  ///
  /// In en, this message translates to:
  /// **'Version {version} is available'**
  String updateNewVersion(String version);

  /// Update button - download update
  ///
  /// In en, this message translates to:
  /// **'Download'**
  String get updateDownload;

  /// Update button - dismiss
  ///
  /// In en, this message translates to:
  /// **'Later'**
  String get updateLater;

  /// Link to changelog
  ///
  /// In en, this message translates to:
  /// **'Changelog'**
  String get updateChangelog;

  /// Update status - initializing
  ///
  /// In en, this message translates to:
  /// **'Starting download...'**
  String get updateStartingDownload;

  /// Update error title
  ///
  /// In en, this message translates to:
  /// **'Download failed'**
  String get updateDownloadFailed;

  /// Update error message
  ///
  /// In en, this message translates to:
  /// **'Failed to download update'**
  String get updateFailedMessage;

  /// Update subtitle
  ///
  /// In en, this message translates to:
  /// **'A new version is ready'**
  String get updateNewVersionReady;

  /// Label for current version
  ///
  /// In en, this message translates to:
  /// **'Current'**
  String get updateCurrent;

  /// Label for new version
  ///
  /// In en, this message translates to:
  /// **'New'**
  String get updateNew;

  /// Update status - downloading
  ///
  /// In en, this message translates to:
  /// **'Downloading...'**
  String get updateDownloading;

  /// Changelog section title
  ///
  /// In en, this message translates to:
  /// **'What\'s New'**
  String get updateWhatsNew;

  /// Update button - download and install
  ///
  /// In en, this message translates to:
  /// **'Download & Install'**
  String get updateDownloadInstall;

  /// Update button - skip this version
  ///
  /// In en, this message translates to:
  /// **'Don\'t remind'**
  String get updateDontRemind;

  /// Setting title - download provider order
  ///
  /// In en, this message translates to:
  /// **'Provider Priority'**
  String get providerPriority;

  /// Subtitle for provider priority
  ///
  /// In en, this message translates to:
  /// **'Drag to reorder download providers'**
  String get providerPrioritySubtitle;

  /// Provider priority page title
  ///
  /// In en, this message translates to:
  /// **'Provider Priority'**
  String get providerPriorityTitle;

  /// Provider priority page description
  ///
  /// In en, this message translates to:
  /// **'Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.'**
  String get providerPriorityDescription;

  /// Info tip about fallback behavior
  ///
  /// In en, this message translates to:
  /// **'If a track is not available on the first provider, the app will automatically try the next one.'**
  String get providerPriorityInfo;

  /// Label for built-in providers (Tidal/Qobuz/Amazon)
  ///
  /// In en, this message translates to:
  /// **'Built-in'**
  String get providerBuiltIn;

  /// Label for extension-provided providers
  ///
  /// In en, this message translates to:
  /// **'Extension'**
  String get providerExtension;

  /// Setting title - metadata provider order
  ///
  /// In en, this message translates to:
  /// **'Metadata Provider Priority'**
  String get metadataProviderPriority;

  /// Subtitle for metadata priority
  ///
  /// In en, this message translates to:
  /// **'Order used when fetching track metadata'**
  String get metadataProviderPrioritySubtitle;

  /// Metadata priority page title
  ///
  /// In en, this message translates to:
  /// **'Metadata Priority'**
  String get metadataProviderPriorityTitle;

  /// Metadata priority page description
  ///
  /// In en, this message translates to:
  /// **'Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.'**
  String get metadataProviderPriorityDescription;

  /// Info tip about rate limits
  ///
  /// In en, this message translates to:
  /// **'Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.'**
  String get metadataProviderPriorityInfo;

  /// Deezer provider description
  ///
  /// In en, this message translates to:
  /// **'No rate limits'**
  String get metadataNoRateLimits;

  /// Spotify provider description
  ///
  /// In en, this message translates to:
  /// **'May rate limit'**
  String get metadataMayRateLimit;

  /// Logs screen title
  ///
  /// In en, this message translates to:
  /// **'Logs'**
  String get logTitle;

  /// Action - copy logs to clipboard
  ///
  /// In en, this message translates to:
  /// **'Copy Logs'**
  String get logCopy;

  /// Action - delete all logs
  ///
  /// In en, this message translates to:
  /// **'Clear Logs'**
  String get logClear;

  /// Action - share logs file
  ///
  /// In en, this message translates to:
  /// **'Share Logs'**
  String get logShare;

  /// Empty state title
  ///
  /// In en, this message translates to:
  /// **'No logs yet'**
  String get logEmpty;

  /// Snackbar - logs copied
  ///
  /// In en, this message translates to:
  /// **'Logs copied to clipboard'**
  String get logCopied;

  /// Log search placeholder
  ///
  /// In en, this message translates to:
  /// **'Search logs...'**
  String get logSearchHint;

  /// Filter by log level
  ///
  /// In en, this message translates to:
  /// **'Level'**
  String get logFilterLevel;

  /// Filter section title
  ///
  /// In en, this message translates to:
  /// **'Filter'**
  String get logFilterSection;

  /// Share button tooltip
  ///
  /// In en, this message translates to:
  /// **'Share logs'**
  String get logShareLogs;

  /// Clear button tooltip
  ///
  /// In en, this message translates to:
  /// **'Clear logs'**
  String get logClearLogs;

  /// Clear logs dialog title
  ///
  /// In en, this message translates to:
  /// **'Clear Logs'**
  String get logClearLogsTitle;

  /// Clear logs confirmation message
  ///
  /// In en, this message translates to:
  /// **'Are you sure you want to clear all logs?'**
  String get logClearLogsMessage;

  /// Error category - ISP blocking
  ///
  /// In en, this message translates to:
  /// **'ISP BLOCKING DETECTED'**
  String get logIspBlocking;

  /// Error category - rate limiting
  ///
  /// In en, this message translates to:
  /// **'RATE LIMITED'**
  String get logRateLimited;

  /// Error category - network issues
  ///
  /// In en, this message translates to:
  /// **'NETWORK ERROR'**
  String get logNetworkError;

  /// Error category - missing tracks
  ///
  /// In en, this message translates to:
  /// **'TRACK NOT FOUND'**
  String get logTrackNotFound;

  /// Filter dialog title
  ///
  /// In en, this message translates to:
  /// **'Filter logs by severity'**
  String get logFilterBySeverity;

  /// Empty state title
  ///
  /// In en, this message translates to:
  /// **'No logs yet'**
  String get logNoLogsYet;

  /// Empty state subtitle
  ///
  /// In en, this message translates to:
  /// **'Logs will appear here as you use the app'**
  String get logNoLogsYetSubtitle;

  /// Section header for error summary
  ///
  /// In en, this message translates to:
  /// **'Issue Summary'**
  String get logIssueSummary;

  /// ISP blocking explanation
  ///
  /// In en, this message translates to:
  /// **'Your ISP may be blocking access to download services'**
  String get logIspBlockingDescription;

  /// ISP blocking fix suggestion
  ///
  /// In en, this message translates to:
  /// **'Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8'**
  String get logIspBlockingSuggestion;

  /// Rate limit explanation
  ///
  /// In en, this message translates to:
  /// **'Too many requests to the service'**
  String get logRateLimitedDescription;

  /// Rate limit fix suggestion
  ///
  /// In en, this message translates to:
  /// **'Wait a few minutes before trying again'**
  String get logRateLimitedSuggestion;

  /// Network error explanation
  ///
  /// In en, this message translates to:
  /// **'Connection issues detected'**
  String get logNetworkErrorDescription;

  /// Network error fix suggestion
  ///
  /// In en, this message translates to:
  /// **'Check your internet connection'**
  String get logNetworkErrorSuggestion;

  /// Track not found explanation
  ///
  /// In en, this message translates to:
  /// **'Some tracks could not be found on download services'**
  String get logTrackNotFoundDescription;

  /// Track not found explanation
  ///
  /// In en, this message translates to:
  /// **'The track may not be available in lossless quality'**
  String get logTrackNotFoundSuggestion;

  /// Error count display
  ///
  /// In en, this message translates to:
  /// **'Total errors: {count}'**
  String logTotalErrors(int count);

  /// Affected domains display
  ///
  /// In en, this message translates to:
  /// **'Affected: {domains}'**
  String logAffected(String domains);

  /// Log count with filter active
  ///
  /// In en, this message translates to:
  /// **'Entries ({count} filtered)'**
  String logEntriesFiltered(int count);

  /// Total log count
  ///
  /// In en, this message translates to:
  /// **'Entries ({count})'**
  String logEntries(int count);

  /// Credentials dialog title
  ///
  /// In en, this message translates to:
  /// **'Spotify Credentials'**
  String get credentialsTitle;

  /// Credentials dialog explanation
  ///
  /// In en, this message translates to:
  /// **'Enter your Client ID and Secret to use your own Spotify application quota.'**
  String get credentialsDescription;

  /// Client ID field label - DO NOT TRANSLATE
  ///
  /// In en, this message translates to:
  /// **'Client ID'**
  String get credentialsClientId;

  /// Client ID placeholder
  ///
  /// In en, this message translates to:
  /// **'Paste Client ID'**
  String get credentialsClientIdHint;

  /// Client Secret field label - DO NOT TRANSLATE
  ///
  /// In en, this message translates to:
  /// **'Client Secret'**
  String get credentialsClientSecret;

  /// Client Secret placeholder
  ///
  /// In en, this message translates to:
  /// **'Paste Client Secret'**
  String get credentialsClientSecretHint;

  /// Update channel - stable releases
  ///
  /// In en, this message translates to:
  /// **'Stable'**
  String get channelStable;

  /// Update channel - beta/preview releases
  ///
  /// In en, this message translates to:
  /// **'Preview'**
  String get channelPreview;

  /// Settings section header
  ///
  /// In en, this message translates to:
  /// **'Search Source'**
  String get sectionSearchSource;

  /// Settings section header
  ///
  /// In en, this message translates to:
  /// **'Download'**
  String get sectionDownload;

  /// Settings section header
  ///
  /// In en, this message translates to:
  /// **'Performance'**
  String get sectionPerformance;

  /// Settings section header
  ///
  /// In en, this message translates to:
  /// **'App'**
  String get sectionApp;

  /// Settings section header
  ///
  /// In en, this message translates to:
  /// **'Data'**
  String get sectionData;

  /// Settings section header
  ///
  /// In en, this message translates to:
  /// **'Debug'**
  String get sectionDebug;

  /// Settings section header
  ///
  /// In en, this message translates to:
  /// **'Service'**
  String get sectionService;

  /// Settings section header
  ///
  /// In en, this message translates to:
  /// **'Audio Quality'**
  String get sectionAudioQuality;

  /// Settings section header
  ///
  /// In en, this message translates to:
  /// **'File Settings'**
  String get sectionFileSettings;

  /// Settings section header
  ///
  /// In en, this message translates to:
  /// **'Lyrics'**
  String get sectionLyrics;

  /// Setting - how to save lyrics
  ///
  /// In en, this message translates to:
  /// **'Lyrics Mode'**
  String get lyricsMode;

  /// Lyrics mode picker description
  ///
  /// In en, this message translates to:
  /// **'Choose how lyrics are saved with your downloads'**
  String get lyricsModeDescription;

  /// Lyrics mode option - embed in audio file
  ///
  /// In en, this message translates to:
  /// **'Embed in file'**
  String get lyricsModeEmbed;

  /// Subtitle for embed option
  ///
  /// In en, this message translates to:
  /// **'Lyrics stored inside FLAC metadata'**
  String get lyricsModeEmbedSubtitle;

  /// Lyrics mode option - separate LRC file
  ///
  /// In en, this message translates to:
  /// **'External .lrc file'**
  String get lyricsModeExternal;

  /// Subtitle for external option
  ///
  /// In en, this message translates to:
  /// **'Separate .lrc file for players like Samsung Music'**
  String get lyricsModeExternalSubtitle;

  /// Lyrics mode option - embed and external
  ///
  /// In en, this message translates to:
  /// **'Both'**
  String get lyricsModeBoth;

  /// Subtitle for both option
  ///
  /// In en, this message translates to:
  /// **'Embed and save .lrc file'**
  String get lyricsModeBothSubtitle;

  /// Settings section header
  ///
  /// In en, this message translates to:
  /// **'Color'**
  String get sectionColor;

  /// Settings section header
  ///
  /// In en, this message translates to:
  /// **'Theme'**
  String get sectionTheme;

  /// Settings section header
  ///
  /// In en, this message translates to:
  /// **'Layout'**
  String get sectionLayout;

  /// Settings section header for language
  ///
  /// In en, this message translates to:
  /// **'Language'**
  String get sectionLanguage;

  /// Language setting title
  ///
  /// In en, this message translates to:
  /// **'App Language'**
  String get appearanceLanguage;

  /// Language setting subtitle
  ///
  /// In en, this message translates to:
  /// **'Choose your preferred language'**
  String get appearanceLanguageSubtitle;

  /// Appearance settings description
  ///
  /// In en, this message translates to:
  /// **'Theme, colors, display'**
  String get settingsAppearanceSubtitle;

  /// Download settings description
  ///
  /// In en, this message translates to:
  /// **'Service, quality, filename format'**
  String get settingsDownloadSubtitle;

  /// Options settings description
  ///
  /// In en, this message translates to:
  /// **'Fallback, lyrics, cover art, updates'**
  String get settingsOptionsSubtitle;

  /// Extensions settings description
  ///
  /// In en, this message translates to:
  /// **'Manage download providers'**
  String get settingsExtensionsSubtitle;

  /// Logs settings description
  ///
  /// In en, this message translates to:
  /// **'View app logs for debugging'**
  String get settingsLogsSubtitle;

  /// Status when opening shared URL
  ///
  /// In en, this message translates to:
  /// **'Loading shared link...'**
  String get loadingSharedLink;

  /// Exit confirmation message
  ///
  /// In en, this message translates to:
  /// **'Press back again to exit'**
  String get pressBackAgainToExit;

  /// Section header for track list
  ///
  /// In en, this message translates to:
  /// **'Tracks'**
  String get tracksHeader;

  /// Download all button with count
  ///
  /// In en, this message translates to:
  /// **'Download All ({count})'**
  String downloadAllCount(int count);

  /// Track count display
  ///
  /// In en, this message translates to:
  /// **'{count, plural, =1{1 track} other{{count} tracks}}'**
  String tracksCount(int count);

  /// Action - copy file path
  ///
  /// In en, this message translates to:
  /// **'Copy file path'**
  String get trackCopyFilePath;

  /// Action - delete downloaded file
  ///
  /// In en, this message translates to:
  /// **'Remove from device'**
  String get trackRemoveFromDevice;

  /// Action - fetch lyrics
  ///
  /// In en, this message translates to:
  /// **'Load Lyrics'**
  String get trackLoadLyrics;

  /// Tab title - track metadata
  ///
  /// In en, this message translates to:
  /// **'Metadata'**
  String get trackMetadata;

  /// Tab title - file information
  ///
  /// In en, this message translates to:
  /// **'File Info'**
  String get trackFileInfo;

  /// Tab title - lyrics
  ///
  /// In en, this message translates to:
  /// **'Lyrics'**
  String get trackLyrics;

  /// Error - file doesn't exist
  ///
  /// In en, this message translates to:
  /// **'File not found'**
  String get trackFileNotFound;

  /// Action - open track in Deezer app
  ///
  /// In en, this message translates to:
  /// **'Open in Deezer'**
  String get trackOpenInDeezer;

  /// Action - open track in Spotify app
  ///
  /// In en, this message translates to:
  /// **'Open in Spotify'**
  String get trackOpenInSpotify;

  /// Metadata label - track title
  ///
  /// In en, this message translates to:
  /// **'Track name'**
  String get trackTrackName;

  /// Metadata label - artist name
  ///
  /// In en, this message translates to:
  /// **'Artist'**
  String get trackArtist;

  /// Metadata label - album artist
  ///
  /// In en, this message translates to:
  /// **'Album artist'**
  String get trackAlbumArtist;

  /// Metadata label - album name
  ///
  /// In en, this message translates to:
  /// **'Album'**
  String get trackAlbum;

  /// Metadata label - track number
  ///
  /// In en, this message translates to:
  /// **'Track number'**
  String get trackTrackNumber;

  /// Metadata label - disc number
  ///
  /// In en, this message translates to:
  /// **'Disc number'**
  String get trackDiscNumber;

  /// Metadata label - track length
  ///
  /// In en, this message translates to:
  /// **'Duration'**
  String get trackDuration;

  /// Metadata label - audio quality
  ///
  /// In en, this message translates to:
  /// **'Audio quality'**
  String get trackAudioQuality;

  /// Metadata label - release date
  ///
  /// In en, this message translates to:
  /// **'Release date'**
  String get trackReleaseDate;

  /// Metadata label - music genre
  ///
  /// In en, this message translates to:
  /// **'Genre'**
  String get trackGenre;

  /// Metadata label - record label
  ///
  /// In en, this message translates to:
  /// **'Label'**
  String get trackLabel;

  /// Metadata label - copyright information
  ///
  /// In en, this message translates to:
  /// **'Copyright'**
  String get trackCopyright;

  /// Metadata label - download date
  ///
  /// In en, this message translates to:
  /// **'Downloaded'**
  String get trackDownloaded;

  /// Action - copy lyrics to clipboard
  ///
  /// In en, this message translates to:
  /// **'Copy lyrics'**
  String get trackCopyLyrics;

  /// Message when lyrics not found
  ///
  /// In en, this message translates to:
  /// **'Lyrics not available for this track'**
  String get trackLyricsNotAvailable;

  /// Message when lyrics request times out
  ///
  /// In en, this message translates to:
  /// **'Request timed out. Try again later.'**
  String get trackLyricsTimeout;

  /// Message when lyrics loading fails
  ///
  /// In en, this message translates to:
  /// **'Failed to load lyrics'**
  String get trackLyricsLoadFailed;

  /// Action - embed lyrics into audio file
  ///
  /// In en, this message translates to:
  /// **'Embed Lyrics'**
  String get trackEmbedLyrics;

  /// Snackbar - lyrics saved to file
  ///
  /// In en, this message translates to:
  /// **'Lyrics embedded successfully'**
  String get trackLyricsEmbedded;

  /// Message when track is instrumental (no lyrics)
  ///
  /// In en, this message translates to:
  /// **'Instrumental track'**
  String get trackInstrumental;

  /// Snackbar - content copied
  ///
  /// In en, this message translates to:
  /// **'Copied to clipboard'**
  String get trackCopiedToClipboard;

  /// Delete confirmation title
  ///
  /// In en, this message translates to:
  /// **'Remove from device?'**
  String get trackDeleteConfirmTitle;

  /// Delete confirmation message
  ///
  /// In en, this message translates to:
  /// **'This will permanently delete the downloaded file and remove it from your history.'**
  String get trackDeleteConfirmMessage;

  /// Error opening file
  ///
  /// In en, this message translates to:
  /// **'Cannot open: {message}'**
  String trackCannotOpen(String message);

  /// Relative date - today
  ///
  /// In en, this message translates to:
  /// **'Today'**
  String get dateToday;

  /// Relative date - yesterday
  ///
  /// In en, this message translates to:
  /// **'Yesterday'**
  String get dateYesterday;

  /// Relative date - days ago
  ///
  /// In en, this message translates to:
  /// **'{count} days ago'**
  String dateDaysAgo(int count);

  /// Relative date - weeks ago
  ///
  /// In en, this message translates to:
  /// **'{count} weeks ago'**
  String dateWeeksAgo(int count);

  /// Relative date - months ago
  ///
  /// In en, this message translates to:
  /// **'{count} months ago'**
  String dateMonthsAgo(int count);

  /// Download mode - one at a time
  ///
  /// In en, this message translates to:
  /// **'Sequential'**
  String get concurrentSequential;

  /// Download mode - 2 simultaneous
  ///
  /// In en, this message translates to:
  /// **'2 Parallel'**
  String get concurrentParallel2;

  /// Download mode - 3 simultaneous
  ///
  /// In en, this message translates to:
  /// **'3 Parallel'**
  String get concurrentParallel3;

  /// Tooltip for failed download
  ///
  /// In en, this message translates to:
  /// **'Tap to see error details'**
  String get tapToSeeError;

  /// Store filter - all extensions
  ///
  /// In en, this message translates to:
  /// **'All'**
  String get storeFilterAll;

  /// Store filter - metadata providers
  ///
  /// In en, this message translates to:
  /// **'Metadata'**
  String get storeFilterMetadata;

  /// Store filter - download providers
  ///
  /// In en, this message translates to:
  /// **'Download'**
  String get storeFilterDownload;

  /// Store filter - utility extensions
  ///
  /// In en, this message translates to:
  /// **'Utility'**
  String get storeFilterUtility;

  /// Store filter - lyrics providers
  ///
  /// In en, this message translates to:
  /// **'Lyrics'**
  String get storeFilterLyrics;

  /// Store filter - integrations
  ///
  /// In en, this message translates to:
  /// **'Integration'**
  String get storeFilterIntegration;

  /// Button to clear all filters
  ///
  /// In en, this message translates to:
  /// **'Clear filters'**
  String get storeClearFilters;

  /// Empty state when no extensions match filters
  ///
  /// In en, this message translates to:
  /// **'No extensions found'**
  String get storeNoResults;

  /// Extension capability - provider priority
  ///
  /// In en, this message translates to:
  /// **'Provider Priority'**
  String get extensionProviderPriority;

  /// Button to install extension
  ///
  /// In en, this message translates to:
  /// **'Install Extension'**
  String get extensionInstallButton;

  /// Default search provider option
  ///
  /// In en, this message translates to:
  /// **'Default (Deezer/Spotify)'**
  String get extensionDefaultProvider;

  /// Subtitle for default provider
  ///
  /// In en, this message translates to:
  /// **'Use built-in search'**
  String get extensionDefaultProviderSubtitle;

  /// Extension detail - author
  ///
  /// In en, this message translates to:
  /// **'Author'**
  String get extensionAuthor;

  /// Extension detail - unique ID
  ///
  /// In en, this message translates to:
  /// **'ID'**
  String get extensionId;

  /// Extension detail - error message
  ///
  /// In en, this message translates to:
  /// **'Error'**
  String get extensionError;

  /// Section header - extension features
  ///
  /// In en, this message translates to:
  /// **'Capabilities'**
  String get extensionCapabilities;

  /// Capability - provides metadata
  ///
  /// In en, this message translates to:
  /// **'Metadata Provider'**
  String get extensionMetadataProvider;

  /// Capability - provides downloads
  ///
  /// In en, this message translates to:
  /// **'Download Provider'**
  String get extensionDownloadProvider;

  /// Capability - provides lyrics
  ///
  /// In en, this message translates to:
  /// **'Lyrics Provider'**
  String get extensionLyricsProvider;

  /// Capability - handles URLs
  ///
  /// In en, this message translates to:
  /// **'URL Handler'**
  String get extensionUrlHandler;

  /// Capability - quality selection
  ///
  /// In en, this message translates to:
  /// **'Quality Options'**
  String get extensionQualityOptions;

  /// Capability - post-processing
  ///
  /// In en, this message translates to:
  /// **'Post-Processing Hooks'**
  String get extensionPostProcessingHooks;

  /// Section header - required permissions
  ///
  /// In en, this message translates to:
  /// **'Permissions'**
  String get extensionPermissions;

  /// Section header - extension settings
  ///
  /// In en, this message translates to:
  /// **'Settings'**
  String get extensionSettings;

  /// Button to uninstall extension
  ///
  /// In en, this message translates to:
  /// **'Remove Extension'**
  String get extensionRemoveButton;

  /// Extension detail - last update
  ///
  /// In en, this message translates to:
  /// **'Updated'**
  String get extensionUpdated;

  /// Extension detail - minimum app version
  ///
  /// In en, this message translates to:
  /// **'Min App Version'**
  String get extensionMinAppVersion;

  /// Capability - custom track matching algorithm
  ///
  /// In en, this message translates to:
  /// **'Custom Track Matching'**
  String get extensionCustomTrackMatching;

  /// Capability - post-download processing
  ///
  /// In en, this message translates to:
  /// **'Post-Processing'**
  String get extensionPostProcessing;

  /// Post-processing hooks count
  ///
  /// In en, this message translates to:
  /// **'{count} hook(s) available'**
  String extensionHooksAvailable(int count);

  /// URL patterns count
  ///
  /// In en, this message translates to:
  /// **'{count} pattern(s)'**
  String extensionPatternsCount(int count);

  /// Track matching strategy name
  ///
  /// In en, this message translates to:
  /// **'Strategy: {strategy}'**
  String extensionStrategy(String strategy);

  /// Section header - provider priority
  ///
  /// In en, this message translates to:
  /// **'Provider Priority'**
  String get extensionsProviderPrioritySection;

  /// Section header - installed extensions
  ///
  /// In en, this message translates to:
  /// **'Installed Extensions'**
  String get extensionsInstalledSection;

  /// Empty state - no extensions
  ///
  /// In en, this message translates to:
  /// **'No extensions installed'**
  String get extensionsNoExtensions;

  /// Empty state subtitle
  ///
  /// In en, this message translates to:
  /// **'Install .spotiflac-ext files to add new providers'**
  String get extensionsNoExtensionsSubtitle;

  /// Button to install extension from file
  ///
  /// In en, this message translates to:
  /// **'Install Extension'**
  String get extensionsInstallButton;

  /// Security warning about extensions
  ///
  /// In en, this message translates to:
  /// **'Extensions can add new metadata and download providers. Only install extensions from trusted sources.'**
  String get extensionsInfoTip;

  /// Success message after install
  ///
  /// In en, this message translates to:
  /// **'Extension installed successfully'**
  String get extensionsInstalledSuccess;

  /// Setting - download provider order
  ///
  /// In en, this message translates to:
  /// **'Download Priority'**
  String get extensionsDownloadPriority;

  /// Subtitle for download priority
  ///
  /// In en, this message translates to:
  /// **'Set download service order'**
  String get extensionsDownloadPrioritySubtitle;

  /// Empty state - no download providers
  ///
  /// In en, this message translates to:
  /// **'No extensions with download provider'**
  String get extensionsNoDownloadProvider;

  /// Setting - metadata provider order
  ///
  /// In en, this message translates to:
  /// **'Metadata Priority'**
  String get extensionsMetadataPriority;

  /// Subtitle for metadata priority
  ///
  /// In en, this message translates to:
  /// **'Set search & metadata source order'**
  String get extensionsMetadataPrioritySubtitle;

  /// Empty state - no metadata providers
  ///
  /// In en, this message translates to:
  /// **'No extensions with metadata provider'**
  String get extensionsNoMetadataProvider;

  /// Setting - search provider selection
  ///
  /// In en, this message translates to:
  /// **'Search Provider'**
  String get extensionsSearchProvider;

  /// Empty state - no search providers
  ///
  /// In en, this message translates to:
  /// **'No extensions with custom search'**
  String get extensionsNoCustomSearch;

  /// Search provider setting description
  ///
  /// In en, this message translates to:
  /// **'Choose which service to use for searching tracks'**
  String get extensionsSearchProviderDescription;

  /// Label for custom search provider
  ///
  /// In en, this message translates to:
  /// **'Custom search'**
  String get extensionsCustomSearch;

  /// Error message when extension fails to load
  ///
  /// In en, this message translates to:
  /// **'Error loading extension'**
  String get extensionsErrorLoading;

  /// Quality option - CD quality FLAC
  ///
  /// In en, this message translates to:
  /// **'FLAC Lossless'**
  String get qualityFlacLossless;

  /// Technical spec for lossless
  ///
  /// In en, this message translates to:
  /// **'16-bit / 44.1kHz'**
  String get qualityFlacLosslessSubtitle;

  /// Quality option - high resolution FLAC
  ///
  /// In en, this message translates to:
  /// **'Hi-Res FLAC'**
  String get qualityHiResFlac;

  /// Technical spec for hi-res
  ///
  /// In en, this message translates to:
  /// **'24-bit / up to 96kHz'**
  String get qualityHiResFlacSubtitle;

  /// Quality option - maximum resolution FLAC
  ///
  /// In en, this message translates to:
  /// **'Hi-Res FLAC Max'**
  String get qualityHiResFlacMax;

  /// Technical spec for hi-res max
  ///
  /// In en, this message translates to:
  /// **'24-bit / up to 192kHz'**
  String get qualityHiResFlacMaxSubtitle;

  /// Quality option - lossy format (MP3/Opus)
  ///
  /// In en, this message translates to:
  /// **'Lossy'**
  String get qualityLossy;

  /// Technical spec for lossy MP3
  ///
  /// In en, this message translates to:
  /// **'MP3 320kbps (converted from FLAC)'**
  String get qualityLossyMp3Subtitle;

  /// Technical spec for lossy Opus
  ///
  /// In en, this message translates to:
  /// **'Opus 128kbps (converted from FLAC)'**
  String get qualityLossyOpusSubtitle;

  /// Setting - enable lossy quality option
  ///
  /// In en, this message translates to:
  /// **'Enable Lossy Option'**
  String get enableLossyOption;

  /// Subtitle when lossy is enabled
  ///
  /// In en, this message translates to:
  /// **'Lossy quality option is available'**
  String get enableLossyOptionSubtitleOn;

  /// Subtitle when lossy is disabled
  ///
  /// In en, this message translates to:
  /// **'Downloads FLAC then converts to lossy format'**
  String get enableLossyOptionSubtitleOff;

  /// Setting - choose lossy format
  ///
  /// In en, this message translates to:
  /// **'Lossy Format'**
  String get lossyFormat;

  /// Description for lossy format picker
  ///
  /// In en, this message translates to:
  /// **'Choose the lossy format for conversion'**
  String get lossyFormatDescription;

  /// MP3 format description
  ///
  /// In en, this message translates to:
  /// **'320kbps, best compatibility'**
  String get lossyFormatMp3Subtitle;

  /// Opus format description
  ///
  /// In en, this message translates to:
  /// **'128kbps, better quality at smaller size'**
  String get lossyFormatOpusSubtitle;

  /// Note about quality availability
  ///
  /// In en, this message translates to:
  /// **'Actual quality depends on track availability from the service'**
  String get qualityNote;

  /// Note for YouTube service explaining lossy-only quality
  ///
  /// In en, this message translates to:
  /// **'YouTube provides lossy audio only. Not part of lossless fallback.'**
  String get youtubeQualityNote;

  /// Setting - show quality picker
  ///
  /// In en, this message translates to:
  /// **'Ask Before Download'**
  String get downloadAskBeforeDownload;

  /// Setting - download folder
  ///
  /// In en, this message translates to:
  /// **'Download Directory'**
  String get downloadDirectory;

  /// Setting - separate folder for singles
  ///
  /// In en, this message translates to:
  /// **'Separate Singles Folder'**
  String get downloadSeparateSinglesFolder;

  /// Setting - album folder organization
  ///
  /// In en, this message translates to:
  /// **'Album Folder Structure'**
  String get downloadAlbumFolderStructure;

  /// Setting - choose whether artist folders use Album Artist or Track Artist
  ///
  /// In en, this message translates to:
  /// **'Use Album Artist for folders'**
  String get downloadUseAlbumArtistForFolders;

  /// Subtitle when Album Artist is used for folder naming
  ///
  /// In en, this message translates to:
  /// **'Artist folders use Album Artist when available'**
  String get downloadUseAlbumArtistForFoldersAlbumSubtitle;

  /// Subtitle when Track Artist is used for folder naming
  ///
  /// In en, this message translates to:
  /// **'Artist folders use Track Artist only'**
  String get downloadUseAlbumArtistForFoldersTrackSubtitle;

  /// Setting - strip featured artists from folder name
  ///
  /// In en, this message translates to:
  /// **'Primary artist only for folders'**
  String get downloadUsePrimaryArtistOnly;

  /// Subtitle when primary artist only is enabled
  ///
  /// In en, this message translates to:
  /// **'Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)'**
  String get downloadUsePrimaryArtistOnlyEnabled;

  /// Subtitle when primary artist only is disabled
  ///
  /// In en, this message translates to:
  /// **'Full artist string used for folder name'**
  String get downloadUsePrimaryArtistOnlyDisabled;

  /// Setting - output file format
  ///
  /// In en, this message translates to:
  /// **'Save Format'**
  String get downloadSaveFormat;

  /// Dialog title - choose download service
  ///
  /// In en, this message translates to:
  /// **'Select Service'**
  String get downloadSelectService;

  /// Dialog title - choose audio quality
  ///
  /// In en, this message translates to:
  /// **'Select Quality'**
  String get downloadSelectQuality;

  /// Label - download source
  ///
  /// In en, this message translates to:
  /// **'Download From'**
  String get downloadFrom;

  /// Label - default quality setting
  ///
  /// In en, this message translates to:
  /// **'Default Quality'**
  String get downloadDefaultQualityLabel;

  /// Quality option - highest available
  ///
  /// In en, this message translates to:
  /// **'Best available'**
  String get downloadBestAvailable;

  /// Folder option - no organization
  ///
  /// In en, this message translates to:
  /// **'None'**
  String get folderNone;

  /// Subtitle for no folder organization
  ///
  /// In en, this message translates to:
  /// **'Save all files directly to download folder'**
  String get folderNoneSubtitle;

  /// Folder option - by artist
  ///
  /// In en, this message translates to:
  /// **'Artist'**
  String get folderArtist;

  /// Folder structure example
  ///
  /// In en, this message translates to:
  /// **'Artist Name/filename'**
  String get folderArtistSubtitle;

  /// Folder option - by album
  ///
  /// In en, this message translates to:
  /// **'Album'**
  String get folderAlbum;

  /// Folder structure example
  ///
  /// In en, this message translates to:
  /// **'Album Name/filename'**
  String get folderAlbumSubtitle;

  /// Folder option - nested
  ///
  /// In en, this message translates to:
  /// **'Artist/Album'**
  String get folderArtistAlbum;

  /// Folder structure example
  ///
  /// In en, this message translates to:
  /// **'Artist Name/Album Name/filename'**
  String get folderArtistAlbumSubtitle;

  /// Service name - DO NOT TRANSLATE
  ///
  /// In en, this message translates to:
  /// **'Tidal'**
  String get serviceTidal;

  /// Service name - DO NOT TRANSLATE
  ///
  /// In en, this message translates to:
  /// **'Qobuz'**
  String get serviceQobuz;

  /// Service name - DO NOT TRANSLATE
  ///
  /// In en, this message translates to:
  /// **'Amazon'**
  String get serviceAmazon;

  /// Service name - DO NOT TRANSLATE
  ///
  /// In en, this message translates to:
  /// **'Deezer'**
  String get serviceDeezer;

  /// Service name - DO NOT TRANSLATE
  ///
  /// In en, this message translates to:
  /// **'Spotify'**
  String get serviceSpotify;

  /// Theme option - pure black
  ///
  /// In en, this message translates to:
  /// **'AMOLED Dark'**
  String get appearanceAmoledDark;

  /// Subtitle for AMOLED dark
  ///
  /// In en, this message translates to:
  /// **'Pure black background'**
  String get appearanceAmoledDarkSubtitle;

  /// Color picker dialog title
  ///
  /// In en, this message translates to:
  /// **'Choose Accent Color'**
  String get appearanceChooseAccentColor;

  /// Theme picker dialog title
  ///
  /// In en, this message translates to:
  /// **'Theme Mode'**
  String get appearanceChooseTheme;

  /// Queue screen title
  ///
  /// In en, this message translates to:
  /// **'Download Queue'**
  String get queueTitle;

  /// Button - clear all queue items
  ///
  /// In en, this message translates to:
  /// **'Clear All'**
  String get queueClearAll;

  /// Clear queue confirmation
  ///
  /// In en, this message translates to:
  /// **'Are you sure you want to clear all downloads?'**
  String get queueClearAllMessage;

  /// Button - export failed downloads to TXT
  ///
  /// In en, this message translates to:
  /// **'Export'**
  String get queueExportFailed;

  /// Success message after exporting failed downloads
  ///
  /// In en, this message translates to:
  /// **'Failed downloads exported to TXT file'**
  String get queueExportFailedSuccess;

  /// Action to clear failed downloads after export
  ///
  /// In en, this message translates to:
  /// **'Clear Failed'**
  String get queueExportFailedClear;

  /// Error message when export fails
  ///
  /// In en, this message translates to:
  /// **'Failed to export downloads'**
  String get queueExportFailedError;

  /// Setting toggle for auto-export
  ///
  /// In en, this message translates to:
  /// **'Auto-export failed downloads'**
  String get settingsAutoExportFailed;

  /// Subtitle for auto-export setting
  ///
  /// In en, this message translates to:
  /// **'Save failed downloads to TXT file automatically'**
  String get settingsAutoExportFailedSubtitle;

  /// Setting for network type preference
  ///
  /// In en, this message translates to:
  /// **'Download Network'**
  String get settingsDownloadNetwork;

  /// Network option - use any connection
  ///
  /// In en, this message translates to:
  /// **'WiFi + Mobile Data'**
  String get settingsDownloadNetworkAny;

  /// Network option - only use WiFi
  ///
  /// In en, this message translates to:
  /// **'WiFi Only'**
  String get settingsDownloadNetworkWifiOnly;

  /// Subtitle explaining network preference
  ///
  /// In en, this message translates to:
  /// **'Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.'**
  String get settingsDownloadNetworkSubtitle;

  /// Empty queue state title
  ///
  /// In en, this message translates to:
  /// **'No downloads in queue'**
  String get queueEmpty;

  /// Empty queue state subtitle
  ///
  /// In en, this message translates to:
  /// **'Add tracks from the home screen'**
  String get queueEmptySubtitle;

  /// Button - clear finished downloads
  ///
  /// In en, this message translates to:
  /// **'Clear completed'**
  String get queueClearCompleted;

  /// Error dialog title
  ///
  /// In en, this message translates to:
  /// **'Download Failed'**
  String get queueDownloadFailed;

  /// Label in error dialog
  ///
  /// In en, this message translates to:
  /// **'Track:'**
  String get queueTrackLabel;

  /// Label in error dialog
  ///
  /// In en, this message translates to:
  /// **'Artist:'**
  String get queueArtistLabel;

  /// Label in error dialog
  ///
  /// In en, this message translates to:
  /// **'Error:'**
  String get queueErrorLabel;

  /// Fallback error message
  ///
  /// In en, this message translates to:
  /// **'Unknown error'**
  String get queueUnknownError;

  /// Album folder option
  ///
  /// In en, this message translates to:
  /// **'Artist / Album'**
  String get albumFolderArtistAlbum;

  /// Folder structure example
  ///
  /// In en, this message translates to:
  /// **'Albums/Artist Name/Album Name/'**
  String get albumFolderArtistAlbumSubtitle;

  /// Album folder option with year
  ///
  /// In en, this message translates to:
  /// **'Artist / [Year] Album'**
  String get albumFolderArtistYearAlbum;

  /// Folder structure example
  ///
  /// In en, this message translates to:
  /// **'Albums/Artist Name/[2005] Album Name/'**
  String get albumFolderArtistYearAlbumSubtitle;

  /// Album folder option
  ///
  /// In en, this message translates to:
  /// **'Album Only'**
  String get albumFolderAlbumOnly;

  /// Folder structure example
  ///
  /// In en, this message translates to:
  /// **'Albums/Album Name/'**
  String get albumFolderAlbumOnlySubtitle;

  /// Album folder option with year
  ///
  /// In en, this message translates to:
  /// **'[Year] Album'**
  String get albumFolderYearAlbum;

  /// Folder structure example
  ///
  /// In en, this message translates to:
  /// **'Albums/[2005] Album Name/'**
  String get albumFolderYearAlbumSubtitle;

  /// Album folder option with singles inside artist
  ///
  /// In en, this message translates to:
  /// **'Artist / Album + Singles'**
  String get albumFolderArtistAlbumSingles;

  /// Folder structure example
  ///
  /// In en, this message translates to:
  /// **'Artist/Album/ and Artist/Singles/'**
  String get albumFolderArtistAlbumSinglesSubtitle;

  /// Button - delete selected tracks
  ///
  /// In en, this message translates to:
  /// **'Delete Selected'**
  String get downloadedAlbumDeleteSelected;

  /// Delete confirmation with count
  ///
  /// In en, this message translates to:
  /// **'Delete {count} {count, plural, =1{track} other{tracks}} from this album?\n\nThis will also delete the files from storage.'**
  String downloadedAlbumDeleteMessage(int count);

  /// Section header for tracks
  ///
  /// In en, this message translates to:
  /// **'Tracks'**
  String get downloadedAlbumTracksHeader;

  /// Downloaded tracks count badge
  ///
  /// In en, this message translates to:
  /// **'{count} downloaded'**
  String downloadedAlbumDownloadedCount(int count);

  /// Selection count indicator
  ///
  /// In en, this message translates to:
  /// **'{count} selected'**
  String downloadedAlbumSelectedCount(int count);

  /// Status - all items selected
  ///
  /// In en, this message translates to:
  /// **'All tracks selected'**
  String get downloadedAlbumAllSelected;

  /// Selection hint
  ///
  /// In en, this message translates to:
  /// **'Tap tracks to select'**
  String get downloadedAlbumTapToSelect;

  /// Delete button text with count
  ///
  /// In en, this message translates to:
  /// **'Delete {count} {count, plural, =1{track} other{tracks}}'**
  String downloadedAlbumDeleteCount(int count);

  /// Placeholder when nothing selected
  ///
  /// In en, this message translates to:
  /// **'Select tracks to delete'**
  String get downloadedAlbumSelectToDelete;

  /// Header for disc separator in multi-disc albums
  ///
  /// In en, this message translates to:
  /// **'Disc {discNumber}'**
  String downloadedAlbumDiscHeader(int discNumber);

  /// Extension capability - utility functions
  ///
  /// In en, this message translates to:
  /// **'Utility Functions'**
  String get utilityFunctions;

  /// Recent access item type - artist
  ///
  /// In en, this message translates to:
  /// **'Artist'**
  String get recentTypeArtist;

  /// Recent access item type - album
  ///
  /// In en, this message translates to:
  /// **'Album'**
  String get recentTypeAlbum;

  /// Recent access item type - song/track
  ///
  /// In en, this message translates to:
  /// **'Song'**
  String get recentTypeSong;

  /// Recent access item type - playlist
  ///
  /// In en, this message translates to:
  /// **'Playlist'**
  String get recentTypePlaylist;

  /// Empty state text for recent access list
  ///
  /// In en, this message translates to:
  /// **'No recent items yet'**
  String get recentEmpty;

  /// Button label to unhide hidden downloads in recent access
  ///
  /// In en, this message translates to:
  /// **'Show All Downloads'**
  String get recentShowAllDownloads;

  /// Snackbar message when tapping playlist in recent access
  ///
  /// In en, this message translates to:
  /// **'Playlist: {name}'**
  String recentPlaylistInfo(String name);

  /// Generic error message format
  ///
  /// In en, this message translates to:
  /// **'Error: {message}'**
  String errorGeneric(String message);

  /// Button - download artist discography
  ///
  /// In en, this message translates to:
  /// **'Download Discography'**
  String get discographyDownload;

  /// Option - download entire discography
  ///
  /// In en, this message translates to:
  /// **'Download All'**
  String get discographyDownloadAll;

  /// Subtitle showing total tracks and albums
  ///
  /// In en, this message translates to:
  /// **'{count} tracks from {albumCount} releases'**
  String discographyDownloadAllSubtitle(int count, int albumCount);

  /// Option - download only albums
  ///
  /// In en, this message translates to:
  /// **'Albums Only'**
  String get discographyAlbumsOnly;

  /// Subtitle showing album tracks count
  ///
  /// In en, this message translates to:
  /// **'{count} tracks from {albumCount} albums'**
  String discographyAlbumsOnlySubtitle(int count, int albumCount);

  /// Option - download only singles
  ///
  /// In en, this message translates to:
  /// **'Singles & EPs Only'**
  String get discographySinglesOnly;

  /// Subtitle showing singles tracks count
  ///
  /// In en, this message translates to:
  /// **'{count} tracks from {albumCount} singles'**
  String discographySinglesOnlySubtitle(int count, int albumCount);

  /// Option - manually select albums to download
  ///
  /// In en, this message translates to:
  /// **'Select Albums...'**
  String get discographySelectAlbums;

  /// Subtitle for select albums option
  ///
  /// In en, this message translates to:
  /// **'Choose specific albums or singles'**
  String get discographySelectAlbumsSubtitle;

  /// Progress - fetching album tracks
  ///
  /// In en, this message translates to:
  /// **'Fetching tracks...'**
  String get discographyFetchingTracks;

  /// Progress - fetching specific album
  ///
  /// In en, this message translates to:
  /// **'Fetching {current} of {total}...'**
  String discographyFetchingAlbum(int current, int total);

  /// Selection count badge
  ///
  /// In en, this message translates to:
  /// **'{count} selected'**
  String discographySelectedCount(int count);

  /// Button - download selected albums
  ///
  /// In en, this message translates to:
  /// **'Download Selected'**
  String get discographyDownloadSelected;

  /// Snackbar - tracks added from discography
  ///
  /// In en, this message translates to:
  /// **'Added {count} tracks to queue'**
  String discographyAddedToQueue(int count);

  /// Snackbar - with skipped tracks count
  ///
  /// In en, this message translates to:
  /// **'{added} added, {skipped} already downloaded'**
  String discographySkippedDownloaded(int added, int skipped);

  /// Error - no albums found for artist
  ///
  /// In en, this message translates to:
  /// **'No albums available'**
  String get discographyNoAlbums;

  /// Error - some albums failed to load
  ///
  /// In en, this message translates to:
  /// **'Failed to fetch some albums'**
  String get discographyFailedToFetch;

  /// Section header for storage access settings
  ///
  /// In en, this message translates to:
  /// **'Storage Access'**
  String get sectionStorageAccess;

  /// Toggle for MANAGE_EXTERNAL_STORAGE permission
  ///
  /// In en, this message translates to:
  /// **'All Files Access'**
  String get allFilesAccess;

  /// Subtitle when all files access is enabled
  ///
  /// In en, this message translates to:
  /// **'Can write to any folder'**
  String get allFilesAccessEnabledSubtitle;

  /// Subtitle when all files access is disabled
  ///
  /// In en, this message translates to:
  /// **'Limited to media folders only'**
  String get allFilesAccessDisabledSubtitle;

  /// Description explaining when to enable all files access
  ///
  /// In en, this message translates to:
  /// **'Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.'**
  String get allFilesAccessDescription;

  /// Message when permission is permanently denied
  ///
  /// In en, this message translates to:
  /// **'Permission was denied. Please enable \'All files access\' manually in system settings.'**
  String get allFilesAccessDeniedMessage;

  /// Snackbar message when user disables all files access
  ///
  /// In en, this message translates to:
  /// **'All Files Access disabled. The app will use limited storage access.'**
  String get allFilesAccessDisabledMessage;

  /// Settings menu item - local library
  ///
  /// In en, this message translates to:
  /// **'Local Library'**
  String get settingsLocalLibrary;

  /// Subtitle for local library settings
  ///
  /// In en, this message translates to:
  /// **'Scan music & detect duplicates'**
  String get settingsLocalLibrarySubtitle;

  /// Settings menu item - cache management
  ///
  /// In en, this message translates to:
  /// **'Storage & Cache'**
  String get settingsCache;

  /// Subtitle for cache management menu
  ///
  /// In en, this message translates to:
  /// **'View size and clear cached data'**
  String get settingsCacheSubtitle;

  /// Library settings page title
  ///
  /// In en, this message translates to:
  /// **'Local Library'**
  String get libraryTitle;

  /// Section header for library status
  ///
  /// In en, this message translates to:
  /// **'Library Status'**
  String get libraryStatus;

  /// Section header for scan settings
  ///
  /// In en, this message translates to:
  /// **'Scan Settings'**
  String get libraryScanSettings;

  /// Toggle to enable library scanning
  ///
  /// In en, this message translates to:
  /// **'Enable Local Library'**
  String get libraryEnableLocalLibrary;

  /// Subtitle for enable toggle
  ///
  /// In en, this message translates to:
  /// **'Scan and track your existing music'**
  String get libraryEnableLocalLibrarySubtitle;

  /// Folder selection setting
  ///
  /// In en, this message translates to:
  /// **'Library Folder'**
  String get libraryFolder;

  /// Placeholder when no folder selected
  ///
  /// In en, this message translates to:
  /// **'Tap to select folder'**
  String get libraryFolderHint;

  /// Toggle for duplicate indicator in search
  ///
  /// In en, this message translates to:
  /// **'Show Duplicate Indicator'**
  String get libraryShowDuplicateIndicator;

  /// Subtitle for duplicate indicator toggle
  ///
  /// In en, this message translates to:
  /// **'Show when searching for existing tracks'**
  String get libraryShowDuplicateIndicatorSubtitle;

  /// Section header for library actions
  ///
  /// In en, this message translates to:
  /// **'Actions'**
  String get libraryActions;

  /// Button to start library scan
  ///
  /// In en, this message translates to:
  /// **'Scan Library'**
  String get libraryScan;

  /// Subtitle for scan button
  ///
  /// In en, this message translates to:
  /// **'Scan for audio files'**
  String get libraryScanSubtitle;

  /// Message when trying to scan without folder
  ///
  /// In en, this message translates to:
  /// **'Select a folder first'**
  String get libraryScanSelectFolderFirst;

  /// Button to remove entries for missing files
  ///
  /// In en, this message translates to:
  /// **'Cleanup Missing Files'**
  String get libraryCleanupMissingFiles;

  /// Subtitle for cleanup button
  ///
  /// In en, this message translates to:
  /// **'Remove entries for files that no longer exist'**
  String get libraryCleanupMissingFilesSubtitle;

  /// Button to clear all library entries
  ///
  /// In en, this message translates to:
  /// **'Clear Library'**
  String get libraryClear;

  /// Subtitle for clear button
  ///
  /// In en, this message translates to:
  /// **'Remove all scanned tracks'**
  String get libraryClearSubtitle;

  /// Dialog title for clear confirmation
  ///
  /// In en, this message translates to:
  /// **'Clear Library'**
  String get libraryClearConfirmTitle;

  /// Dialog message for clear confirmation
  ///
  /// In en, this message translates to:
  /// **'This will remove all scanned tracks from your library. Your actual music files will not be deleted.'**
  String get libraryClearConfirmMessage;

  /// Section header for about info
  ///
  /// In en, this message translates to:
  /// **'About Local Library'**
  String get libraryAbout;

  /// Description of local library feature
  ///
  /// In en, this message translates to:
  /// **'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.'**
  String get libraryAboutDescription;

  /// Track count in library
  ///
  /// In en, this message translates to:
  /// **'{count} tracks'**
  String libraryTracksCount(int count);

  /// Last scan time display
  ///
  /// In en, this message translates to:
  /// **'Last scanned: {time}'**
  String libraryLastScanned(String time);

  /// Shown when library has never been scanned
  ///
  /// In en, this message translates to:
  /// **'Never'**
  String get libraryLastScannedNever;

  /// Status during scan
  ///
  /// In en, this message translates to:
  /// **'Scanning...'**
  String get libraryScanning;

  /// Scan progress display
  ///
  /// In en, this message translates to:
  /// **'{progress}% of {total} files'**
  String libraryScanProgress(String progress, int total);

  /// Badge shown on tracks that exist in local library
  ///
  /// In en, this message translates to:
  /// **'In Library'**
  String get libraryInLibrary;

  /// Snackbar after cleanup
  ///
  /// In en, this message translates to:
  /// **'Removed {count} missing files from library'**
  String libraryRemovedMissingFiles(int count);

  /// Snackbar after clearing library
  ///
  /// In en, this message translates to:
  /// **'Library cleared'**
  String get libraryCleared;

  /// Dialog title for storage permission
  ///
  /// In en, this message translates to:
  /// **'Storage Access Required'**
  String get libraryStorageAccessRequired;

  /// Dialog message for storage permission
  ///
  /// In en, this message translates to:
  /// **'SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.'**
  String get libraryStorageAccessMessage;

  /// Error when folder doesn't exist
  ///
  /// In en, this message translates to:
  /// **'Selected folder does not exist'**
  String get libraryFolderNotExist;

  /// Badge for tracks downloaded via SpotiFLAC
  ///
  /// In en, this message translates to:
  /// **'Downloaded'**
  String get librarySourceDownloaded;

  /// Badge for tracks from local library scan
  ///
  /// In en, this message translates to:
  /// **'Local'**
  String get librarySourceLocal;

  /// Filter chip - show all library items
  ///
  /// In en, this message translates to:
  /// **'All'**
  String get libraryFilterAll;

  /// Filter chip - show only downloaded items
  ///
  /// In en, this message translates to:
  /// **'Downloaded'**
  String get libraryFilterDownloaded;

  /// Filter chip - show only local library items
  ///
  /// In en, this message translates to:
  /// **'Local'**
  String get libraryFilterLocal;

  /// Filter bottom sheet title
  ///
  /// In en, this message translates to:
  /// **'Filters'**
  String get libraryFilterTitle;

  /// Reset all filters button
  ///
  /// In en, this message translates to:
  /// **'Reset'**
  String get libraryFilterReset;

  /// Apply filters button
  ///
  /// In en, this message translates to:
  /// **'Apply'**
  String get libraryFilterApply;

  /// Filter section - source type
  ///
  /// In en, this message translates to:
  /// **'Source'**
  String get libraryFilterSource;

  /// Filter section - audio quality
  ///
  /// In en, this message translates to:
  /// **'Quality'**
  String get libraryFilterQuality;

  /// Filter option - high resolution audio
  ///
  /// In en, this message translates to:
  /// **'Hi-Res (24bit)'**
  String get libraryFilterQualityHiRes;

  /// Filter option - CD quality audio
  ///
  /// In en, this message translates to:
  /// **'CD (16bit)'**
  String get libraryFilterQualityCD;

  /// Filter option - lossy compressed audio
  ///
  /// In en, this message translates to:
  /// **'Lossy'**
  String get libraryFilterQualityLossy;

  /// Filter section - file format
  ///
  /// In en, this message translates to:
  /// **'Format'**
  String get libraryFilterFormat;

  /// Filter section - date range
  ///
  /// In en, this message translates to:
  /// **'Date Added'**
  String get libraryFilterDate;

  /// Filter option - today only
  ///
  /// In en, this message translates to:
  /// **'Today'**
  String get libraryFilterDateToday;

  /// Filter option - this week
  ///
  /// In en, this message translates to:
  /// **'This Week'**
  String get libraryFilterDateWeek;

  /// Filter option - this month
  ///
  /// In en, this message translates to:
  /// **'This Month'**
  String get libraryFilterDateMonth;

  /// Filter option - this year
  ///
  /// In en, this message translates to:
  /// **'This Year'**
  String get libraryFilterDateYear;

  /// Filter section - sort order
  ///
  /// In en, this message translates to:
  /// **'Sort'**
  String get libraryFilterSort;

  /// Sort option - newest first
  ///
  /// In en, this message translates to:
  /// **'Latest'**
  String get libraryFilterSortLatest;

  /// Sort option - oldest first
  ///
  /// In en, this message translates to:
  /// **'Oldest'**
  String get libraryFilterSortOldest;

  /// Badge showing number of active filters
  ///
  /// In en, this message translates to:
  /// **'{count} filter(s) active'**
  String libraryFilterActive(int count);

  /// Relative time - less than a minute ago
  ///
  /// In en, this message translates to:
  /// **'Just now'**
  String get timeJustNow;

  /// Relative time - minutes ago
  ///
  /// In en, this message translates to:
  /// **'{count, plural, =1{1 minute ago} other{{count} minutes ago}}'**
  String timeMinutesAgo(int count);

  /// Relative time - hours ago
  ///
  /// In en, this message translates to:
  /// **'{count, plural, =1{1 hour ago} other{{count} hours ago}}'**
  String timeHoursAgo(int count);

  /// Dialog title when switching storage mode
  ///
  /// In en, this message translates to:
  /// **'Switch Storage Mode'**
  String get storageSwitchTitle;

  /// Dialog title when switching to SAF
  ///
  /// In en, this message translates to:
  /// **'Switch to SAF Storage?'**
  String get storageSwitchToSafTitle;

  /// Dialog title when switching to app storage
  ///
  /// In en, this message translates to:
  /// **'Switch to App Storage?'**
  String get storageSwitchToAppTitle;

  /// Explanation when switching to SAF
  ///
  /// In en, this message translates to:
  /// **'Your existing downloads will remain in the current location and stay accessible.\n\nNew downloads will be saved to your selected SAF folder.'**
  String get storageSwitchToSafMessage;

  /// Explanation when switching to app storage
  ///
  /// In en, this message translates to:
  /// **'Your existing downloads will remain in the current SAF location and stay accessible.\n\nNew downloads will be saved to Music/SpotiFLAC folder.'**
  String get storageSwitchToAppMessage;

  /// Section header for existing downloads info
  ///
  /// In en, this message translates to:
  /// **'Existing Downloads'**
  String get storageSwitchExistingDownloads;

  /// Info about existing downloads count
  ///
  /// In en, this message translates to:
  /// **'{count} tracks in {mode} storage'**
  String storageSwitchExistingDownloadsInfo(int count, String mode);

  /// Section header for new downloads info
  ///
  /// In en, this message translates to:
  /// **'New Downloads'**
  String get storageSwitchNewDownloads;

  /// Shows where new downloads will go
  ///
  /// In en, this message translates to:
  /// **'Will be saved to: {location}'**
  String storageSwitchNewDownloadsLocation(String location);

  /// Button to proceed with storage switch
  ///
  /// In en, this message translates to:
  /// **'Continue'**
  String get storageSwitchContinue;

  /// Button to select SAF folder
  ///
  /// In en, this message translates to:
  /// **'Select SAF Folder'**
  String get storageSwitchSelectFolder;

  /// Label for app storage mode
  ///
  /// In en, this message translates to:
  /// **'App Storage'**
  String get storageAppStorage;

  /// Label for SAF storage mode
  ///
  /// In en, this message translates to:
  /// **'SAF Storage'**
  String get storageSafStorage;

  /// Badge showing storage mode for a track
  ///
  /// In en, this message translates to:
  /// **'Storage: {mode}'**
  String storageModeBadge(String mode);

  /// Section title for storage stats
  ///
  /// In en, this message translates to:
  /// **'Storage Statistics'**
  String get storageStatsTitle;

  /// Count of tracks in app storage
  ///
  /// In en, this message translates to:
  /// **'{count} tracks in App Storage'**
  String storageStatsAppCount(int count);

  /// Count of tracks in SAF storage
  ///
  /// In en, this message translates to:
  /// **'{count} tracks in SAF Storage'**
  String storageStatsSafCount(int count);

  /// Info when user has files in both storage modes
  ///
  /// In en, this message translates to:
  /// **'Your files are stored in multiple locations'**
  String get storageModeInfo;

  /// Tutorial welcome page title
  ///
  /// In en, this message translates to:
  /// **'Welcome to SpotiFLAC!'**
  String get tutorialWelcomeTitle;

  /// Tutorial welcome page description
  ///
  /// In en, this message translates to:
  /// **'Let\'s learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.'**
  String get tutorialWelcomeDesc;

  /// Tutorial welcome tip 1
  ///
  /// In en, this message translates to:
  /// **'Download music from Spotify, Deezer, or paste any supported URL'**
  String get tutorialWelcomeTip1;

  /// Tutorial welcome tip 2
  ///
  /// In en, this message translates to:
  /// **'Get FLAC quality audio from Tidal, Qobuz, or Amazon Music'**
  String get tutorialWelcomeTip2;

  /// Tutorial welcome tip 3
  ///
  /// In en, this message translates to:
  /// **'Automatic metadata, cover art, and lyrics embedding'**
  String get tutorialWelcomeTip3;

  /// Tutorial search page title
  ///
  /// In en, this message translates to:
  /// **'Finding Music'**
  String get tutorialSearchTitle;

  /// Tutorial search page description
  ///
  /// In en, this message translates to:
  /// **'There are two easy ways to find music you want to download.'**
  String get tutorialSearchDesc;

  /// Tutorial search tip 1
  ///
  /// In en, this message translates to:
  /// **'Paste a Spotify or Deezer URL directly in the search box'**
  String get tutorialSearchTip1;

  /// Tutorial search tip 2
  ///
  /// In en, this message translates to:
  /// **'Or type the song name, artist, or album to search'**
  String get tutorialSearchTip2;

  /// Tutorial search tip 3
  ///
  /// In en, this message translates to:
  /// **'Supports tracks, albums, playlists, and artist pages'**
  String get tutorialSearchTip3;

  /// Tutorial download page title
  ///
  /// In en, this message translates to:
  /// **'Downloading Music'**
  String get tutorialDownloadTitle;

  /// Tutorial download page description
  ///
  /// In en, this message translates to:
  /// **'Downloading music is simple and fast. Here\'s how it works.'**
  String get tutorialDownloadDesc;

  /// Tutorial download tip 1
  ///
  /// In en, this message translates to:
  /// **'Tap the download button next to any track to start downloading'**
  String get tutorialDownloadTip1;

  /// Tutorial download tip 2
  ///
  /// In en, this message translates to:
  /// **'Choose your preferred quality (FLAC, Hi-Res, or MP3)'**
  String get tutorialDownloadTip2;

  /// Tutorial download tip 3
  ///
  /// In en, this message translates to:
  /// **'Download entire albums or playlists with one tap'**
  String get tutorialDownloadTip3;

  /// Tutorial library page title
  ///
  /// In en, this message translates to:
  /// **'Your Library'**
  String get tutorialLibraryTitle;

  /// Tutorial library page description
  ///
  /// In en, this message translates to:
  /// **'All your downloaded music is organized in the Library tab.'**
  String get tutorialLibraryDesc;

  /// Tutorial library tip 1
  ///
  /// In en, this message translates to:
  /// **'View download progress and queue in the Library tab'**
  String get tutorialLibraryTip1;

  /// Tutorial library tip 2
  ///
  /// In en, this message translates to:
  /// **'Tap any track to play it with your music player'**
  String get tutorialLibraryTip2;

  /// Tutorial library tip 3
  ///
  /// In en, this message translates to:
  /// **'Switch between list and grid view for better browsing'**
  String get tutorialLibraryTip3;

  /// Tutorial extensions page title
  ///
  /// In en, this message translates to:
  /// **'Extensions'**
  String get tutorialExtensionsTitle;

  /// Tutorial extensions page description
  ///
  /// In en, this message translates to:
  /// **'Extend the app\'s capabilities with community extensions.'**
  String get tutorialExtensionsDesc;

  /// Tutorial extensions tip 1
  ///
  /// In en, this message translates to:
  /// **'Browse the Store tab to discover useful extensions'**
  String get tutorialExtensionsTip1;

  /// Tutorial extensions tip 2
  ///
  /// In en, this message translates to:
  /// **'Add new download providers or search sources'**
  String get tutorialExtensionsTip2;

  /// Tutorial extensions tip 3
  ///
  /// In en, this message translates to:
  /// **'Get lyrics, enhanced metadata, and more features'**
  String get tutorialExtensionsTip3;

  /// Tutorial settings page title
  ///
  /// In en, this message translates to:
  /// **'Customize Your Experience'**
  String get tutorialSettingsTitle;

  /// Tutorial settings page description
  ///
  /// In en, this message translates to:
  /// **'Personalize the app in Settings to match your preferences.'**
  String get tutorialSettingsDesc;

  /// Tutorial settings tip 1
  ///
  /// In en, this message translates to:
  /// **'Change download location and folder organization'**
  String get tutorialSettingsTip1;

  /// Tutorial settings tip 2
  ///
  /// In en, this message translates to:
  /// **'Set default audio quality and format preferences'**
  String get tutorialSettingsTip2;

  /// Tutorial settings tip 3
  ///
  /// In en, this message translates to:
  /// **'Customize app theme and appearance'**
  String get tutorialSettingsTip3;

  /// Tutorial completion message
  ///
  /// In en, this message translates to:
  /// **'You\'re all set! Start downloading your favorite music now.'**
  String get tutorialReadyMessage;

  /// Example label in tutorial
  ///
  /// In en, this message translates to:
  /// **'EXAMPLE'**
  String get tutorialExample;

  /// Button to force a complete rescan of library
  ///
  /// In en, this message translates to:
  /// **'Force Full Scan'**
  String get libraryForceFullScan;

  /// Subtitle for force full scan button
  ///
  /// In en, this message translates to:
  /// **'Rescan all files, ignoring cache'**
  String get libraryForceFullScanSubtitle;

  /// Button to remove history entries for deleted files
  ///
  /// In en, this message translates to:
  /// **'Cleanup Orphaned Downloads'**
  String get cleanupOrphanedDownloads;

  /// Subtitle for orphaned cleanup button
  ///
  /// In en, this message translates to:
  /// **'Remove history entries for files that no longer exist'**
  String get cleanupOrphanedDownloadsSubtitle;

  /// Snackbar after orphan cleanup
  ///
  /// In en, this message translates to:
  /// **'Removed {count} orphaned entries from history'**
  String cleanupOrphanedDownloadsResult(int count);

  /// Snackbar when no orphans found
  ///
  /// In en, this message translates to:
  /// **'No orphaned entries found'**
  String get cleanupOrphanedDownloadsNone;

  /// Cache management page title
  ///
  /// In en, this message translates to:
  /// **'Storage & Cache'**
  String get cacheTitle;

  /// Heading for cache summary card
  ///
  /// In en, this message translates to:
  /// **'Cache overview'**
  String get cacheSummaryTitle;

  /// Helper text for cache summary card
  ///
  /// In en, this message translates to:
  /// **'Clearing cache will not remove downloaded music files.'**
  String get cacheSummarySubtitle;

  /// Total cache size shown in summary
  ///
  /// In en, this message translates to:
  /// **'Estimated cache usage: {size}'**
  String cacheEstimatedTotal(String size);

  /// Section header for cache entries
  ///
  /// In en, this message translates to:
  /// **'Cached Data'**
  String get cacheSectionStorage;

  /// Section header for cleanup actions
  ///
  /// In en, this message translates to:
  /// **'Maintenance'**
  String get cacheSectionMaintenance;

  /// Cache item title for app cache directory
  ///
  /// In en, this message translates to:
  /// **'App cache directory'**
  String get cacheAppDirectory;

  /// Description of what app cache directory contains
  ///
  /// In en, this message translates to:
  /// **'HTTP responses, WebView data, and other temporary app data.'**
  String get cacheAppDirectoryDesc;

  /// Cache item title for temporary files directory
  ///
  /// In en, this message translates to:
  /// **'Temporary directory'**
  String get cacheTempDirectory;

  /// Description of what temporary directory contains
  ///
  /// In en, this message translates to:
  /// **'Temporary files from downloads and audio conversion.'**
  String get cacheTempDirectoryDesc;

  /// Cache item title for persistent cover images
  ///
  /// In en, this message translates to:
  /// **'Cover image cache'**
  String get cacheCoverImage;

  /// Description of what cover image cache contains
  ///
  /// In en, this message translates to:
  /// **'Downloaded album and track cover art. Will re-download when viewed.'**
  String get cacheCoverImageDesc;

  /// Cache item title for local library cover art images
  ///
  /// In en, this message translates to:
  /// **'Library cover cache'**
  String get cacheLibraryCover;

  /// Description of what library cover cache contains
  ///
  /// In en, this message translates to:
  /// **'Cover art extracted from local music files. Will re-extract on next scan.'**
  String get cacheLibraryCoverDesc;

  /// Cache item title for explore home feed cache
  ///
  /// In en, this message translates to:
  /// **'Explore feed cache'**
  String get cacheExploreFeed;

  /// Description of what explore feed cache contains
  ///
  /// In en, this message translates to:
  /// **'Explore tab content (new releases, trending). Will refresh on next visit.'**
  String get cacheExploreFeedDesc;

  /// Cache item title for track ID lookup cache
  ///
  /// In en, this message translates to:
  /// **'Track lookup cache'**
  String get cacheTrackLookup;

  /// Description of what track lookup cache contains
  ///
  /// In en, this message translates to:
  /// **'Spotify/Deezer track ID lookups. Clearing may slow next few searches.'**
  String get cacheTrackLookupDesc;

  /// Description of what cleanup unused data does
  ///
  /// In en, this message translates to:
  /// **'Remove orphaned download history and library entries for missing files.'**
  String get cacheCleanupUnusedDesc;

  /// Label when cache category has no data
  ///
  /// In en, this message translates to:
  /// **'No cached data'**
  String get cacheNoData;

  /// Cache size and file count
  ///
  /// In en, this message translates to:
  /// **'{size} in {count} files'**
  String cacheSizeWithFiles(String size, int count);

  /// Cache size only
  ///
  /// In en, this message translates to:
  /// **'{size}'**
  String cacheSizeOnly(String size);

  /// Track cache entry count
  ///
  /// In en, this message translates to:
  /// **'{count} entries'**
  String cacheEntries(int count);

  /// Snackbar after clearing selected cache
  ///
  /// In en, this message translates to:
  /// **'Cleared: {target}'**
  String cacheClearSuccess(String target);

  /// Dialog title before clearing one cache category
  ///
  /// In en, this message translates to:
  /// **'Clear cache?'**
  String get cacheClearConfirmTitle;

  /// Dialog message before clearing selected cache
  ///
  /// In en, this message translates to:
  /// **'This will clear cached data for {target}. Downloaded music files will not be deleted.'**
  String cacheClearConfirmMessage(String target);

  /// Dialog title before clearing all caches
  ///
  /// In en, this message translates to:
  /// **'Clear all cache?'**
  String get cacheClearAllConfirmTitle;

  /// Dialog message before clearing all caches
  ///
  /// In en, this message translates to:
  /// **'This will clear all cache categories on this page. Downloaded music files will not be deleted.'**
  String get cacheClearAllConfirmMessage;

  /// Button label to clear all caches
  ///
  /// In en, this message translates to:
  /// **'Clear all cache'**
  String get cacheClearAll;

  /// Action title for cleaning unused entries
  ///
  /// In en, this message translates to:
  /// **'Cleanup unused data'**
  String get cacheCleanupUnused;

  /// Subtitle for cleanup unused data action
  ///
  /// In en, this message translates to:
  /// **'Remove orphaned download history and missing library entries'**
  String get cacheCleanupUnusedSubtitle;

  /// Snackbar after unused data cleanup
  ///
  /// In en, this message translates to:
  /// **'Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries'**
  String cacheCleanupResult(int downloadCount, int libraryCount);

  /// Button label to refresh cache statistics
  ///
  /// In en, this message translates to:
  /// **'Refresh stats'**
  String get cacheRefreshStats;

  /// Menu action - save album cover art as file
  ///
  /// In en, this message translates to:
  /// **'Save Cover Art'**
  String get trackSaveCoverArt;

  /// Subtitle for save cover art action
  ///
  /// In en, this message translates to:
  /// **'Save album art as .jpg file'**
  String get trackSaveCoverArtSubtitle;

  /// Menu action - save lyrics as .lrc file
  ///
  /// In en, this message translates to:
  /// **'Save Lyrics (.lrc)'**
  String get trackSaveLyrics;

  /// Subtitle for save lyrics action
  ///
  /// In en, this message translates to:
  /// **'Fetch and save lyrics as .lrc file'**
  String get trackSaveLyricsSubtitle;

  /// Snackbar while saving lyrics to file
  ///
  /// In en, this message translates to:
  /// **'Saving lyrics...'**
  String get trackSaveLyricsProgress;

  /// Menu action - re-embed metadata into audio file
  ///
  /// In en, this message translates to:
  /// **'Re-enrich Metadata'**
  String get trackReEnrich;

  /// Subtitle for re-enrich metadata action
  ///
  /// In en, this message translates to:
  /// **'Re-embed metadata without re-downloading'**
  String get trackReEnrichSubtitle;

  /// Subtitle for re-enrich metadata action for local items
  ///
  /// In en, this message translates to:
  /// **'Search metadata online and embed into file'**
  String get trackReEnrichOnlineSubtitle;

  /// Menu action - edit embedded metadata
  ///
  /// In en, this message translates to:
  /// **'Edit Metadata'**
  String get trackEditMetadata;

  /// Snackbar after cover art saved
  ///
  /// In en, this message translates to:
  /// **'Cover art saved to {fileName}'**
  String trackCoverSaved(String fileName);

  /// Snackbar when no cover art URL or embedded cover
  ///
  /// In en, this message translates to:
  /// **'No cover art source available'**
  String get trackCoverNoSource;

  /// Snackbar after lyrics saved
  ///
  /// In en, this message translates to:
  /// **'Lyrics saved to {fileName}'**
  String trackLyricsSaved(String fileName);

  /// Snackbar while re-enriching metadata
  ///
  /// In en, this message translates to:
  /// **'Re-enriching metadata...'**
  String get trackReEnrichProgress;

  /// Snackbar while searching metadata from internet for local items
  ///
  /// In en, this message translates to:
  /// **'Searching metadata online...'**
  String get trackReEnrichSearching;

  /// Snackbar after successful re-enrichment
  ///
  /// In en, this message translates to:
  /// **'Metadata re-enriched successfully'**
  String get trackReEnrichSuccess;

  /// Snackbar when FFmpeg embed fails for MP3/Opus
  ///
  /// In en, this message translates to:
  /// **'FFmpeg metadata embed failed'**
  String get trackReEnrichFfmpegFailed;

  /// Snackbar when save operation fails
  ///
  /// In en, this message translates to:
  /// **'Failed: {error}'**
  String trackSaveFailed(String error);

  /// Menu item - convert audio format
  ///
  /// In en, this message translates to:
  /// **'Convert Format'**
  String get trackConvertFormat;

  /// Subtitle for convert format menu item
  ///
  /// In en, this message translates to:
  /// **'Convert to MP3 or Opus'**
  String get trackConvertFormatSubtitle;

  /// Title of convert bottom sheet
  ///
  /// In en, this message translates to:
  /// **'Convert Audio'**
  String get trackConvertTitle;

  /// Label for format selection
  ///
  /// In en, this message translates to:
  /// **'Target Format'**
  String get trackConvertTargetFormat;

  /// Label for bitrate selection
  ///
  /// In en, this message translates to:
  /// **'Bitrate'**
  String get trackConvertBitrate;

  /// Confirmation dialog title
  ///
  /// In en, this message translates to:
  /// **'Confirm Conversion'**
  String get trackConvertConfirmTitle;

  /// Confirmation dialog message
  ///
  /// In en, this message translates to:
  /// **'Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.'**
  String trackConvertConfirmMessage(
    String sourceFormat,
    String targetFormat,
    String bitrate,
  );

  /// Snackbar while converting
  ///
  /// In en, this message translates to:
  /// **'Converting audio...'**
  String get trackConvertConverting;

  /// Snackbar after successful conversion
  ///
  /// In en, this message translates to:
  /// **'Converted to {format} successfully'**
  String trackConvertSuccess(String format);

  /// Snackbar when conversion fails
  ///
  /// In en, this message translates to:
  /// **'Conversion failed'**
  String get trackConvertFailed;
}

class _AppLocalizationsDelegate
    extends LocalizationsDelegate<AppLocalizations> {
  const _AppLocalizationsDelegate();

  @override
  Future<AppLocalizations> load(Locale locale) {
    return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale));
  }

  @override
  bool isSupported(Locale locale) => <String>[
    'de',
    'en',
    'es',
    'fr',
    'hi',
    'id',
    'ja',
    'ko',
    'nl',
    'pt',
    'ru',
    'tr',
    'zh',
  ].contains(locale.languageCode);

  @override
  bool shouldReload(_AppLocalizationsDelegate old) => false;
}

AppLocalizations lookupAppLocalizations(Locale locale) {
  // Lookup logic when language+country codes are specified.
  switch (locale.languageCode) {
    case 'es':
      {
        switch (locale.countryCode) {
          case 'ES':
            return AppLocalizationsEsEs();
        }
        break;
      }
    case 'pt':
      {
        switch (locale.countryCode) {
          case 'PT':
            return AppLocalizationsPtPt();
        }
        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 'de':
      return AppLocalizationsDe();
    case 'en':
      return AppLocalizationsEn();
    case 'es':
      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':
      return AppLocalizationsRu();
    case 'tr':
      return AppLocalizationsTr();
    case 'zh':
      return AppLocalizationsZh();
  }

  throw FlutterError(
    'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
    'an issue with the localizations generation tool. Please file an issue '
    'on GitHub with a reproducible sample app and the gen-l10n configuration '
    'that was used.',
  );
}
