SpotiFLAC-Mobile/lib/l10n/app_localizations.dart
zarzet 1546d7da22
feat: add external LRC lyrics file support and fix locale parsing
- Add lyrics mode setting (embed/external/both) for saving lyrics
- Implement SaveLRCFile() in Go backend for all providers (Tidal, Qobuz, Amazon)
- Fix locale parsing in app.dart to handle country codes (e.g., pt_PT -> Locale('pt', 'PT'))
- Change Portuguese label from Portugal to Brasil in language settings
2026-01-19 18:57:27 +07:00

3826 lines
96 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_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('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 - History tab
///
/// 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;
/// 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;
/// 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;
/// Section for support/donation links
///
/// In en, this message translates to:
/// **'Support'**
String get aboutSupport;
/// Donation link
///
/// In en, this message translates to:
/// **'Buy me a coffee'**
String get aboutBuyMeCoffee;
/// Subtitle for donation
///
/// In en, this message translates to:
/// **'Support development on Ko-fi'**
String get aboutBuyMeCoffeeSubtitle;
/// 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;
/// 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;
/// 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;
/// 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);
/// 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 - 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);
/// 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 - 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;
/// 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 - MP3 lossy format
///
/// In en, this message translates to:
/// **'MP3'**
String get qualityMp3;
/// Technical spec for MP3
///
/// In en, this message translates to:
/// **'320kbps (converted from FLAC)'**
String get qualityMp3Subtitle;
/// Setting - enable MP3 quality option
///
/// In en, this message translates to:
/// **'Enable MP3 Option'**
String get enableMp3Option;
/// Subtitle when MP3 is enabled
///
/// In en, this message translates to:
/// **'MP3 quality option is available'**
String get enableMp3OptionSubtitleOn;
/// Subtitle when MP3 is disabled
///
/// In en, this message translates to:
/// **'Downloads FLAC then converts to 320kbps MP3'**
String get enableMp3OptionSubtitleOff;
/// Note about quality availability
///
/// In en, this message translates to:
/// **'Actual quality depends on track availability from the service'**
String get qualityNote;
/// 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 - 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;
/// 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;
/// 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;
/// 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);
}
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',
'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 '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.',
);
}