SpotiFLAC-Mobile/lib/l10n/app_localizations.dart
zarzet 1407018d98 feat: advanced filename templates, low-RAM device profiling, responsive artist UI, and project site
- Add advanced filename template placeholders: {track_raw}, {disc_raw}, {date},
  formatted numbers {track:N}/{disc:N}, and date formatting {date:%Y-%m-%d}
  with strftime-to-Go layout conversion and robust date parser
- Pass date/release_date metadata to filename builder in all providers
  (Amazon, Qobuz, Tidal, YouTube, extensions) and Flutter download queue
- Detect ARM32-only / low-RAM Android devices at startup and reduce image
  cache size and disable overscroll effects for smoother experience
- Make artist screen selection bar responsive: compact stacked layout on
  narrow screens or large text scale; add quality picker before track download
- Add advanced tags toggle in download settings filename format editor
- Fix ICU plural syntax in DE/ES/PT/RU translations (one {}=1{...} -> one {...})
- Add filenameShowAdvancedTags l10n strings (EN, ID) and regenerate dart files
- Fix featured-artist regex: remove '&' from split separators
- Add Go filename template tests (filename_test.go)
- Add GitHub Pages workflow and static project site
2026-02-13 21:39:08 +07:00

5323 lines
138 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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, youll need to edit this
/// file.
///
/// First, open your projects ios/Runner.xcworkspace Xcode workspace file.
/// Then, in the Project Navigator, open the Info.plist file under the Runner
/// projects 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.',
);
}