diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index ac05e3b7..fc04bfa8 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -5,6 +5,7 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; +import 'app_localizations_ar.dart'; import 'app_localizations_de.dart'; import 'app_localizations_en.dart'; import 'app_localizations_es.dart'; @@ -106,6 +107,7 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ + Locale('ar'), Locale('de'), Locale('en'), Locale('es'), @@ -7085,6 +7087,7 @@ class _AppLocalizationsDelegate @override bool isSupported(Locale locale) => [ + 'ar', 'de', 'en', 'es', @@ -7138,6 +7141,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { + case 'ar': + return AppLocalizationsAr(); case 'de': return AppLocalizationsDe(); case 'en': diff --git a/lib/l10n/app_localizations_ar.dart b/lib/l10n/app_localizations_ar.dart new file mode 100644 index 00000000..480a8614 --- /dev/null +++ b/lib/l10n/app_localizations_ar.dart @@ -0,0 +1,4248 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Arabic (`ar`). +class AppLocalizationsAr extends AppLocalizations { + AppLocalizationsAr([String locale = 'ar']) : super(locale); + + @override + String get appName => 'SpotiFLAC Mobile'; + + @override + String get navHome => 'Home'; + + @override + String get navLibrary => 'Library'; + + @override + String get navSettings => 'Settings'; + + @override + String get navStore => 'Repo'; + + @override + String get homeTitle => 'Home'; + + @override + String get homeSubtitle => 'Paste a supported URL or search by name'; + + @override + String get homeEmptyTitle => 'No search providers yet'; + + @override + String get homeEmptySubtitle => 'Install an extension to continue.'; + + @override + String get homeSupports => 'Supports: Track, Album, Playlist, Artist URLs'; + + @override + String get homeRecent => 'Recent'; + + @override + String get historyFilterAll => 'All'; + + @override + String get historyFilterAlbums => 'Albums'; + + @override + String get historyFilterSingles => 'Singles'; + + @override + String get historySearchHint => 'Search history...'; + + @override + String get settingsTitle => 'Settings'; + + @override + String get settingsDownload => 'Download'; + + @override + String get settingsAppearance => 'Appearance'; + + @override + String get settingsOptions => 'Options'; + + @override + String get settingsExtensions => 'Extensions'; + + @override + String get settingsAbout => 'About'; + + @override + String get downloadTitle => 'Download'; + + @override + String get downloadAskQualitySubtitle => + 'Show quality picker for each download'; + + @override + String get downloadFilenameFormat => 'Filename Format'; + + @override + String get downloadSingleFilenameFormat => 'Single Filename Format'; + + @override + String get downloadSingleFilenameFormatDescription => + 'Filename pattern for singles and EPs. Uses the same tags as the album format.'; + + @override + String get downloadFolderOrganization => 'Folder Organization'; + + @override + String get appearanceTitle => 'Appearance'; + + @override + String get appearanceThemeSystem => 'System'; + + @override + String get appearanceThemeLight => 'Light'; + + @override + String get appearanceThemeDark => 'Dark'; + + @override + String get appearanceDynamicColor => 'Dynamic Color'; + + @override + String get appearanceDynamicColorSubtitle => 'Use colors from your wallpaper'; + + @override + String get appearanceHistoryView => 'History View'; + + @override + String get appearanceHistoryViewList => 'List'; + + @override + String get appearanceHistoryViewGrid => 'Grid'; + + @override + String get optionsTitle => 'Options'; + + @override + String get optionsPrimaryProvider => 'Primary Provider'; + + @override + String get optionsPrimaryProviderSubtitle => + 'Service used for searching by track or album name'; + + @override + String optionsUsingExtension(String extensionName) { + return 'Using extension: $extensionName'; + } + + @override + String get optionsDefaultSearchTab => 'Default Search Tab'; + + @override + String get optionsDefaultSearchTabSubtitle => + 'Choose which tab opens first for new search results.'; + + @override + String get optionsSwitchBack => + 'Tap Deezer or Spotify to switch back from extension'; + + @override + String get optionsAutoFallback => 'Auto Fallback'; + + @override + String get optionsAutoFallbackSubtitle => + 'Try other services if download fails'; + + @override + String get optionsUseExtensionProviders => 'Use Extension Providers'; + + @override + String get optionsUseExtensionProvidersOn => 'Extensions will be tried first'; + + @override + String get optionsUseExtensionProvidersOff => 'Using built-in providers only'; + + @override + String get optionsEmbedLyrics => 'Embed Lyrics'; + + @override + String get optionsEmbedLyricsSubtitle => + 'حفظ كلمات الأغاني المتزامنة جنبا إلى جنب مع المسارات التي تم تنزيلها'; + + @override + String get optionsMaxQualityCover => 'اختيار اعلى جودة للغلاف'; + + @override + String get optionsMaxQualityCoverSubtitle => + 'Download highest resolution cover art'; + + @override + String get optionsReplayGain => 'ReplayGain'; + + @override + String get optionsReplayGainSubtitleOn => + 'Scan loudness and embed ReplayGain tags (EBU R128)'; + + @override + String get optionsReplayGainSubtitleOff => + 'Disabled: no loudness normalization tags'; + + @override + String get optionsArtistTagMode => 'Artist Tag Mode'; + + @override + String get optionsArtistTagModeDescription => + 'Choose how multiple artists are written into embedded tags.'; + + @override + String get optionsArtistTagModeJoined => 'Single joined value'; + + @override + String get optionsArtistTagModeJoinedSubtitle => + 'Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.'; + + @override + String get optionsArtistTagModeSplitVorbis => 'Split tags for FLAC/Opus'; + + @override + String get optionsArtistTagModeSplitVorbisSubtitle => + 'Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.'; + + @override + String get optionsConcurrentDownloads => 'Concurrent Downloads'; + + @override + String get optionsConcurrentSequential => 'Sequential (1 at a time)'; + + @override + String optionsConcurrentParallel(int count) { + return '$count parallel downloads'; + } + + @override + String get optionsConcurrentWarning => + 'Parallel downloads may trigger rate limiting'; + + @override + String get optionsExtensionStore => 'Extension Repo'; + + @override + String get optionsExtensionStoreSubtitle => 'Show Repo tab in navigation'; + + @override + String get optionsCheckUpdates => 'Check for Updates'; + + @override + String get optionsCheckUpdatesSubtitle => + 'Notify when new version is available'; + + @override + String get optionsUpdateChannel => 'Update Channel'; + + @override + String get optionsUpdateChannelStable => 'Stable releases only'; + + @override + String get optionsUpdateChannelPreview => 'Get preview releases'; + + @override + String get optionsUpdateChannelWarning => + 'Preview may contain bugs or incomplete features'; + + @override + String get optionsClearHistory => 'Clear Download History'; + + @override + String get optionsClearHistorySubtitle => + 'Remove all downloaded tracks from history'; + + @override + String get optionsDetailedLogging => 'Detailed Logging'; + + @override + String get optionsDetailedLoggingOn => 'Detailed logs are being recorded'; + + @override + String get optionsDetailedLoggingOff => 'Enable for bug reports'; + + @override + String get optionsSpotifyCredentials => 'Spotify Credentials'; + + @override + String optionsSpotifyCredentialsConfigured(String clientId) { + return 'Client ID: $clientId...'; + } + + @override + String get optionsSpotifyCredentialsRequired => 'Required - tap to configure'; + + @override + String get optionsSpotifyWarning => + 'Spotify requires your own API credentials. Get them free from developer.spotify.com'; + + @override + String get optionsSpotifyDeprecationWarning => + 'Spotify search will be deprecated on March 3, 2026 due to Spotify API changes. Please switch to Deezer.'; + + @override + String get extensionsTitle => 'Extensions'; + + @override + String get extensionsDisabled => 'Disabled'; + + @override + String extensionsVersion(String version) { + return 'Version $version'; + } + + @override + String extensionsAuthor(String author) { + return 'by $author'; + } + + @override + String get extensionsUninstall => 'Uninstall'; + + @override + String get storeTitle => 'Extension Repo'; + + @override + String get storeSearch => 'Search extensions...'; + + @override + String get storeInstall => 'Install'; + + @override + String get storeInstalled => 'Installed'; + + @override + String get storeUpdate => 'Update'; + + @override + String get aboutTitle => 'About'; + + @override + String get aboutContributors => 'Contributors'; + + @override + String get aboutMobileDeveloper => 'Mobile version developer'; + + @override + String get aboutOriginalCreator => 'Creator of the original SpotiFLAC'; + + @override + String get aboutLogoArtist => + 'The talented artist who created our beautiful app logo!'; + + @override + String get aboutTranslators => 'Translators'; + + @override + String get aboutSpecialThanks => 'Special Thanks'; + + @override + String get aboutLinks => 'Links'; + + @override + String get aboutMobileSource => 'Mobile source code'; + + @override + String get aboutPCSource => 'PC source code'; + + @override + String get aboutKeepAndroidOpen => 'Keep Android Open'; + + @override + String get aboutReportIssue => 'Report an issue'; + + @override + String get aboutReportIssueSubtitle => 'Report any problems you encounter'; + + @override + String get aboutFeatureRequest => 'Feature request'; + + @override + String get aboutFeatureRequestSubtitle => 'Suggest new features for the app'; + + @override + String get aboutTelegramChannel => 'Telegram Channel'; + + @override + String get aboutTelegramChannelSubtitle => 'Announcements and updates'; + + @override + String get aboutTelegramChat => 'Telegram Community'; + + @override + String get aboutTelegramChatSubtitle => 'Chat with other users'; + + @override + String get aboutSocial => 'Social'; + + @override + String get aboutApp => 'App'; + + @override + String get aboutVersion => 'Version'; + + @override + String get aboutBinimumDesc => + 'The creator of QQDL & HiFi API. Without this API, Tidal downloads wouldn\'t exist!'; + + @override + String get aboutSachinsenalDesc => + 'The original HiFi project creator. The foundation of Tidal integration!'; + + @override + String get aboutSjdonadoDesc => + 'Creator of I Don\'t Have Spotify (IDHS). The fallback link resolver that saves the day!'; + + @override + String get aboutAppDescription => + 'Search music metadata, manage extensions, and organize your library.'; + + @override + String get artistAlbums => 'Albums'; + + @override + String get artistSingles => 'Singles & EPs'; + + @override + String get artistCompilations => 'Compilations'; + + @override + String get artistPopular => 'Popular'; + + @override + String artistMonthlyListeners(String count) { + return '$count monthly listeners'; + } + + @override + String get trackMetadataService => 'Service'; + + @override + String get trackMetadataPlay => 'Play'; + + @override + String get trackMetadataShare => 'Share'; + + @override + String get trackMetadataDelete => 'Delete'; + + @override + String get setupGrantPermission => 'Grant Permission'; + + @override + String get setupSkip => 'Skip for now'; + + @override + String get setupStorageAccessRequired => 'Storage Access Required'; + + @override + String get setupStorageAccessMessageAndroid11 => + 'Android 11+ requires \"All files access\" permission to save files to your chosen download folder.'; + + @override + String get setupOpenSettings => 'Open Settings'; + + @override + String get setupPermissionDeniedMessage => + 'Permission denied. Please grant all permissions to continue.'; + + @override + String setupPermissionRequired(String permissionType) { + return '$permissionType Permission Required'; + } + + @override + String setupPermissionRequiredMessage(String permissionType) { + return '$permissionType permission is required for the best experience. You can change this later in Settings.'; + } + + @override + String get setupUseDefaultFolder => 'Use Default Folder?'; + + @override + String get setupNoFolderSelected => + 'No folder selected. Would you like to use the default Music folder?'; + + @override + String get setupUseDefault => 'Use Default'; + + @override + String get setupDownloadLocationTitle => 'Download Location'; + + @override + String get setupDownloadLocationIosMessage => + 'On iOS, downloads are saved to the app\'s Documents folder. You can access them via the Files app.'; + + @override + String get setupAppDocumentsFolder => 'App Documents Folder'; + + @override + String get setupAppDocumentsFolderSubtitle => + 'Recommended - accessible via Files app'; + + @override + String get setupChooseFromFiles => 'Choose from Files'; + + @override + String get setupChooseFromFilesSubtitle => 'Select iCloud or other location'; + + @override + String get setupIosEmptyFolderWarning => + 'iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.'; + + @override + String get setupIcloudNotSupported => + 'iCloud Drive is not supported. Please use the app Documents folder.'; + + @override + String get setupDownloadInFlac => 'Download Spotify tracks in FLAC'; + + @override + String get setupStorageGranted => 'Storage Permission Granted!'; + + @override + String get setupStorageRequired => 'Storage Permission Required'; + + @override + String get setupStorageDescription => + 'SpotiFLAC needs storage permission to save your downloaded music files.'; + + @override + String get setupNotificationGranted => 'تم منح إذن الإشعارات!'; + + @override + String get setupNotificationEnable => 'Enable Notifications'; + + @override + String get setupFolderChoose => 'Choose Download Folder'; + + @override + String get setupFolderDescription => + 'Select a folder where your downloaded music will be saved.'; + + @override + String get setupSelectFolder => 'Select Folder'; + + @override + String get setupEnableNotifications => 'Enable Notifications'; + + @override + String get setupNotificationBackgroundDescription => + 'Get notified about download progress and completion. This helps you track downloads when the app is in background.'; + + @override + String get setupSkipForNow => 'Skip for now'; + + @override + String get setupNext => 'Next'; + + @override + String get setupGetStarted => 'Get Started'; + + @override + String get setupAllowAccessToManageFiles => + 'Please enable \"Allow access to manage all files\" in the next screen.'; + + @override + String get setupLanguageTitle => 'Choose Language'; + + @override + String get setupLanguageDescription => + 'Select your preferred language for the app. You can change this later in Settings.'; + + @override + String get setupLanguageSystemDefault => 'System Default'; + + @override + String get dialogCancel => 'Cancel'; + + @override + String get dialogSave => 'Save'; + + @override + String get dialogDelete => 'Delete'; + + @override + String get dialogRetry => 'Retry'; + + @override + String get dialogClear => 'Clear'; + + @override + String get dialogDone => 'Done'; + + @override + String get dialogImport => 'Import'; + + @override + String get dialogDownload => 'Download'; + + @override + String get dialogDiscard => 'Discard'; + + @override + String get dialogRemove => 'Remove'; + + @override + String get dialogUninstall => 'Uninstall'; + + @override + String get dialogDiscardChanges => 'Discard Changes?'; + + @override + String get dialogUnsavedChanges => + 'You have unsaved changes. Do you want to discard them?'; + + @override + String get dialogClearAll => 'Clear All'; + + @override + String get dialogRemoveExtension => 'Remove Extension'; + + @override + String get dialogRemoveExtensionMessage => + 'Are you sure you want to remove this extension? This cannot be undone.'; + + @override + String get dialogUninstallExtension => 'Uninstall Extension?'; + + @override + String dialogUninstallExtensionMessage(String extensionName) { + return 'Are you sure you want to remove $extensionName?'; + } + + @override + String get dialogClearHistoryTitle => 'Clear History'; + + @override + String get dialogClearHistoryMessage => + 'Are you sure you want to clear all download history? This cannot be undone.'; + + @override + String get dialogDeleteSelectedTitle => 'Delete Selected'; + + @override + String dialogDeleteSelectedMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Delete $count $_temp0 from history?\n\nThis will also delete the files from storage.'; + } + + @override + String get dialogImportPlaylistTitle => 'Import Playlist'; + + @override + String dialogImportPlaylistMessage(int count) { + return 'Found $count tracks in CSV. Add them to download queue?'; + } + + @override + String csvImportTracks(int count) { + return '$count tracks from CSV'; + } + + @override + String snackbarAddedToQueue(String trackName) { + return 'Added \"$trackName\" to queue'; + } + + @override + String snackbarAddedTracksToQueue(int count) { + return 'Added $count tracks to queue'; + } + + @override + String snackbarAlreadyDownloaded(String trackName) { + return '\"$trackName\" already downloaded'; + } + + @override + String snackbarAlreadyInLibrary(String trackName) { + return '\"$trackName\" already exists in your library'; + } + + @override + String get snackbarHistoryCleared => 'History cleared'; + + @override + String get snackbarCredentialsSaved => 'Credentials saved'; + + @override + String get snackbarCredentialsCleared => 'Credentials cleared'; + + @override + String snackbarDeletedTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Deleted $count $_temp0'; + } + + @override + String snackbarCannotOpenFile(String error) { + return 'Cannot open file: $error'; + } + + @override + String get snackbarFillAllFields => 'Please fill all fields'; + + @override + String get snackbarViewQueue => 'View Queue'; + + @override + String snackbarUrlCopied(String platform) { + return '$platform URL copied to clipboard'; + } + + @override + String get snackbarFileNotFound => 'File not found'; + + @override + String get snackbarSelectExtFile => 'Please select a .spotiflac-ext file'; + + @override + String get snackbarProviderPrioritySaved => 'Provider priority saved'; + + @override + String get snackbarMetadataProviderSaved => + 'Metadata provider priority saved'; + + @override + String snackbarExtensionInstalled(String extensionName) { + return '$extensionName installed.'; + } + + @override + String snackbarExtensionUpdated(String extensionName) { + return '$extensionName updated.'; + } + + @override + String get snackbarFailedToInstall => 'Failed to install extension'; + + @override + String get snackbarFailedToUpdate => 'Failed to update extension'; + + @override + String get errorRateLimited => 'Rate Limited'; + + @override + String get errorRateLimitedMessage => + 'Too many requests. Please wait a moment before searching again.'; + + @override + String get errorNoTracksFound => 'No tracks found'; + + @override + String get searchEmptyResultSubtitle => 'Try another keyword'; + + @override + String get errorUrlNotRecognized => 'Link not recognized'; + + @override + String get errorUrlNotRecognizedMessage => + 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; + + @override + String get errorUrlFetchFailed => + 'Failed to load content from this link. Please try again.'; + + @override + String errorMissingExtensionSource(String item) { + return 'Cannot load $item: missing extension source'; + } + + @override + String get actionPause => 'Pause'; + + @override + String get actionResume => 'Resume'; + + @override + String get actionCancel => 'Cancel'; + + @override + String get actionSelectAll => 'Select All'; + + @override + String get actionDeselect => 'Deselect'; + + @override + String get actionRemoveCredentials => 'Remove Credentials'; + + @override + String get actionSaveCredentials => 'Save Credentials'; + + @override + String selectionSelected(int count) { + return '$count selected'; + } + + @override + String get selectionAllSelected => 'All tracks selected'; + + @override + String get selectionSelectToDelete => 'Select tracks to delete'; + + @override + String progressFetchingMetadata(int current, int total) { + return 'Fetching metadata... $current/$total'; + } + + @override + String get progressReadingCsv => 'Reading CSV...'; + + @override + String get searchSongs => 'Songs'; + + @override + String get searchArtists => 'Artists'; + + @override + String get searchAlbums => 'Albums'; + + @override + String get searchPlaylists => 'Playlists'; + + @override + String get searchSortTitle => 'Sort Results'; + + @override + String get searchSortDefault => 'Default'; + + @override + String get searchSortTitleAZ => 'Title (A-Z)'; + + @override + String get searchSortTitleZA => 'Title (Z-A)'; + + @override + String get searchSortArtistAZ => 'Artist (A-Z)'; + + @override + String get searchSortArtistZA => 'Artist (Z-A)'; + + @override + String get searchSortDurationShort => 'Duration (Shortest)'; + + @override + String get searchSortDurationLong => 'Duration (Longest)'; + + @override + String get searchSortDateOldest => 'Release Date (Oldest)'; + + @override + String get searchSortDateNewest => 'Release Date (Newest)'; + + @override + String get tooltipPlay => 'Play'; + + @override + String get filenameFormat => 'Filename Format'; + + @override + String get filenameShowAdvancedTags => 'Show advanced tags'; + + @override + String get filenameShowAdvancedTagsDescription => + 'Enable formatted tags for track padding and date patterns'; + + @override + String get folderOrganizationNone => 'No organization'; + + @override + String get folderOrganizationByPlaylist => 'By Playlist'; + + @override + String get folderOrganizationByPlaylistSubtitle => + 'Separate folder for each playlist'; + + @override + String get folderOrganizationByArtist => 'By Artist'; + + @override + String get folderOrganizationByAlbum => 'By Album'; + + @override + String get folderOrganizationByArtistAlbum => 'Artist/Album'; + + @override + String get folderOrganizationDescription => + 'Organize downloaded files into folders'; + + @override + String get folderOrganizationNoneSubtitle => 'All files in download folder'; + + @override + String get folderOrganizationByArtistSubtitle => + 'Separate folder for each artist'; + + @override + String get folderOrganizationByAlbumSubtitle => + 'Separate folder for each album'; + + @override + String get folderOrganizationByArtistAlbumSubtitle => + 'Nested folders for artist and album'; + + @override + String get updateAvailable => 'Update Available'; + + @override + String get updateLater => 'Later'; + + @override + String get updateStartingDownload => 'Starting download...'; + + @override + String get updateDownloadFailed => 'Download failed'; + + @override + String get updateFailedMessage => 'Failed to download update'; + + @override + String get updateNewVersionReady => 'A new version is ready'; + + @override + String get updateCurrent => 'Current'; + + @override + String get updateNew => 'New'; + + @override + String get updateDownloading => 'Downloading...'; + + @override + String get updateWhatsNew => 'What\'s New'; + + @override + String get updateDownloadInstall => 'Download & Install'; + + @override + String get updateDontRemind => 'Don\'t remind'; + + @override + String get providerPriorityTitle => 'Provider Priority'; + + @override + String get providerPriorityDescription => + 'Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.'; + + @override + String get providerPriorityInfo => + 'If a track is not available on the first provider, the app will automatically try the next one.'; + + @override + String get providerPriorityFallbackExtensionsTitle => 'Extension Fallback'; + + @override + String get providerPriorityFallbackExtensionsDescription => + 'Choose which installed download extensions can be used during automatic fallback.'; + + @override + String get providerPriorityFallbackExtensionsHint => + 'Only enabled extensions with download-provider capability are listed here.'; + + @override + String get providerBuiltIn => 'Built-in'; + + @override + String get providerExtension => 'Extension'; + + @override + String get metadataProviderPriorityTitle => 'Metadata Priority'; + + @override + String get metadataProviderPriorityDescription => + 'Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.'; + + @override + String get metadataProviderPriorityInfo => + 'Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.'; + + @override + String get metadataNoRateLimits => 'No rate limits'; + + @override + String get metadataMayRateLimit => 'May rate limit'; + + @override + String get logTitle => 'Logs'; + + @override + String get logCopied => 'Logs copied to clipboard'; + + @override + String get logSearchHint => 'Search logs...'; + + @override + String get logFilterLevel => 'Level'; + + @override + String get logFilterSection => 'Filter'; + + @override + String get logShareLogs => 'Share logs'; + + @override + String get logClearLogs => 'Clear logs'; + + @override + String get logClearLogsTitle => 'Clear Logs'; + + @override + String get logClearLogsMessage => 'Are you sure you want to clear all logs?'; + + @override + String get logFilterBySeverity => 'Filter logs by severity'; + + @override + String get logNoLogsYet => 'No logs yet'; + + @override + String get logNoLogsYetSubtitle => 'Logs will appear here as you use the app'; + + @override + String logEntriesFiltered(int count) { + return 'Entries ($count filtered)'; + } + + @override + String logEntries(int count) { + return 'Entries ($count)'; + } + + @override + String get credentialsTitle => 'Spotify Credentials'; + + @override + String get credentialsDescription => + 'Enter your Client ID and Secret to use your own Spotify application quota.'; + + @override + String get credentialsClientId => 'Client ID'; + + @override + String get credentialsClientIdHint => 'Paste Client ID'; + + @override + String get credentialsClientSecret => 'Client Secret'; + + @override + String get credentialsClientSecretHint => 'Paste Client Secret'; + + @override + String get channelStable => 'Stable'; + + @override + String get channelPreview => 'Preview'; + + @override + String get sectionSearchSource => 'Search Source'; + + @override + String get sectionDownload => 'Download'; + + @override + String get sectionPerformance => 'Performance'; + + @override + String get sectionApp => 'App'; + + @override + String get sectionData => 'Data'; + + @override + String get sectionDebug => 'Debug'; + + @override + String get sectionService => 'Service'; + + @override + String get sectionAudioQuality => 'Audio Quality'; + + @override + String get sectionFileSettings => 'File Settings'; + + @override + String get sectionLyrics => 'Lyrics'; + + @override + String get lyricsMode => 'Lyrics Mode'; + + @override + String get lyricsModeDescription => + 'Choose how lyrics are saved with your downloads'; + + @override + String get lyricsModeEmbed => 'Embed in file'; + + @override + String get lyricsModeEmbedSubtitle => 'Lyrics stored inside FLAC metadata'; + + @override + String get lyricsModeExternal => 'External .lrc file'; + + @override + String get lyricsModeExternalSubtitle => + 'Separate .lrc file for players like Samsung Music'; + + @override + String get lyricsModeBoth => 'Both'; + + @override + String get lyricsModeBothSubtitle => 'Embed and save .lrc file'; + + @override + String get sectionColor => 'Color'; + + @override + String get sectionTheme => 'Theme'; + + @override + String get sectionLayout => 'Layout'; + + @override + String get sectionLanguage => 'Language'; + + @override + String get appearanceLanguage => 'App Language'; + + @override + String get settingsAppearanceSubtitle => 'Theme, colors, display'; + + @override + String get settingsDownloadSubtitle => 'Service, quality, fallback'; + + @override + String get settingsOptionsSubtitle => 'Fallback, metadata, lyrics, cover art'; + + @override + String get settingsExtensionsSubtitle => 'Manage download providers'; + + @override + String get settingsLogsSubtitle => 'View app logs for debugging'; + + @override + String get loadingSharedLink => 'Loading shared link...'; + + @override + String get pressBackAgainToExit => 'Press back again to exit'; + + @override + String downloadAllCount(int count) { + return 'Download All ($count)'; + } + + @override + String tracksCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks', + one: '1 track', + ); + return '$_temp0'; + } + + @override + String get trackCopyFilePath => 'Copy file path'; + + @override + String get trackRemoveFromDevice => 'Remove from device'; + + @override + String get trackLoadLyrics => 'Load Lyrics'; + + @override + String get trackMetadata => 'Metadata'; + + @override + String get trackFileInfo => 'File Info'; + + @override + String get trackLyrics => 'Lyrics'; + + @override + String get trackFileNotFound => 'File not found'; + + @override + String get trackOpenInDeezer => 'Open in Deezer'; + + @override + String get trackOpenInSpotify => 'Open in Spotify'; + + @override + String get trackTrackName => 'Track name'; + + @override + String get trackArtist => 'Artist'; + + @override + String get trackAlbumArtist => 'Album artist'; + + @override + String get trackAlbum => 'Album'; + + @override + String get trackTrackNumber => 'Track number'; + + @override + String get trackDiscNumber => 'Disc number'; + + @override + String get trackDuration => 'Duration'; + + @override + String get trackAudioQuality => 'Audio quality'; + + @override + String get trackReleaseDate => 'Release date'; + + @override + String get trackGenre => 'Genre'; + + @override + String get trackLabel => 'Label'; + + @override + String get trackCopyright => 'Copyright'; + + @override + String get trackDownloaded => 'Downloaded'; + + @override + String get trackCopyLyrics => 'Copy lyrics'; + + @override + String trackLyricsSource(String source) { + return 'Source: $source'; + } + + @override + String get trackLyricsNotAvailable => 'Lyrics not available for this track'; + + @override + String get trackLyricsNotInFile => 'No lyrics found in this file'; + + @override + String get trackFetchOnlineLyrics => 'Fetch from Online'; + + @override + String get trackLyricsTimeout => 'Request timed out. Try again later.'; + + @override + String get trackLyricsLoadFailed => 'Failed to load lyrics'; + + @override + String get trackEmbedLyrics => 'Embed Lyrics'; + + @override + String get trackLyricsEmbedded => 'Lyrics embedded successfully'; + + @override + String get trackInstrumental => 'Instrumental track'; + + @override + String get trackCopiedToClipboard => 'Copied to clipboard'; + + @override + String get trackDeleteConfirmTitle => 'Remove from device?'; + + @override + String get trackDeleteConfirmMessage => + 'This will permanently delete the downloaded file and remove it from your history.'; + + @override + String get dateToday => 'Today'; + + @override + String get dateYesterday => 'Yesterday'; + + @override + String dateDaysAgo(int count) { + return '$count days ago'; + } + + @override + String dateWeeksAgo(int count) { + return '$count weeks ago'; + } + + @override + String dateMonthsAgo(int count) { + return '$count months ago'; + } + + @override + String get storeFilterAll => 'All'; + + @override + String get storeFilterMetadata => 'Metadata'; + + @override + String get storeFilterDownload => 'Download'; + + @override + String get storeFilterUtility => 'Utility'; + + @override + String get storeFilterLyrics => 'Lyrics'; + + @override + String get storeFilterIntegration => 'Integration'; + + @override + String get storeClearFilters => 'Clear filters'; + + @override + String get storeAddRepoTitle => 'Add Extension Repository'; + + @override + String get storeAddRepoDescription => + 'Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.'; + + @override + String get storeRepoUrlLabel => 'Repository URL'; + + @override + String get storeRepoUrlHint => 'https://github.com/user/repo'; + + @override + String get storeRepoUrlHelper => + 'e.g. https://github.com/user/extensions-repo'; + + @override + String get storeAddRepoButton => 'Add Repository'; + + @override + String get storeChangeRepoTooltip => 'Change repository'; + + @override + String get storeRepoDialogTitle => 'Extension Repository'; + + @override + String get storeRepoDialogCurrent => 'Current repository:'; + + @override + String get storeNewRepoUrlLabel => 'New Repository URL'; + + @override + String get storeLoadError => 'Failed to load repository'; + + @override + String get storeEmptyNoExtensions => 'No extensions available'; + + @override + String get storeEmptyNoResults => 'No extensions found'; + + @override + String get extensionDefaultProvider => 'Default (Deezer)'; + + @override + String get extensionDefaultProviderSubtitle => 'Use built-in search'; + + @override + String get extensionAuthor => 'Author'; + + @override + String get extensionId => 'ID'; + + @override + String get extensionError => 'Error'; + + @override + String get extensionCapabilities => 'Capabilities'; + + @override + String get extensionMetadataProvider => 'Metadata Provider'; + + @override + String get extensionDownloadProvider => 'Download Provider'; + + @override + String get extensionLyricsProvider => 'Lyrics Provider'; + + @override + String get extensionUrlHandler => 'URL Handler'; + + @override + String get extensionQualityOptions => 'Quality Options'; + + @override + String get extensionPostProcessingHooks => 'Post-Processing Hooks'; + + @override + String get extensionPermissions => 'Permissions'; + + @override + String get extensionSettings => 'Settings'; + + @override + String get extensionRemoveButton => 'Remove Extension'; + + @override + String get extensionUpdated => 'Updated'; + + @override + String get extensionMinAppVersion => 'Min App Version'; + + @override + String get extensionCustomTrackMatching => 'Custom Track Matching'; + + @override + String get extensionPostProcessing => 'Post-Processing'; + + @override + String extensionHooksAvailable(int count) { + return '$count hook(s) available'; + } + + @override + String extensionPatternsCount(int count) { + return '$count pattern(s)'; + } + + @override + String extensionStrategy(String strategy) { + return 'Strategy: $strategy'; + } + + @override + String get extensionsProviderPrioritySection => 'Provider Priority'; + + @override + String get extensionsInstalledSection => 'Installed Extensions'; + + @override + String get extensionsNoExtensions => 'No extensions installed'; + + @override + String get extensionsNoExtensionsSubtitle => + 'Install .spotiflac-ext files to add new providers'; + + @override + String get extensionsInstallButton => 'Install Extension'; + + @override + String get extensionsInfoTip => + 'Extensions can add new metadata and download providers. Only install extensions from trusted sources.'; + + @override + String get extensionsInstalledSuccess => 'Extension installed successfully'; + + @override + String extensionsInstalledCount(int count) { + return '$count extensions installed successfully'; + } + + @override + String extensionsInstallPartialSuccess(int installed, int attempted) { + return 'Installed $installed of $attempted extensions'; + } + + @override + String get extensionsDownloadPriority => 'Download Priority'; + + @override + String get extensionsDownloadPrioritySubtitle => 'Set download service order'; + + @override + String get extensionsFallbackTitle => 'Fallback Extensions'; + + @override + String get extensionsFallbackSubtitle => + 'Choose which installed download extensions can be used as fallback'; + + @override + String get extensionsNoDownloadProvider => + 'No extensions with download provider'; + + @override + String get extensionsMetadataPriority => 'Metadata Priority'; + + @override + String get extensionsMetadataPrioritySubtitle => + 'Set search & metadata source order'; + + @override + String get extensionsNoMetadataProvider => + 'No extensions with metadata provider'; + + @override + String get extensionsSearchProvider => 'Search Provider'; + + @override + String get extensionsNoCustomSearch => 'No extensions with custom search'; + + @override + String get extensionsSearchProviderDescription => + 'Choose which service to use for searching tracks'; + + @override + String get extensionsCustomSearch => 'Custom search'; + + @override + String get extensionsErrorLoading => 'Error loading extension'; + + @override + String get qualityFlacLossless => 'FLAC Lossless'; + + @override + String get qualityFlacLosslessSubtitle => '16-bit / 44.1kHz'; + + @override + String get qualityHiResFlac => 'Hi-Res FLAC'; + + @override + String get qualityHiResFlacSubtitle => '24-bit / up to 96kHz'; + + @override + String get qualityHiResFlacMax => 'Hi-Res FLAC Max'; + + @override + String get qualityHiResFlacMaxSubtitle => '24-bit / up to 192kHz'; + + @override + String get downloadLossy320 => 'Lossy 320kbps'; + + @override + String get downloadLossyFormat => 'Lossy Format'; + + @override + String get downloadLossy320Format => 'Lossy 320kbps Format'; + + @override + String get downloadLossy320FormatDesc => + 'Choose the output format for Tidal 320kbps lossy downloads. The original AAC stream will be converted to your selected format.'; + + @override + String get downloadLossyMp3 => 'MP3 320kbps'; + + @override + String get downloadLossyMp3Subtitle => 'Best compatibility, ~10MB per track'; + + @override + String get downloadLossyAac => 'AAC/M4A 320kbps'; + + @override + String get downloadLossyAacSubtitle => + 'Best mobile compatibility, M4A container'; + + @override + String get downloadLossyOpus256 => 'Opus 256kbps'; + + @override + String get downloadLossyOpus256Subtitle => + 'Best quality Opus, ~8MB per track'; + + @override + String get downloadLossyOpus128 => 'Opus 128kbps'; + + @override + String get downloadLossyOpus128Subtitle => 'Smallest size, ~4MB per track'; + + @override + String get qualityNote => + 'Actual quality depends on track availability from the service'; + + @override + String get downloadAskBeforeDownload => 'Ask Before Download'; + + @override + String get downloadDirectory => 'Download Directory'; + + @override + String get downloadSeparateSinglesFolder => 'Separate Singles Folder'; + + @override + String get downloadAlbumFolderStructure => 'Album Folder Structure'; + + @override + String get downloadUseAlbumArtistForFolders => 'Use Album Artist for folders'; + + @override + String get downloadUsePrimaryArtistOnly => 'Primary artist only for folders'; + + @override + String get downloadUsePrimaryArtistOnlyEnabled => + 'Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)'; + + @override + String get downloadUsePrimaryArtistOnlyDisabled => + 'Full artist string used for folder name'; + + @override + String get downloadSelectQuality => 'Select Quality'; + + @override + String get downloadFrom => 'Download From'; + + @override + String get appearanceAmoledDark => 'AMOLED Dark'; + + @override + String get appearanceAmoledDarkSubtitle => 'Pure black background'; + + @override + String get queueClearAll => 'Clear All'; + + @override + String get queueClearAllMessage => + 'Are you sure you want to clear all downloads?'; + + @override + String get settingsAutoExportFailed => 'Auto-export failed downloads'; + + @override + String get settingsAutoExportFailedSubtitle => + 'Save failed downloads to TXT file automatically'; + + @override + String get settingsDownloadNetwork => 'Download Network'; + + @override + String get settingsDownloadNetworkAny => 'WiFi + Mobile Data'; + + @override + String get settingsDownloadNetworkWifiOnly => 'WiFi Only'; + + @override + String get settingsDownloadNetworkSubtitle => + 'Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.'; + + @override + String get albumFolderArtistAlbum => 'Artist / Album'; + + @override + String get albumFolderArtistAlbumSubtitle => 'Albums/Artist Name/Album Name/'; + + @override + String get albumFolderArtistYearAlbum => 'Artist / [Year] Album'; + + @override + String get albumFolderArtistYearAlbumSubtitle => + 'Albums/Artist Name/[2005] Album Name/'; + + @override + String get albumFolderAlbumOnly => 'Album Only'; + + @override + String get albumFolderAlbumOnlySubtitle => 'Albums/Album Name/'; + + @override + String get albumFolderYearAlbum => '[Year] Album'; + + @override + String get albumFolderYearAlbumSubtitle => 'Albums/[2005] Album Name/'; + + @override + String get albumFolderArtistAlbumSingles => 'Artist / Album + Singles'; + + @override + String get albumFolderArtistAlbumSinglesSubtitle => + 'Artist/Album/ and Artist/Singles/'; + + @override + String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => + 'Artist/Album/ and Artist/song.flac'; + + @override + String get downloadedAlbumDeleteSelected => 'Delete Selected'; + + @override + String downloadedAlbumDeleteMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Delete $count $_temp0 from this album?\n\nThis will also delete the files from storage.'; + } + + @override + String downloadedAlbumSelectedCount(int count) { + return '$count selected'; + } + + @override + String get downloadedAlbumAllSelected => 'All tracks selected'; + + @override + String get downloadedAlbumTapToSelect => 'Tap tracks to select'; + + @override + String downloadedAlbumDeleteCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Delete $count $_temp0'; + } + + @override + String get downloadedAlbumSelectToDelete => 'Select tracks to delete'; + + @override + String downloadedAlbumDiscHeader(int discNumber) { + return 'Disc $discNumber'; + } + + @override + String get recentTypeArtist => 'Artist'; + + @override + String get recentTypeAlbum => 'Album'; + + @override + String get recentTypeSong => 'Song'; + + @override + String get recentTypePlaylist => 'Playlist'; + + @override + String get recentEmpty => 'No recent items yet'; + + @override + String get recentShowAllDownloads => 'Show All Downloads'; + + @override + String recentPlaylistInfo(String name) { + return 'Playlist: $name'; + } + + @override + String get discographyDownload => 'Download Discography'; + + @override + String get discographyDownloadAll => 'Download All'; + + @override + String discographyDownloadAllSubtitle(int count, int albumCount) { + return '$count tracks from $albumCount releases'; + } + + @override + String get discographyAlbumsOnly => 'Albums Only'; + + @override + String discographyAlbumsOnlySubtitle(int count, int albumCount) { + return '$count tracks from $albumCount albums'; + } + + @override + String get discographySinglesOnly => 'Singles & EPs Only'; + + @override + String discographySinglesOnlySubtitle(int count, int albumCount) { + return '$count tracks from $albumCount singles'; + } + + @override + String get discographySelectAlbums => 'Select Albums...'; + + @override + String get discographySelectAlbumsSubtitle => + 'Choose specific albums or singles'; + + @override + String get discographyFetchingTracks => 'Fetching tracks...'; + + @override + String discographyFetchingAlbum(int current, int total) { + return 'Fetching $current of $total...'; + } + + @override + String discographySelectedCount(int count) { + return '$count selected'; + } + + @override + String get discographyDownloadSelected => 'Download Selected'; + + @override + String discographyAddedToQueue(int count) { + return 'Added $count tracks to queue'; + } + + @override + String discographySkippedDownloaded(int added, int skipped) { + return '$added added, $skipped already downloaded'; + } + + @override + String get discographyNoAlbums => 'No albums available'; + + @override + String get discographyFailedToFetch => 'Failed to fetch some albums'; + + @override + String get sectionStorageAccess => 'Storage Access'; + + @override + String get allFilesAccess => 'All Files Access'; + + @override + String get allFilesAccessEnabledSubtitle => 'Can write to any folder'; + + @override + String get allFilesAccessDisabledSubtitle => 'Limited to media folders only'; + + @override + String get allFilesAccessDescription => + 'Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.'; + + @override + String get allFilesAccessDeniedMessage => + 'Permission was denied. Please enable \'All files access\' manually in system settings.'; + + @override + String get allFilesAccessDisabledMessage => + 'All Files Access disabled. The app will use limited storage access.'; + + @override + String get settingsLocalLibrary => 'Local Library'; + + @override + String get settingsLocalLibrarySubtitle => 'Scan music & detect duplicates'; + + @override + String get settingsCache => 'Storage & Cache'; + + @override + String get settingsCacheSubtitle => 'View size and clear cached data'; + + @override + String get libraryTitle => 'Local Library'; + + @override + String get libraryScanSettings => 'Scan Settings'; + + @override + String get libraryEnableLocalLibrary => 'Enable Local Library'; + + @override + String get libraryEnableLocalLibrarySubtitle => + 'Scan and track your existing music'; + + @override + String get libraryFolder => 'Library Folder'; + + @override + String get libraryFolderHint => 'Tap to select folder'; + + @override + String get libraryShowDuplicateIndicator => 'Show Duplicate Indicator'; + + @override + String get libraryShowDuplicateIndicatorSubtitle => + 'Show when searching for existing tracks'; + + @override + String get libraryAutoScan => 'Auto Scan'; + + @override + String get libraryAutoScanSubtitle => + 'Automatically scan your library for new files'; + + @override + String get libraryAutoScanOff => 'Off'; + + @override + String get libraryAutoScanOnOpen => 'Every app open'; + + @override + String get libraryAutoScanDaily => 'Daily'; + + @override + String get libraryAutoScanWeekly => 'Weekly'; + + @override + String get libraryActions => 'Actions'; + + @override + String get libraryScan => 'Scan Library'; + + @override + String get libraryScanSubtitle => 'Scan for audio files'; + + @override + String get libraryScanSelectFolderFirst => 'Select a folder first'; + + @override + String get libraryCleanupMissingFiles => 'Cleanup Missing Files'; + + @override + String get libraryCleanupMissingFilesSubtitle => + 'Remove entries for files that no longer exist'; + + @override + String get libraryClear => 'Clear Library'; + + @override + String get libraryClearSubtitle => 'Remove all scanned tracks'; + + @override + String get libraryClearConfirmTitle => 'Clear Library'; + + @override + String get libraryClearConfirmMessage => + 'This will remove all scanned tracks from your library. Your actual music files will not be deleted.'; + + @override + String get libraryAbout => 'About Local Library'; + + @override + String get libraryAboutDescription => + 'Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.'; + + @override + String libraryTracksUnit(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return '$_temp0'; + } + + @override + String libraryFilesUnit(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'files', + one: 'file', + ); + return '$_temp0'; + } + + @override + String libraryLastScanned(String time) { + return 'Last scanned: $time'; + } + + @override + String get libraryLastScannedNever => 'Never'; + + @override + String get libraryScanning => 'Scanning...'; + + @override + String get libraryScanFinalizing => 'Finalizing library...'; + + @override + String libraryScanProgress(String progress, int total) { + return '$progress% of $total files'; + } + + @override + String get libraryInLibrary => 'In Library'; + + @override + String libraryRemovedMissingFiles(int count) { + return 'Removed $count missing files from library'; + } + + @override + String get libraryCleared => 'Library cleared'; + + @override + String get libraryStorageAccessRequired => 'Storage Access Required'; + + @override + String get libraryStorageAccessMessage => + 'SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.'; + + @override + String get libraryFolderNotExist => 'Selected folder does not exist'; + + @override + String get librarySourceDownloaded => 'Downloaded'; + + @override + String get librarySourceLocal => 'Local'; + + @override + String get libraryFilterAll => 'All'; + + @override + String get libraryFilterDownloaded => 'Downloaded'; + + @override + String get libraryFilterLocal => 'Local'; + + @override + String get libraryFilterTitle => 'Filters'; + + @override + String get libraryFilterReset => 'Reset'; + + @override + String get libraryFilterApply => 'Apply'; + + @override + String get libraryFilterSource => 'Source'; + + @override + String get libraryFilterQuality => 'Quality'; + + @override + String get libraryFilterQualityHiRes => 'Hi-Res (24bit)'; + + @override + String get libraryFilterQualityCD => 'CD (16bit)'; + + @override + String get libraryFilterQualityLossy => 'Lossy'; + + @override + String get libraryFilterFormat => 'Format'; + + @override + String get libraryFilterMetadata => 'Metadata'; + + @override + String get libraryFilterMetadataComplete => 'Complete metadata'; + + @override + String get libraryFilterMetadataMissingAny => 'Missing any metadata'; + + @override + String get libraryFilterMetadataMissingYear => 'Missing year'; + + @override + String get libraryFilterMetadataMissingGenre => 'Missing genre'; + + @override + String get libraryFilterMetadataMissingAlbumArtist => 'Missing album artist'; + + @override + String get libraryFilterSort => 'Sort'; + + @override + String get libraryFilterSortLatest => 'Latest'; + + @override + String get libraryFilterSortOldest => 'Oldest'; + + @override + String get libraryFilterSortAlbumAsc => 'Album (A-Z)'; + + @override + String get libraryFilterSortAlbumDesc => 'Album (Z-A)'; + + @override + String get libraryFilterSortGenreAsc => 'Genre (A-Z)'; + + @override + String get libraryFilterSortGenreDesc => 'Genre (Z-A)'; + + @override + String get timeJustNow => 'Just now'; + + @override + String timeMinutesAgo(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count minutes ago', + one: '1 minute ago', + ); + return '$_temp0'; + } + + @override + String timeHoursAgo(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count hours ago', + one: '1 hour ago', + ); + return '$_temp0'; + } + + @override + String get tutorialWelcomeTitle => 'Welcome to SpotiFLAC!'; + + @override + String get tutorialWelcomeDesc => + 'Let\'s learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.'; + + @override + String get tutorialWelcomeTip1 => + 'Download music from Spotify, Deezer, or paste any supported URL'; + + @override + String get tutorialWelcomeTip2 => + 'Get FLAC quality audio from Tidal, Qobuz, or Deezer'; + + @override + String get tutorialWelcomeTip3 => + 'Automatic metadata, cover art, and lyrics embedding'; + + @override + String get tutorialSearchTitle => 'Finding Music'; + + @override + String get tutorialSearchDesc => + 'There are two easy ways to find music you want to download.'; + + @override + String get tutorialDownloadTitle => 'Downloading Music'; + + @override + String get tutorialDownloadDesc => + 'Downloading music is simple and fast. Here\'s how it works.'; + + @override + String get tutorialLibraryTitle => 'Your Library'; + + @override + String get tutorialLibraryDesc => + 'All your downloaded music is organized in the Library tab.'; + + @override + String get tutorialLibraryTip1 => + 'View download progress and queue in the Library tab'; + + @override + String get tutorialLibraryTip2 => + 'Tap any track to play it with your music player'; + + @override + String get tutorialLibraryTip3 => + 'Switch between list and grid view for better browsing'; + + @override + String get tutorialExtensionsTitle => 'Extensions'; + + @override + String get tutorialExtensionsDesc => + 'Extend the app\'s capabilities with community extensions.'; + + @override + String get tutorialExtensionsTip1 => + 'Browse the Repo tab to discover useful extensions'; + + @override + String get tutorialExtensionsTip2 => + 'Add new download providers or search sources'; + + @override + String get tutorialExtensionsTip3 => + 'Get lyrics, enhanced metadata, and more features'; + + @override + String get tutorialSettingsTitle => 'Customize Your Experience'; + + @override + String get tutorialSettingsDesc => + 'Personalize the app in Settings to match your preferences.'; + + @override + String get tutorialSettingsTip1 => + 'Change download location and folder organization'; + + @override + String get tutorialSettingsTip2 => + 'Set default audio quality and format preferences'; + + @override + String get tutorialSettingsTip3 => 'Customize app theme and appearance'; + + @override + String get tutorialReadyMessage => + 'You\'re all set! Start downloading your favorite music now.'; + + @override + String get libraryForceFullScan => 'Force Full Scan'; + + @override + String get libraryForceFullScanSubtitle => 'Rescan all files, ignoring cache'; + + @override + String get cleanupOrphanedDownloads => 'Cleanup Orphaned Downloads'; + + @override + String get cleanupOrphanedDownloadsSubtitle => + 'Remove history entries for files that no longer exist'; + + @override + String cleanupOrphanedDownloadsResult(int count) { + return 'Removed $count orphaned entries from history'; + } + + @override + String get cleanupOrphanedDownloadsNone => 'No orphaned entries found'; + + @override + String get cacheTitle => 'Storage & Cache'; + + @override + String get cacheSummaryTitle => 'Cache overview'; + + @override + String get cacheSummarySubtitle => + 'Clearing cache will not remove downloaded music files.'; + + @override + String cacheEstimatedTotal(String size) { + return 'Estimated cache usage: $size'; + } + + @override + String get cacheSectionStorage => 'Cached Data'; + + @override + String get cacheSectionMaintenance => 'Maintenance'; + + @override + String get cacheAppDirectory => 'App cache directory'; + + @override + String get cacheAppDirectoryDesc => + 'HTTP responses, WebView data, and other temporary app data.'; + + @override + String get cacheTempDirectory => 'Temporary directory'; + + @override + String get cacheTempDirectoryDesc => + 'Temporary files from downloads and audio conversion.'; + + @override + String get cacheCoverImage => 'Cover image cache'; + + @override + String get cacheCoverImageDesc => + 'Downloaded album and track cover art. Will re-download when viewed.'; + + @override + String get cacheLibraryCover => 'Library cover cache'; + + @override + String get cacheLibraryCoverDesc => + 'Cover art extracted from local music files. Will re-extract on next scan.'; + + @override + String get cacheExploreFeed => 'Explore feed cache'; + + @override + String get cacheExploreFeedDesc => + 'Explore tab content (new releases, trending). Will refresh on next visit.'; + + @override + String get cacheTrackLookup => 'Track lookup cache'; + + @override + String get cacheTrackLookupDesc => + 'Spotify/Deezer track ID lookups. Clearing may slow next few searches.'; + + @override + String get cacheCleanupUnusedDesc => + 'Remove orphaned download history and library entries for missing files.'; + + @override + String get cacheNoData => 'No cached data'; + + @override + String cacheSizeWithFiles(String size, int count) { + return '$size in $count files'; + } + + @override + String cacheSizeOnly(String size) { + return '$size'; + } + + @override + String cacheEntries(int count) { + return '$count entries'; + } + + @override + String cacheClearSuccess(String target) { + return 'Cleared: $target'; + } + + @override + String get cacheClearConfirmTitle => 'Clear cache?'; + + @override + String cacheClearConfirmMessage(String target) { + return 'This will clear cached data for $target. Downloaded music files will not be deleted.'; + } + + @override + String get cacheClearAllConfirmTitle => 'Clear all cache?'; + + @override + String get cacheClearAllConfirmMessage => + 'This will clear all cache categories on this page. Downloaded music files will not be deleted.'; + + @override + String get cacheClearAll => 'Clear all cache'; + + @override + String get cacheCleanupUnused => 'Cleanup unused data'; + + @override + String get cacheCleanupUnusedSubtitle => + 'Remove orphaned download history and missing library entries'; + + @override + String cacheCleanupResult(int downloadCount, int libraryCount) { + return 'Cleanup completed: $downloadCount orphaned downloads, $libraryCount missing library entries'; + } + + @override + String get cacheRefreshStats => 'Refresh stats'; + + @override + String get trackSaveCoverArt => 'Save Cover Art'; + + @override + String get trackSaveCoverArtSubtitle => 'Save album art as .jpg file'; + + @override + String get trackSaveLyrics => 'Save Lyrics (.lrc)'; + + @override + String get trackSaveLyricsSubtitle => 'Fetch and save lyrics as .lrc file'; + + @override + String get trackSaveLyricsProgress => 'Saving lyrics...'; + + @override + String get trackReEnrich => 'Re-enrich'; + + @override + String get trackReEnrichOnlineSubtitle => + 'Search metadata online and embed into file'; + + @override + String get trackReEnrichFieldsTitle => 'Fields to update'; + + @override + String get trackReEnrichFieldCover => 'Cover Art'; + + @override + String get trackReEnrichFieldLyrics => 'Lyrics'; + + @override + String get trackReEnrichFieldBasicTags => 'Album, Album Artist'; + + @override + String get trackReEnrichFieldTrackInfo => 'Track & Disc Number'; + + @override + String get trackReEnrichFieldReleaseInfo => 'Date & ISRC'; + + @override + String get trackReEnrichFieldExtra => 'Genre, Label, Copyright'; + + @override + String get trackReEnrichSelectAll => 'Select All'; + + @override + String get trackEditMetadata => 'Edit Metadata'; + + @override + String trackCoverSaved(String fileName) { + return 'Cover art saved to $fileName'; + } + + @override + String get trackCoverNoSource => 'No cover art source available'; + + @override + String trackLyricsSaved(String fileName) { + return 'Lyrics saved to $fileName'; + } + + @override + String get trackReEnrichProgress => 'Re-enriching metadata...'; + + @override + String get trackReEnrichSearching => 'Searching metadata online...'; + + @override + String get trackReEnrichSuccess => 'Metadata re-enriched successfully'; + + @override + String get trackReEnrichFfmpegFailed => 'FFmpeg metadata embed failed'; + + @override + String get queueFlacAction => 'Queue FLAC'; + + @override + String queueFlacConfirmMessage(int count) { + return 'Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n$count selected'; + } + + @override + String queueFlacFindingProgress(int current, int total) { + return 'Finding FLAC matches... ($current/$total)'; + } + + @override + String get queueFlacNoReliableMatches => + 'No reliable online matches found for the selection'; + + @override + String queueFlacQueuedWithSkipped(int addedCount, int skippedCount) { + return 'Added $addedCount tracks to queue, skipped $skippedCount'; + } + + @override + String trackSaveFailed(String error) { + return 'Failed: $error'; + } + + @override + String get trackConvertFormat => 'Convert Format'; + + @override + String get trackConvertFormatSubtitle => + 'Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC'; + + @override + String get trackConvertTitle => 'Convert Audio'; + + @override + String get trackConvertTargetFormat => 'Target Format'; + + @override + String get trackConvertBitrate => 'Bitrate'; + + @override + String get trackConvertConfirmTitle => 'Confirm Conversion'; + + @override + String trackConvertConfirmMessage( + String sourceFormat, + String targetFormat, + String bitrate, + ) { + return 'Convert from $sourceFormat to $targetFormat at $bitrate?\n\nThe original file will be deleted after conversion.'; + } + + @override + String trackConvertConfirmMessageLossless( + String sourceFormat, + String targetFormat, + ) { + return 'Convert from $sourceFormat to $targetFormat? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.'; + } + + @override + String get trackConvertLosslessHint => + 'Lossless conversion — no quality loss'; + + @override + String get trackConvertConverting => 'Converting audio...'; + + @override + String trackConvertSuccess(String format) { + return 'Converted to $format successfully'; + } + + @override + String get trackConvertFailed => 'Conversion failed'; + + @override + String get cueSplitTitle => 'Split CUE Sheet'; + + @override + String get cueSplitSubtitle => 'Split CUE+FLAC into individual tracks'; + + @override + String cueSplitAlbum(String album) { + return 'Album: $album'; + } + + @override + String cueSplitArtist(String artist) { + return 'Artist: $artist'; + } + + @override + String cueSplitTrackCount(int count) { + return '$count tracks'; + } + + @override + String get cueSplitConfirmTitle => 'Split CUE Album'; + + @override + String cueSplitConfirmMessage(String album, int count) { + return 'Split \"$album\" into $count individual FLAC files?\n\nFiles will be saved to the same directory.'; + } + + @override + String cueSplitSplitting(int current, int total) { + return 'Splitting CUE sheet... ($current/$total)'; + } + + @override + String cueSplitSuccess(int count) { + return 'Split into $count tracks successfully'; + } + + @override + String get cueSplitFailed => 'CUE split failed'; + + @override + String get cueSplitNoAudioFile => 'Audio file not found for this CUE sheet'; + + @override + String get cueSplitButton => 'Split into Tracks'; + + @override + String get actionCreate => 'Create'; + + @override + String get collectionFoldersTitle => 'My folders'; + + @override + String get collectionWishlist => 'Wishlist'; + + @override + String get collectionLoved => 'Loved'; + + @override + String get collectionFavoriteArtists => 'Favorite Artists'; + + @override + String get collectionPlaylists => 'Playlists'; + + @override + String get collectionPlaylist => 'Playlist'; + + @override + String get collectionAddToPlaylist => 'Add to playlist'; + + @override + String get collectionCreatePlaylist => 'Create playlist'; + + @override + String get collectionNoPlaylistsYet => 'No playlists yet'; + + @override + String get collectionNoPlaylistsSubtitle => + 'Create a playlist to start categorizing tracks'; + + @override + String collectionPlaylistTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks', + one: '1 track', + ); + return '$_temp0'; + } + + @override + String collectionArtistCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count artists', + one: '1 artist', + ); + return '$_temp0'; + } + + @override + String collectionAddedToPlaylist(String playlistName) { + return 'Added to \"$playlistName\"'; + } + + @override + String collectionAlreadyInPlaylist(String playlistName) { + return 'Already in \"$playlistName\"'; + } + + @override + String get collectionPlaylistCreated => 'Playlist created'; + + @override + String get collectionPlaylistNameHint => 'Playlist name'; + + @override + String get collectionPlaylistNameRequired => 'Playlist name is required'; + + @override + String get collectionRenamePlaylist => 'Rename playlist'; + + @override + String get collectionDeletePlaylist => 'Delete playlist'; + + @override + String collectionDeletePlaylistMessage(String playlistName) { + return 'Delete \"$playlistName\" and all tracks inside it?'; + } + + @override + String get collectionPlaylistDeleted => 'Playlist deleted'; + + @override + String get collectionPlaylistRenamed => 'Playlist renamed'; + + @override + String get collectionWishlistEmptyTitle => 'Wishlist is empty'; + + @override + String get collectionWishlistEmptySubtitle => + 'Tap + on tracks to save what you want to download later'; + + @override + String get collectionLovedEmptyTitle => 'Loved folder is empty'; + + @override + String get collectionLovedEmptySubtitle => + 'Tap love on tracks to keep your favorites'; + + @override + String get collectionFavoriteArtistsEmptyTitle => 'No favorite artists yet'; + + @override + String get collectionFavoriteArtistsEmptySubtitle => + 'Tap the heart on an artist page to keep them here'; + + @override + String get collectionPlaylistEmptyTitle => 'Playlist is empty'; + + @override + String get collectionPlaylistEmptySubtitle => + 'Long-press + on any track to add it here'; + + @override + String get collectionRemoveFromPlaylist => 'Remove from playlist'; + + @override + String get collectionRemoveFromFolder => 'Remove from folder'; + + @override + String collectionRemoved(String trackName) { + return '\"$trackName\" removed'; + } + + @override + String collectionAddedToLoved(String trackName) { + return '\"$trackName\" added to Loved'; + } + + @override + String collectionRemovedFromLoved(String trackName) { + return '\"$trackName\" removed from Loved'; + } + + @override + String collectionAddedToWishlist(String trackName) { + return '\"$trackName\" added to Wishlist'; + } + + @override + String collectionRemovedFromWishlist(String trackName) { + return '\"$trackName\" removed from Wishlist'; + } + + @override + String collectionAddedToFavoriteArtists(String artistName) { + return '\"$artistName\" added to Favorite Artists'; + } + + @override + String collectionRemovedFromFavoriteArtists(String artistName) { + return '\"$artistName\" removed from Favorite Artists'; + } + + @override + String get trackOptionAddToLoved => 'Add to Loved'; + + @override + String get trackOptionRemoveFromLoved => 'Remove from Loved'; + + @override + String get trackOptionAddToWishlist => 'Add to Wishlist'; + + @override + String get trackOptionRemoveFromWishlist => 'Remove from Wishlist'; + + @override + String get artistOptionAddToFavorites => 'Add to Favorite Artists'; + + @override + String get artistOptionRemoveFromFavorites => 'Remove from Favorite Artists'; + + @override + String get collectionPlaylistChangeCover => 'Change cover image'; + + @override + String get collectionPlaylistRemoveCover => 'Remove cover image'; + + @override + String selectionShareCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Share $count $_temp0'; + } + + @override + String get selectionShareNoFiles => 'No shareable files found'; + + @override + String selectionConvertCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Convert $count $_temp0'; + } + + @override + String get selectionConvertNoConvertible => 'No convertible tracks selected'; + + @override + String get selectionBatchConvertConfirmTitle => 'Batch Convert'; + + @override + String selectionBatchConvertConfirmMessage( + int count, + String format, + String bitrate, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Convert $count $_temp0 to $format at $bitrate?\n\nOriginal files will be deleted after conversion.'; + } + + @override + String selectionBatchConvertConfirmMessageLossless(int count, String format) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Convert $count $_temp0 to $format? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.'; + } + + @override + String selectionBatchConvertProgress(int current, int total) { + return 'Converting $current of $total...'; + } + + @override + String selectionBatchConvertSuccess(int success, int total, String format) { + return 'Converted $success of $total tracks to $format'; + } + + @override + String downloadedAlbumDownloadedCount(int count) { + return '$count downloaded'; + } + + @override + String get downloadUseAlbumArtistForFoldersAlbumSubtitle => + 'Folder named after Album Artist tag'; + + @override + String get downloadUseAlbumArtistForFoldersTrackSubtitle => + 'Folder named after Track Artist tag'; + + @override + String get lyricsProvidersTitle => 'Lyrics Provider Priority'; + + @override + String get lyricsProvidersDescription => + 'Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.'; + + @override + String get lyricsProvidersInfoText => + 'Extension lyrics providers always run before built-in providers. At least one provider must remain enabled.'; + + @override + String lyricsProvidersEnabledSection(int count) { + return 'Enabled ($count)'; + } + + @override + String lyricsProvidersDisabledSection(int count) { + return 'Disabled ($count)'; + } + + @override + String get lyricsProvidersAtLeastOne => + 'At least one provider must remain enabled'; + + @override + String get lyricsProvidersSaved => 'Lyrics provider priority saved'; + + @override + String get lyricsProvidersDiscardContent => + 'You have unsaved changes that will be lost.'; + + @override + String get lyricsProviderLrclibDesc => 'Open-source synced lyrics database'; + + @override + String get lyricsProviderNeteaseDesc => + 'NetEase Cloud Music (good for Asian songs)'; + + @override + String get lyricsProviderMusixmatchDesc => + 'Largest lyrics database (multi-language)'; + + @override + String get lyricsProviderAppleMusicDesc => + 'Word-by-word synced lyrics (via proxy)'; + + @override + String get lyricsProviderQqMusicDesc => + 'QQ Music (good for Chinese songs, via proxy)'; + + @override + String get lyricsProviderExtensionDesc => 'Extension provider'; + + @override + String get safMigrationTitle => 'Storage Update Required'; + + @override + String get safMigrationMessage1 => + 'SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.'; + + @override + String get safMigrationMessage2 => + 'Please select your download folder again to switch to the new storage system.'; + + @override + String get safMigrationSuccess => 'Download folder updated to SAF mode'; + + @override + String get settingsDonate => 'Support Development'; + + @override + String get settingsDonateSubtitle => 'Buy the developer a coffee'; + + @override + String get tooltipLoveAll => 'Love All'; + + @override + String get tooltipAddToPlaylist => 'Add to Playlist'; + + @override + String snackbarRemovedTracksFromLoved(int count) { + return 'Removed $count tracks from Loved'; + } + + @override + String snackbarAddedTracksToLoved(int count) { + return 'Added $count tracks to Loved'; + } + + @override + String get dialogDownloadAllTitle => 'Download All'; + + @override + String dialogDownloadAllMessage(int count) { + return 'Download $count tracks?'; + } + + @override + String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; + + @override + String get homeGoToAlbum => 'Go to Album'; + + @override + String get homeAlbumInfoUnavailable => 'Album info not available'; + + @override + String get snackbarLoadingCueSheet => 'Loading CUE sheet...'; + + @override + String get snackbarMetadataSaved => 'Metadata saved successfully'; + + @override + String get snackbarFailedToEmbedLyrics => 'Failed to embed lyrics'; + + @override + String get snackbarFailedToWriteStorage => 'Failed to write back to storage'; + + @override + String snackbarError(String error) { + return 'Error: $error'; + } + + @override + String get snackbarNoActionDefined => 'No action defined for this button'; + + @override + String get noTracksFoundForAlbum => 'No tracks found for this album'; + + @override + String get downloadLocationSubtitle => + 'Choose where to save your downloaded tracks'; + + @override + String get storageModeAppFolder => 'App Folder (Recommended)'; + + @override + String get storageModeAppFolderSubtitle => + 'Saves to Music/SpotiFLAC by default'; + + @override + String get storageModeSaf => 'Custom Folder (SAF)'; + + @override + String get storageModeSafSubtitle => 'Pick any folder, including SD card'; + + @override + String downloadFilenameDescription( + Object album, + Object artist, + Object date, + Object disc, + Object title, + Object track, + Object year, + ) { + return 'Use $artist, $title, $album, $track, $year, $date, $disc as placeholders.'; + } + + @override + String get downloadFilenameInsertTag => 'Tap to insert tag:'; + + @override + String get downloadSeparateSinglesEnabled => + 'Singles and EPs saved in a separate folder'; + + @override + String get downloadSeparateSinglesDisabled => + 'Singles and albums saved in the same folder'; + + @override + String get downloadArtistNameFilters => 'Artist Name Filters'; + + @override + String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder'; + + @override + String get downloadCreatePlaylistSourceFolderEnabled => + 'A subfolder is created for each playlist'; + + @override + String get downloadCreatePlaylistSourceFolderDisabled => + 'All tracks saved directly to download folder'; + + @override + String get downloadCreatePlaylistSourceFolderRedundant => + 'Handled by folder organization setting'; + + @override + String get downloadSongLinkRegion => 'SongLink Region'; + + @override + String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode'; + + @override + String get downloadNetworkCompatibilityModeEnabled => + 'Using legacy TLS settings for older networks'; + + @override + String get downloadNetworkCompatibilityModeDisabled => + 'Using standard network settings'; + + @override + String get downloadSelectServiceToEnable => + 'Select Tidal or Qobuz to enable this option'; + + @override + String get downloadSelectTidalQobuz => + 'Select Tidal or Qobuz to choose audio quality'; + + @override + String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first'; + + @override + String get downloadNeteaseIncludeTranslation => + 'Netease: Include Translation'; + + @override + String get downloadNeteaseIncludeTranslationEnabled => + 'Chinese translation lines included'; + + @override + String get downloadNeteaseIncludeTranslationDisabled => + 'Original lyrics only'; + + @override + String get downloadNeteaseIncludeRomanization => + 'Netease: Include Romanization'; + + @override + String get downloadNeteaseIncludeRomanizationEnabled => + 'Romanization lines included'; + + @override + String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization'; + + @override + String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics'; + + @override + String get downloadAppleQqMultiPersonEnabled => + 'Speaker labels included for duets and group tracks'; + + @override + String get downloadAppleQqMultiPersonDisabled => + 'Standard lyrics without speaker labels'; + + @override + String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; + + @override + String get downloadAppleElrcWordSyncEnabled => + 'Raw word-by-word timestamps preserved'; + + @override + String get downloadAppleElrcWordSyncDisabled => + 'Safer line-by-line Apple Music lyrics'; + + @override + String get downloadMusixmatchLanguage => 'Musixmatch Language'; + + @override + String get downloadMusixmatchLanguageAuto => 'Auto (original language)'; + + @override + String get downloadFilterContributing => 'Filter Contributing Artists'; + + @override + String get downloadFilterContributingEnabled => + 'Contributing artists removed from Album Artist folder name'; + + @override + String get downloadFilterContributingDisabled => + 'Full Album Artist string used'; + + @override + String get downloadProvidersNoneEnabled => 'No providers enabled'; + + @override + String get downloadMusixmatchLanguageCode => 'Language code'; + + @override + String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja'; + + @override + String get downloadMusixmatchLanguageDesc => + 'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.'; + + @override + String get downloadMusixmatchAuto => 'Auto'; + + @override + String get downloadNetworkAnySubtitle => 'Use WiFi or mobile data'; + + @override + String get downloadNetworkWifiOnlySubtitle => + 'Downloads pause when on mobile data'; + + @override + String get downloadSongLinkRegionDesc => + 'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.'; + + @override + String get snackbarUnsupportedAudioFormat => 'Unsupported audio format'; + + @override + String get cacheRefresh => 'Refresh'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: 'tracks', + one: 'track', + ); + String _temp1 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $count $_temp0'; + } + + @override + String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + + @override + String get snackbarSelectedPlaylistsEmpty => + 'Selected playlists have no tracks'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count playlists', + one: '1 playlist', + ); + return '$_temp0'; + } + + @override + String get editMetadataAutoFill => 'Auto-fill from online'; + + @override + String get editMetadataAutoFillDesc => + 'Select fields to fill automatically from online metadata'; + + @override + String get editMetadataAutoFillFetch => 'Fetch & Fill'; + + @override + String get editMetadataAutoFillSearching => 'Searching online...'; + + @override + String get editMetadataAutoFillNoResults => + 'No matching metadata found online'; + + @override + String editMetadataAutoFillDone(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'fields', + one: 'field', + ); + return 'Filled $count $_temp0 from online metadata'; + } + + @override + String get editMetadataAutoFillNoneSelected => + 'Select at least one field to auto-fill'; + + @override + String get editMetadataFieldTitle => 'Title'; + + @override + String get editMetadataFieldArtist => 'Artist'; + + @override + String get editMetadataFieldAlbum => 'Album'; + + @override + String get editMetadataFieldAlbumArtist => 'Album Artist'; + + @override + String get editMetadataFieldDate => 'Date'; + + @override + String get editMetadataFieldTrackNum => 'Track #'; + + @override + String get editMetadataFieldDiscNum => 'Disc #'; + + @override + String get editMetadataFieldGenre => 'Genre'; + + @override + String get editMetadataFieldIsrc => 'ISRC'; + + @override + String get editMetadataFieldLabel => 'Label'; + + @override + String get editMetadataFieldCopyright => 'Copyright'; + + @override + String get editMetadataFieldCover => 'Cover Art'; + + @override + String get editMetadataSelectAll => 'All'; + + @override + String get editMetadataSelectEmpty => 'Empty only'; + + @override + String queueDownloadingCount(int count) { + return 'Downloading ($count)'; + } + + @override + String get queueDownloadedHeader => 'Downloaded'; + + @override + String get queueFilteringIndicator => 'Filtering...'; + + @override + String queueTrackCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks', + one: '1 track', + ); + return '$_temp0'; + } + + @override + String queueAlbumCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count albums', + one: '1 album', + ); + return '$_temp0'; + } + + @override + String get queueEmptyAlbums => 'No album downloads'; + + @override + String get queueEmptyAlbumsSubtitle => + 'Download multiple tracks from an album to see them here'; + + @override + String get queueEmptySingles => 'No single downloads'; + + @override + String get queueEmptySinglesSubtitle => + 'Single track downloads will appear here'; + + @override + String get queueEmptyHistory => 'No download history'; + + @override + String get queueEmptyHistorySubtitle => 'Downloaded tracks will appear here'; + + @override + String get selectionAllPlaylistsSelected => 'All playlists selected'; + + @override + String get selectionTapPlaylistsToSelect => 'Tap playlists to select'; + + @override + String get selectionSelectPlaylistsToDelete => 'Select playlists to delete'; + + @override + String get audioAnalysisTitle => 'Audio Quality Analysis'; + + @override + String get audioAnalysisDescription => + 'Verify lossless quality with spectrum analysis'; + + @override + String get audioAnalysisAnalyzing => 'Analyzing audio...'; + + @override + String get audioAnalysisSampleRate => 'Sample Rate'; + + @override + String get audioAnalysisCodec => 'Codec'; + + @override + String get audioAnalysisContainer => 'Container'; + + @override + String get audioAnalysisDecodedFormat => 'Decoded Format'; + + @override + String get audioAnalysisBitDepth => 'Bit Depth'; + + @override + String get audioAnalysisChannels => 'Channels'; + + @override + String get audioAnalysisDuration => 'Duration'; + + @override + String get audioAnalysisNyquist => 'Nyquist'; + + @override + String get audioAnalysisFileSize => 'Size'; + + @override + String get audioAnalysisDynamicRange => 'Dynamic Range'; + + @override + String get audioAnalysisPeak => 'Peak'; + + @override + String get audioAnalysisRms => 'RMS'; + + @override + String get audioAnalysisLufs => 'LUFS'; + + @override + String get audioAnalysisTruePeak => 'True Peak'; + + @override + String get audioAnalysisClipping => 'Clipping'; + + @override + String get audioAnalysisNoClipping => 'No clipping'; + + @override + String get audioAnalysisSpectralCutoff => 'Spectral Cutoff'; + + @override + String get audioAnalysisChannelStats => 'Per-channel Stats'; + + @override + String get audioAnalysisSamples => 'Samples'; + + @override + String get audioAnalysisRescan => 'Re-analyze'; + + @override + String get audioAnalysisRescanning => 'Re-analyzing audio...'; + + @override + String extensionsSearchWith(String providerName) { + return 'Search with $providerName'; + } + + @override + String get extensionsHomeFeedProvider => 'Home Feed Provider'; + + @override + String get extensionsHomeFeedDescription => + 'Choose which extension provides the home feed on the main screen'; + + @override + String get extensionsHomeFeedAuto => 'Auto'; + + @override + String get extensionsHomeFeedAutoSubtitle => + 'Automatically select the best available'; + + @override + String get extensionsHomeFeedOff => 'Off'; + + @override + String get extensionsHomeFeedOffSubtitle => + 'Do not show the home feed on the main screen'; + + @override + String extensionsHomeFeedUse(String extensionName) { + return 'Use $extensionName home feed'; + } + + @override + String get extensionsNoHomeFeedExtensions => 'No extensions with home feed'; + + @override + String get sortAlphaAsc => 'A-Z'; + + @override + String get sortAlphaDesc => 'Z-A'; + + @override + String get cancelDownloadTitle => 'Cancel download?'; + + @override + String cancelDownloadContent(String trackName) { + return 'This will cancel the active download for \"$trackName\".'; + } + + @override + String get cancelDownloadKeep => 'Keep'; + + @override + String get metadataSaveFailedFfmpeg => 'Failed to save metadata via FFmpeg'; + + @override + String get metadataSaveFailedStorage => + 'Failed to write metadata back to storage'; + + @override + String snackbarFolderPickerFailed(String error) { + return 'Failed to open folder picker: $error'; + } + + @override + String get errorLoadAlbum => 'Failed to load album'; + + @override + String get errorLoadPlaylist => 'Failed to load playlist'; + + @override + String get errorLoadArtist => 'Failed to load artist'; + + @override + String get notifChannelDownloadName => 'Download Progress'; + + @override + String get notifChannelDownloadDesc => 'Shows download progress for tracks'; + + @override + String get notifChannelLibraryScanName => 'Library Scan'; + + @override + String get notifChannelLibraryScanDesc => 'Shows local library scan progress'; + + @override + String notifDownloadingTrack(String trackName) { + return 'Downloading $trackName'; + } + + @override + String notifFinalizingTrack(String trackName) { + return 'Finalizing $trackName'; + } + + @override + String get notifEmbeddingMetadata => 'Embedding metadata...'; + + @override + String notifAlreadyInLibraryCount(int completed, int total) { + return 'Already in Library ($completed/$total)'; + } + + @override + String get notifAlreadyInLibrary => 'Already in Library'; + + @override + String notifDownloadCompleteCount(int completed, int total) { + return 'Download Complete ($completed/$total)'; + } + + @override + String get notifDownloadComplete => 'Download Complete'; + + @override + String notifDownloadsFinished(int completed, int failed) { + return 'Downloads Finished ($completed done, $failed failed)'; + } + + @override + String get notifAllDownloadsComplete => 'All Downloads Complete'; + + @override + String notifTracksDownloadedSuccess(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks downloaded successfully', + one: '1 track downloaded successfully', + ); + return '$_temp0'; + } + + @override + String notifDownloadsFinishedBody(int completed, int failed) { + String _temp0 = intl.Intl.pluralLogic( + completed, + locale: localeName, + other: '$completed tracks downloaded', + one: '1 track downloaded', + ); + String _temp1 = intl.Intl.pluralLogic( + failed, + locale: localeName, + other: '$failed failed', + one: '1 failed', + ); + return '$_temp0, $_temp1'; + } + + @override + String get notifDownloadsCanceledTitle => 'Downloads canceled'; + + @override + String notifDownloadsCanceledBody(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count downloads canceled by user', + one: '1 download canceled by user', + ); + return '$_temp0'; + } + + @override + String get notifScanningLibrary => 'Scanning local library'; + + @override + String notifLibraryScanProgressWithTotal( + int scanned, + int total, + int percentage, + ) { + return '$scanned/$total files • $percentage%'; + } + + @override + String notifLibraryScanProgressNoTotal(int scanned, int percentage) { + return '$scanned files scanned • $percentage%'; + } + + @override + String get notifLibraryScanComplete => 'Library scan complete'; + + @override + String notifLibraryScanCompleteBody(int count) { + return '$count tracks indexed'; + } + + @override + String notifLibraryScanExcluded(int count) { + return '$count excluded'; + } + + @override + String notifLibraryScanErrors(int count) { + return '$count errors'; + } + + @override + String get notifLibraryScanFailed => 'Library scan failed'; + + @override + String get notifLibraryScanCancelled => 'Library scan cancelled'; + + @override + String get notifLibraryScanStopped => 'Scan stopped before completion.'; + + @override + String notifDownloadingUpdate(String version) { + return 'Downloading SpotiFLAC Mobile v$version'; + } + + @override + String notifUpdateProgress(String received, String total, int percentage) { + return '$received / $total MB • $percentage%'; + } + + @override + String get notifUpdateReady => 'Update Ready'; + + @override + String notifUpdateReadyBody(String version) { + return 'SpotiFLAC Mobile v$version downloaded. Tap to install.'; + } + + @override + String get notifUpdateFailed => 'Update Failed'; + + @override + String get notifUpdateFailedBody => + 'Could not download update. Try again later.'; + + @override + String get searchTracks => 'Tracks'; + + @override + String get homeSearchHintDefault => 'Paste supported URL or search...'; + + @override + String homeSearchHintProvider(String providerName) { + return 'Search with $providerName...'; + } + + @override + String get homeImportCsvTooltip => 'Import CSV'; + + @override + String get homeChangeSearchProviderTooltip => 'Change search provider'; + + @override + String get actionPaste => 'Paste'; + + @override + String get searchTracksHint => 'Search tracks...'; + + @override + String get searchTracksEmptyPrompt => 'Search for tracks'; + + @override + String get tutorialSearchHint => 'Paste or search...'; + + @override + String get tutorialDownloadCompletedSemantics => 'Download completed'; + + @override + String get tutorialDownloadInProgressSemantics => 'Download in progress'; + + @override + String get tutorialStartDownloadSemantics => 'Start download'; + + @override + String get optionsEmbedMetadata => 'Embed Metadata'; + + @override + String get optionsEmbedMetadataSubtitleOn => + 'Write metadata, cover art, and embedded lyrics to files'; + + @override + String get optionsEmbedMetadataSubtitleOff => + 'Disabled (advanced): skip all metadata embedding'; + + @override + String get optionsMaxQualityCoverSubtitleDisabled => + 'Disabled when metadata embedding is off'; + + @override + String downloadFilenameHintExample(Object artist, Object title) { + return '$artist - $title'; + } + + @override + String get trackCoverNoEmbeddedArt => 'No embedded album art found'; + + @override + String get trackCoverReplace => 'Replace Cover'; + + @override + String get trackCoverPick => 'Pick Cover'; + + @override + String get trackCoverClearSelected => 'Clear selected cover'; + + @override + String get trackCoverCurrent => 'Current cover'; + + @override + String get trackCoverSelected => 'Selected cover'; + + @override + String get trackCoverReplaceNotice => + 'The selected cover will replace the current embedded cover when you tap Save.'; + + @override + String get actionStop => 'Stop'; + + @override + String get queueFinalizingDownload => 'Finalizing download'; + + @override + String get queueDownloadedFileMissing => 'Downloaded file missing'; + + @override + String get queueDownloadCompleted => 'Download completed'; + + @override + String get queueRateLimitTitle => 'Service rate limited'; + + @override + String get queueRateLimitMessage => + 'This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.'; + + @override + String appearanceSelectAccentColor(String hex) { + return 'Select accent color $hex'; + } + + @override + String get logAutoScrollOn => 'Auto-scroll ON'; + + @override + String get logAutoScrollOff => 'Auto-scroll OFF'; + + @override + String get logCopyLogs => 'Copy logs'; + + @override + String get logClearSearch => 'Clear search'; + + @override + String get logIssueIspBlockingLabel => 'ISP BLOCKING DETECTED'; + + @override + String get logIssueIspBlockingDescription => + 'Your ISP may be blocking access to download services'; + + @override + String get logIssueIspBlockingSuggestion => + 'Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8'; + + @override + String get logIssueRateLimitedLabel => 'RATE LIMITED'; + + @override + String get logIssueRateLimitedDescription => + 'Too many requests to the service'; + + @override + String get logIssueRateLimitedSuggestion => + 'Wait a few minutes before trying again'; + + @override + String get logIssueNetworkErrorLabel => 'NETWORK ERROR'; + + @override + String get logIssueNetworkErrorDescription => 'Connection issues detected'; + + @override + String get logIssueNetworkErrorSuggestion => 'Check your internet connection'; + + @override + String get logIssueTrackNotFoundLabel => 'TRACK NOT FOUND'; + + @override + String get logIssueTrackNotFoundDescription => + 'Some tracks could not be found on download services'; + + @override + String get logIssueTrackNotFoundSuggestion => + 'The track may not be available in lossless quality'; + + @override + String get clickableLookingUpArtist => 'Looking up artist...'; + + @override + String clickableInformationUnavailable(String type) { + return '$type information not available'; + } + + @override + String get extensionDetailsTags => 'Tags'; + + @override + String get extensionDetailsInformation => 'Information'; + + @override + String get extensionUtilityFunctions => 'Utility Functions'; + + @override + String get actionDismiss => 'Dismiss'; + + @override + String get setupChangeFolderTooltip => 'Change folder'; + + @override + String a11yOpenTrackByArtist(String trackName, String artistName) { + return 'Open track $trackName by $artistName'; + } + + @override + String a11yOpenItem(String itemType, String name) { + return 'Open $itemType $name'; + } + + @override + String a11yOpenItemCount(String title, int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'items', + one: 'item', + ); + return 'Open $title, $count $_temp0'; + } + + @override + String a11yOpenAlbumByArtistTrackCount( + String albumName, + String artistName, + int trackCount, + ) { + return 'Open album $albumName by $artistName, $trackCount tracks'; + } + + @override + String a11yTrackByArtist(String trackName, String artistName) { + return '$trackName by $artistName'; + } + + @override + String a11ySelectAlbum(String albumName) { + return 'Select album $albumName'; + } + + @override + String a11yOpenAlbum(String albumName) { + return 'Open album $albumName'; + } + + @override + String get optionsDefaultSearchTabAlbums => 'Albums'; + + @override + String get optionsDefaultSearchTabTracks => 'Tracks'; + + @override + String get settingsFiles => 'Files & Folders'; + + @override + String get settingsFilesSubtitle => + 'Download location, filename, folder structure'; + + @override + String get settingsMetadata => 'Metadata'; + + @override + String get settingsMetadataSubtitle => + 'Cover art, tags, ReplayGain, providers'; + + @override + String get settingsLyrics => 'Lyrics'; + + @override + String get settingsLyricsSubtitle => + 'Embed, mode, providers, language options'; + + @override + String get settingsApp => 'App'; + + @override + String get settingsAppSubtitle => 'Updates, data, extension repo, debug'; + + @override + String get sectionMetadataProviders => 'Providers'; + + @override + String get sectionDuplicates => 'Duplicates'; + + @override + String get sectionLyricsProviderOptions => 'Provider Options'; + + @override + String get metadataProvidersTitle => 'Metadata Provider Priority'; + + @override + String get metadataProvidersSubtitle => + 'Drag to set search and metadata source order'; + + @override + String get downloadDeduplication => 'Skip Duplicate Downloads'; + + @override + String get downloadDeduplicationEnabled => + 'Already-downloaded tracks will be skipped'; + + @override + String get downloadDeduplicationDisabled => + 'All tracks will be downloaded regardless of history'; + + @override + String get downloadFallbackExtensions => 'Fallback Extensions'; + + @override + String get downloadFallbackExtensionsSubtitle => + 'Choose which extensions can be used as fallback'; + + @override + String get editMetadataFieldDateHint => 'YYYY-MM-DD or YYYY'; + + @override + String get editMetadataFieldTrackTotal => 'Track Total'; + + @override + String get editMetadataFieldDiscTotal => 'Disc Total'; + + @override + String get editMetadataFieldComposer => 'Composer'; + + @override + String get editMetadataFieldComment => 'Comment'; + + @override + String get editMetadataAdvanced => 'Advanced'; + + @override + String get libraryFilterMetadataMissingTrackNumber => 'Missing track number'; + + @override + String get libraryFilterMetadataMissingDiscNumber => 'Missing disc number'; + + @override + String get libraryFilterMetadataMissingArtist => 'Missing artist'; + + @override + String get libraryFilterMetadataIncorrectIsrcFormat => + 'Incorrect ISRC format'; + + @override + String get libraryFilterMetadataMissingLabel => 'Missing label'; + + @override + String collectionDeletePlaylistsMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Delete $count $_temp0?'; + } + + @override + String collectionPlaylistsDeleted(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return '$count $_temp0 deleted'; + } + + @override + String collectionAddedTracksToPlaylist(int count, String playlistName) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Added $count $_temp0 to $playlistName'; + } + + @override + String collectionAddedTracksToPlaylistWithExisting( + int count, + String playlistName, + int alreadyCount, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Added $count $_temp0 to $playlistName ($alreadyCount already in playlist)'; + } + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'items', + one: 'item', + ); + return '$count $_temp0'; + } + + @override + String trackReEnrichSuccessWithFailures( + int successCount, + int total, + int failedCount, + ) { + return 'Metadata re-enriched successfully ($successCount/$total) - Failed: $failedCount'; + } + + @override + String selectionDeleteTracksCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Delete $count $_temp0'; + } + + @override + String queueDownloadSpeedStatus(String speed) { + return 'Downloading - $speed MB/s'; + } + + @override + String get queueDownloadStarting => 'Starting...'; + + @override + String get a11ySelectTrack => 'Select track'; + + @override + String get a11yDeselectTrack => 'Deselect track'; + + @override + String a11yPlayTrackByArtist(String trackName, String artistName) { + return 'Play $trackName by $artistName'; + } + + @override + String storeExtensionsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'extensions', + one: 'extension', + ); + return '$count $_temp0'; + } + + @override + String storeRequiresVersion(String version) { + return 'Requires v$version+'; + } + + @override + String get actionGo => 'Go'; + + @override + String get logIssueSummary => 'Issue Summary'; + + @override + String logTotalErrors(int count) { + return 'Total errors: $count'; + } + + @override + String logAffectedDomains(String domains) { + return 'Affected: $domains'; + } + + @override + String get libraryScanCancelled => 'Scan cancelled'; + + @override + String get libraryScanCancelledSubtitle => + 'You can retry the scan when ready.'; + + @override + String libraryDownloadsHistoryExcluded(int count) { + return '$count from Downloads history (excluded from list)'; + } + + @override + String get downloadNativeWorker => 'Native download worker'; + + @override + String get downloadNativeWorkerSubtitle => + 'Beta Android service worker for extension downloads'; + + @override + String get badgeBeta => 'BETA'; + + @override + String get extensionServiceStatus => 'Service Status'; + + @override + String get extensionServiceHealth => 'Service health'; + + @override + String extensionHealthChecksConfigured(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'checks', + one: 'check', + ); + return '$count $_temp0 configured'; + } + + @override + String get extensionOauthConnectHint => + 'Tap Connect to Spotify to fill this field.'; + + @override + String extensionLastChecked(String time) { + return 'Last checked $time'; + } + + @override + String get extensionRefreshStatus => 'Refresh status'; + + @override + String get extensionCustomUrlHandling => 'Custom URL Handling'; + + @override + String get extensionCustomUrlHandlingSubtitle => + 'This extension can handle links from these sites'; + + @override + String get extensionCustomUrlHandlingShareHint => + 'Share links from these sites to SpotiFLAC Mobile and this extension will handle them.'; + + @override + String extensionSettingsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'settings', + one: 'setting', + ); + return '$count $_temp0'; + } + + @override + String get extensionHealthOnline => 'Online'; + + @override + String get extensionHealthDegraded => 'Degraded'; + + @override + String get extensionHealthOffline => 'Offline'; + + @override + String get extensionHealthNotConfigured => 'Not configured'; + + @override + String get extensionHealthUnknown => 'Unknown'; + + @override + String get extensionHealthRequired => 'required'; + + @override + String get extensionSettingNotSet => 'Not set'; + + @override + String get extensionActionFailed => 'Action failed'; + + @override + String get extensionEnterValue => 'Enter value'; + + @override + String get extensionHealthServiceOnline => 'Service online'; + + @override + String get extensionHealthServiceDegraded => 'Service degraded'; + + @override + String get extensionHealthServiceOffline => 'Service offline'; + + @override + String get extensionHealthServiceUnknown => 'Service status unknown'; + + @override + String get audioAnalysisStereo => 'Stereo'; + + @override + String get audioAnalysisMono => 'Mono'; + + @override + String trackOpenInService(String serviceName) { + return 'Open in $serviceName'; + } + + @override + String get trackLyricsEmbeddedSource => 'Embedded'; + + @override + String get unknownAlbum => 'Unknown Album'; + + @override + String get unknownArtist => 'Unknown Artist'; + + @override + String get permissionAudio => 'Audio'; + + @override + String get permissionStorage => 'Storage'; + + @override + String get permissionNotification => 'Notification'; + + @override + String get errorInvalidFolderSelected => 'Invalid folder selected'; + + @override + String get errorCouldNotKeepFolderAccess => + 'Could not keep access to the selected folder'; + + @override + String get storeAnyVersion => 'Any'; + + @override + String get storeCategoryMetadata => 'Metadata'; + + @override + String get storeCategoryDownload => 'Download'; + + @override + String get storeCategoryUtility => 'Utility'; + + @override + String get storeCategoryLyrics => 'Lyrics'; + + @override + String get storeCategoryIntegration => 'Integration'; + + @override + String get artistReleases => 'Releases'; + + @override + String get editMetadataSelectNone => 'None'; + + @override + String queueRetryAllFailed(int count) { + return 'Retry $count failed'; + } + + @override + String get settingsSaveDownloadHistory => 'Save download history'; + + @override + String get settingsSaveDownloadHistorySubtitle => + 'Keep completed downloads in history and library views'; + + @override + String get dialogDisableHistoryTitle => 'Turn off download history?'; + + @override + String get dialogDisableHistoryMessage => + 'Existing history will be cleared. Downloaded files will not be deleted.'; + + @override + String get dialogDisableAndClear => 'Turn off and clear'; + + @override + String get openInOtherServices => 'Open in Other Services'; + + @override + String get shareSheetNoExtensions => 'No other compatible services'; + + @override + String get shareSheetNotFound => 'Not found'; + + @override + String get shareSheetCopyLink => 'Copy Link'; + + @override + String shareSheetLinkCopied(Object service) { + return '$service link copied'; + } +} diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 22236b5a..a10431f1 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -30,10 +30,11 @@ class AppLocalizationsDe extends AppLocalizations { String get homeSubtitle => 'Unterstützte URL einfügen oder nach Namen suchen'; @override - String get homeEmptyTitle => 'No search providers yet'; + String get homeEmptyTitle => 'Noch keine Suchanbieter'; @override - String get homeEmptySubtitle => 'Install an extension to continue.'; + String get homeEmptySubtitle => + 'Installiere eine Erweiterung um fortzufahren.'; @override String get homeSupports => @@ -83,11 +84,11 @@ class AppLocalizationsDe extends AppLocalizations { String get downloadFilenameFormat => 'Dateinamenformat'; @override - String get downloadSingleFilenameFormat => 'Single Filename Format'; + String get downloadSingleFilenameFormat => 'Einzelnes Dateinamenformat'; @override String get downloadSingleFilenameFormatDescription => - 'Filename pattern for singles and EPs. Uses the same tags as the album format.'; + 'Dateinamenmuster für Singles und EPs. Verwendet die gleichen Tags wie das Albumformat.'; @override String get downloadFolderOrganization => 'Ordnerstruktur'; @@ -128,7 +129,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get optionsPrimaryProviderSubtitle => - 'Dienst für die Suche nach Titelnamen.'; + 'Dienst zur Suche nach Titel oder Albumnamen'; @override String optionsUsingExtension(String extensionName) { @@ -136,11 +137,11 @@ class AppLocalizationsDe extends AppLocalizations { } @override - String get optionsDefaultSearchTab => 'Default Search Tab'; + String get optionsDefaultSearchTab => 'Standard Such-Tab'; @override String get optionsDefaultSearchTabSubtitle => - 'Choose which tab opens first for new search results.'; + 'Wähle aus, welcher Tab zuerst für neue Suchergebnisse geöffnet wird.'; @override String get optionsSwitchBack => @@ -169,7 +170,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get optionsEmbedLyricsSubtitle => - 'Synchronisierte Songtexte neben heruntergeladenen Titeln speichern'; + 'Speichere synchronisierte Liedtexte zusammen mit heruntergeladenen Titeln'; @override String get optionsMaxQualityCover => 'Maximale Cover-Qualität'; @@ -183,11 +184,11 @@ class AppLocalizationsDe extends AppLocalizations { @override String get optionsReplayGainSubtitleOn => - 'Scan loudness and embed ReplayGain tags (EBU R128)'; + 'Scanne Lautstärke und füge ReplayGain-Tags ein (EBU R128)'; @override String get optionsReplayGainSubtitleOff => - 'Disabled: no loudness normalization tags'; + 'Deaktiviert: keine Lautstärke-Normalisierungs-Tags'; @override String get optionsArtistTagMode => 'Künstler Tag-Modus'; @@ -201,14 +202,14 @@ class AppLocalizationsDe extends AppLocalizations { @override String get optionsArtistTagModeJoinedSubtitle => - 'Einen Künstler-Wert wie \"Künstler A, Künstler B\" für maximale Player-Kompatibilität schreiben.'; + 'Einen Künstler wert wie \"Artist A, Artist B\" für maximale Spieler-Kompatibilität schreiben.'; @override String get optionsArtistTagModeSplitVorbis => 'Tags für FLAC/Opus aufteilen'; @override String get optionsArtistTagModeSplitVorbisSubtitle => - 'Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.'; + 'Schreibe einen Künstler Tag pro Künstler für FLAC und Opus; MP3 und M4A bleiben beigetreten.'; @override String get optionsConcurrentDownloads => 'Parallele Downloads'; @@ -264,7 +265,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get optionsDetailedLoggingOn => - 'Detaillierte Protokolle werden aufgezeichnet'; + 'Detaillierte Logs werden aufgezeichnet'; @override String get optionsDetailedLoggingOff => 'Für Fehlerberichte aktivieren'; @@ -405,7 +406,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get aboutAppDescription => - 'Search music metadata, manage extensions, and organize your library.'; + 'Musik-Metadaten durchsuchen, Erweiterungen verwalten und deine Bibliothek organisieren.'; @override String get artistAlbums => 'Alben'; @@ -556,14 +557,14 @@ class AppLocalizationsDe extends AppLocalizations { 'Bitte aktiviere \"Zugriff auf alle Dateien erlauben\" auf dem nächsten Bildschirm.'; @override - String get setupLanguageTitle => 'Choose Language'; + String get setupLanguageTitle => 'Sprache auswählen'; @override String get setupLanguageDescription => - 'Select your preferred language for the app. You can change this later in Settings.'; + 'Wählen deine bevorzugte Sprache für die App. Dies kann später in den Einstellungen geändert werden.'; @override - String get setupLanguageSystemDefault => 'System Default'; + String get setupLanguageSystemDefault => 'Systemstandard'; @override String get dialogCancel => 'Abbrechen'; @@ -691,8 +692,8 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'Titel gelöscht', - one: 'Titel gelöscht', + other: 'Titel', + one: 'Titel', ); return '$count $_temp0'; } @@ -955,15 +956,15 @@ class AppLocalizationsDe extends AppLocalizations { 'Wenn kein Titel bei dem ersten Anbieter nicht verfügbar ist, wird die App automatisch den nächsten versuchen.'; @override - String get providerPriorityFallbackExtensionsTitle => 'Extension Fallback'; + String get providerPriorityFallbackExtensionsTitle => 'Erweiterungs-Fallback'; @override String get providerPriorityFallbackExtensionsDescription => - 'Choose which installed download extensions can be used during automatic fallback.'; + 'Wähle aus, welche installierten Download-Erweiterungen beim automatischen Fallback verwendet werden sollen.'; @override String get providerPriorityFallbackExtensionsHint => - 'Only enabled extensions with download-provider capability are listed here.'; + 'Hier werden nur aktivierte Erweiterungen mit Download-Provider-Funktion aufgelistet.'; @override String get providerBuiltIn => 'Integriert'; @@ -989,13 +990,13 @@ class AppLocalizationsDe extends AppLocalizations { String get metadataMayRateLimit => 'Hat vielleicht Limitierungen'; @override - String get logTitle => 'Protokolle'; + String get logTitle => 'Logs'; @override - String get logCopied => 'Protokolle in Zwischenablage kopiert'; + String get logCopied => 'Logs in Zwischenablage kopiert'; @override - String get logSearchHint => 'Protokolle durchsuchen...'; + String get logSearchHint => 'Logs durchsuchen ...'; @override String get logFilterLevel => 'Stufe'; @@ -1004,27 +1005,27 @@ class AppLocalizationsDe extends AppLocalizations { String get logFilterSection => 'Filter'; @override - String get logShareLogs => 'Protokolle teilen'; + String get logShareLogs => 'Logs teilen'; @override - String get logClearLogs => 'Protokolle löschen'; + String get logClearLogs => 'Logs löschen'; @override - String get logClearLogsTitle => 'Protokolle leeren'; + String get logClearLogsTitle => 'Logs leeren'; @override String get logClearLogsMessage => - 'Bist du sicher, dass du alle Protokolle löschen möchtest?'; + 'Bist du dir sicher, dass Sie alle Logs löschen möchtest?'; @override - String get logFilterBySeverity => 'Protokolle nach Schweregrad filtern'; + String get logFilterBySeverity => 'Logs nach Schweregrad filtern'; @override - String get logNoLogsYet => 'Keine Protokolle bisher'; + String get logNoLogsYet => 'Noch keine Logs'; @override String get logNoLogsYetSubtitle => - 'Protokolle werden hier angezeigt, während du die App benutzt'; + 'Logs werden hier angezeigt, während du die App benutzt'; @override String logEntriesFiltered(int count) { @@ -1137,10 +1138,11 @@ class AppLocalizationsDe extends AppLocalizations { String get settingsAppearanceSubtitle => 'Design, Farben, Anzeige'; @override - String get settingsDownloadSubtitle => 'Dienst, Qualität, Dateinamen-Format'; + String get settingsDownloadSubtitle => 'Anbieter, Qualität, Rückfall'; @override - String get settingsOptionsSubtitle => 'Fallback, Lyrics, Covers, Updates'; + String get settingsOptionsSubtitle => + 'Fallback, Metadaten, Lyrics, Cover-Art'; @override String get settingsExtensionsSubtitle => 'Download-Anbieter verwalten'; @@ -1242,7 +1244,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String trackLyricsSource(String source) { - return 'Source: $source'; + return 'Quelle: $source'; } @override @@ -1250,10 +1252,10 @@ class AppLocalizationsDe extends AppLocalizations { 'Lyrics sind für diesen Titel nicht verfügbar'; @override - String get trackLyricsNotInFile => 'No lyrics found in this file'; + String get trackLyricsNotInFile => 'Keine Lyrics in dieser Datei gefunden'; @override - String get trackFetchOnlineLyrics => 'Fetch from Online'; + String get trackFetchOnlineLyrics => 'Online abrufen'; @override String get trackLyricsTimeout => @@ -1356,13 +1358,13 @@ class AppLocalizationsDe extends AppLocalizations { String get storeNewRepoUrlLabel => 'Neue Repository-URL'; @override - String get storeLoadError => 'Failed to load repository'; + String get storeLoadError => 'Fehler beim Laden der Repository'; @override - String get storeEmptyNoExtensions => 'No extensions available'; + String get storeEmptyNoExtensions => 'Keine Erweiterung verfügbar'; @override - String get storeEmptyNoResults => 'No extensions found'; + String get storeEmptyNoResults => 'Keine Erweiterungen gefunden'; @override String get extensionDefaultProvider => 'Standard (Deezer)'; @@ -1463,12 +1465,12 @@ class AppLocalizationsDe extends AppLocalizations { @override String extensionsInstalledCount(int count) { - return '$count extensions installed successfully'; + return '$count Erweiterungen erfolgreich installiert'; } @override String extensionsInstallPartialSuccess(int installed, int attempted) { - return 'Installed $installed of $attempted extensions'; + return '$installed von $attempted Erweiterungen installiert'; } @override @@ -1479,11 +1481,11 @@ class AppLocalizationsDe extends AppLocalizations { 'Download-Service-Reihenfolge festlegen'; @override - String get extensionsFallbackTitle => 'Fallback Extensions'; + String get extensionsFallbackTitle => 'Fallback-Erweiterungen'; @override String get extensionsFallbackSubtitle => - 'Choose which installed download extensions can be used as fallback'; + 'Wähle welche installierten Download-Erweiterungen als Fallback verwendet werden sollen'; @override String get extensionsNoDownloadProvider => @@ -1521,7 +1523,7 @@ class AppLocalizationsDe extends AppLocalizations { String get qualityFlacLossless => 'FLAC Verlustfrei'; @override - String get qualityFlacLosslessSubtitle => '16-bit / 44.1kHz'; + String get qualityFlacLosslessSubtitle => '16-bit / 44,1kHz'; @override String get qualityHiResFlac => 'Hi-Res FLAC'; @@ -1542,7 +1544,7 @@ class AppLocalizationsDe extends AppLocalizations { String get downloadLossyFormat => 'Verlustbehaftetes Format'; @override - String get downloadLossy320Format => 'Lossy 320kbps Format'; + String get downloadLossy320Format => 'Verlustbehaftetes 320kbps-Format'; @override String get downloadLossy320FormatDesc => @@ -1560,7 +1562,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get downloadLossyAacSubtitle => - 'Best mobile compatibility, M4A container'; + 'Beste mobile Kompatibilität, M4A Container'; @override String get downloadLossyOpus256 => 'Opus 256kbps'; @@ -1678,11 +1680,11 @@ class AppLocalizationsDe extends AppLocalizations { 'Künstler/Album/ und Künstler/Singles/'; @override - String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + String get albumFolderArtistAlbumFlat => 'Künstler / Album (Singles flach)'; @override String get albumFolderArtistAlbumFlatSubtitle => - 'Artist/Album/ and Artist/song.flac'; + 'Künstler/Album/ Und Künstler/Lied.flac'; @override String get downloadedAlbumDeleteSelected => 'Ausgewählte löschen'; @@ -1886,7 +1888,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get libraryAutoScanSubtitle => - 'Automatically scan your library for new files'; + 'Scanne die Bibliothek automatisch nach neuen Dateien'; @override String get libraryAutoScanOff => 'Aus'; @@ -2169,7 +2171,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get tutorialExtensionsTip1 => - 'Browse the Repo tab to discover useful extensions'; + 'Im Repo Tab findest du nützliche Erweiterungen'; @override String get tutorialExtensionsTip2 => @@ -2370,28 +2372,28 @@ class AppLocalizationsDe extends AppLocalizations { 'Metadaten online suchen und in Datei einbinden'; @override - String get trackReEnrichFieldsTitle => 'Fields to update'; + String get trackReEnrichFieldsTitle => 'Felder zum Aktualisieren'; @override - String get trackReEnrichFieldCover => 'Cover Art'; + String get trackReEnrichFieldCover => 'Cover-Art'; @override String get trackReEnrichFieldLyrics => 'Lyrics'; @override - String get trackReEnrichFieldBasicTags => 'Album, Album Artist'; + String get trackReEnrichFieldBasicTags => 'Album, Album-Künstler'; @override - String get trackReEnrichFieldTrackInfo => 'Track & Disc Number'; + String get trackReEnrichFieldTrackInfo => 'Track & Disc Nummer'; @override - String get trackReEnrichFieldReleaseInfo => 'Date & ISRC'; + String get trackReEnrichFieldReleaseInfo => 'Datum & ISRC'; @override String get trackReEnrichFieldExtra => 'Genre, Label, Copyright'; @override - String get trackReEnrichSelectAll => 'Select All'; + String get trackReEnrichSelectAll => 'Alles Auswählen'; @override String get trackEditMetadata => 'Metadaten bearbeiten'; @@ -2432,16 +2434,16 @@ class AppLocalizationsDe extends AppLocalizations { @override String queueFlacFindingProgress(int current, int total) { - return 'Finding FLAC matches... ($current/$total)'; + return 'Suche nach FLAC-Übereinstimmungen... ($current/$total)'; } @override String get queueFlacNoReliableMatches => - 'No reliable online matches found for the selection'; + 'Keine zuverlässigen Online-Übereinstimmungen für die Auswahl gefunden'; @override String queueFlacQueuedWithSkipped(int addedCount, int skippedCount) { - return 'Added $addedCount tracks to queue, skipped $skippedCount'; + return '$addedCount Titel zur Warteschlange hinzugefügt, $skippedCount übersprungen'; } @override @@ -2454,7 +2456,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get trackConvertFormatSubtitle => - 'Convert to MP3, Opus, ALAC, or FLAC'; + 'Zu AAC/M4A, MP3, Opus, ALAC oder FLAC konvertieren'; @override String get trackConvertTitle => 'Audio konvertieren'; @@ -2487,7 +2489,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get trackConvertLosslessHint => - 'Lossless conversion — no quality loss'; + 'Verlustfreie Konvertierung kein Qualitätsverlust'; @override String get trackConvertConverting => 'Konvertiere Audio...'; @@ -2562,7 +2564,7 @@ class AppLocalizationsDe extends AppLocalizations { String get collectionLoved => 'Lieblingssongs'; @override - String get collectionFavoriteArtists => 'Favorite Artists'; + String get collectionFavoriteArtists => 'Lieblingskünstler'; @override String get collectionPlaylists => 'Playlists'; @@ -2599,8 +2601,8 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count artists', - one: '1 artist', + other: '$count Künstler', + one: '1 Künstler', ); return '$_temp0'; } @@ -2656,11 +2658,12 @@ class AppLocalizationsDe extends AppLocalizations { 'Tippe auf das Herz, um deine Favoriten zu behalten'; @override - String get collectionFavoriteArtistsEmptyTitle => 'No favorite artists yet'; + String get collectionFavoriteArtistsEmptyTitle => + 'Noch keine Lieblingskünstler'; @override String get collectionFavoriteArtistsEmptySubtitle => - 'Tap the heart on an artist page to keep them here'; + 'Tippe auf das Herz auf einer Künstlerseite, um sie hier zu sehen'; @override String get collectionPlaylistEmptyTitle => 'Die Playlist ist leer'; @@ -2702,12 +2705,12 @@ class AppLocalizationsDe extends AppLocalizations { @override String collectionAddedToFavoriteArtists(String artistName) { - return '\"$artistName\" added to Favorite Artists'; + return '\"$artistName\" zu Lieblingskünstlern hinzugefügt'; } @override String collectionRemovedFromFavoriteArtists(String artistName) { - return '\"$artistName\" removed from Favorite Artists'; + return '\"$artistName\" entfernt aus Lieblingskünstlern'; } @override @@ -2723,10 +2726,10 @@ class AppLocalizationsDe extends AppLocalizations { String get trackOptionRemoveFromWishlist => 'Von der Wunschliste entfernen'; @override - String get artistOptionAddToFavorites => 'Add to Favorite Artists'; + String get artistOptionAddToFavorites => 'Zu Favoriten hinzufügen'; @override - String get artistOptionRemoveFromFavorites => 'Remove from Favorite Artists'; + String get artistOptionRemoveFromFavorites => 'Aus Favoriten entfernen'; @override String get collectionPlaylistChangeCover => 'Coverbild ändern'; @@ -2809,14 +2812,14 @@ class AppLocalizationsDe extends AppLocalizations { @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Interpret-Ordner verwenden Album-Interpret, sofern vorhanden'; + 'Ordner benannt nach dem Tag des Albumkünstlers'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => - 'Künstler-Ordner nur für Titel-Künstler'; + 'Ordner benannt nach dem Tag des Künstlers'; @override - String get lyricsProvidersTitle => 'Lyrics-Anbieter'; + String get lyricsProvidersTitle => 'Priorität des Lyrics-Anbieters'; @override String get lyricsProvidersDescription => @@ -2838,17 +2841,19 @@ class AppLocalizationsDe extends AppLocalizations { @override String get lyricsProvidersAtLeastOne => - 'At least one provider must remain enabled'; + 'Mindestens ein Anbieter muss aktiviert bleiben'; @override - String get lyricsProvidersSaved => 'Lyrics provider priority saved'; + String get lyricsProvidersSaved => + 'Priorität des Lyrics-Anbieters gespeichert'; @override String get lyricsProvidersDiscardContent => - 'You have unsaved changes that will be lost.'; + 'Ungespeicherte Änderungen die verloren gehen.'; @override - String get lyricsProviderLrclibDesc => 'Open-source synced lyrics database'; + String get lyricsProviderLrclibDesc => + 'Open-Source-Synchronisierte Lyrics-Datenbank'; @override String get lyricsProviderNeteaseDesc => @@ -2881,14 +2886,14 @@ class AppLocalizationsDe extends AppLocalizations { 'Bitte wähle dein Download-Ordner erneut aus, um zum neuen System zu wechseln.'; @override - String get safMigrationSuccess => 'Download folder updated to SAF mode'; + String get safMigrationSuccess => + 'Download-Ordner auf SAF-Modus aktualisiert'; @override - String get settingsDonate => 'Unterstützen'; + String get settingsDonate => 'Unterstütze die Entwicklung'; @override - String get settingsDonateSubtitle => - 'Unterstütze die SpotiFLAC-Mobile Entwickler'; + String get settingsDonateSubtitle => 'Kaufe dem Entwickler einen Kaffee'; @override String get tooltipLoveAll => 'Alle lieben'; @@ -2903,7 +2908,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String snackbarAddedTracksToLoved(int count) { - return 'Added $count tracks to Loved'; + return '$count titel zu geliebt hinzugefügt'; } @override @@ -2911,29 +2916,31 @@ class AppLocalizationsDe extends AppLocalizations { @override String dialogDownloadAllMessage(int count) { - return 'Download $count tracks?'; + return '$count titel herunterladen?'; } @override - String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; + String get homeSkipAlreadyDownloaded => + 'Bereits heruntergeladene Titel überspringen'; @override String get homeGoToAlbum => 'Zum Album gehen'; @override - String get homeAlbumInfoUnavailable => 'Album info not available'; + String get homeAlbumInfoUnavailable => 'Albuminfo nicht verfügbar'; @override - String get snackbarLoadingCueSheet => 'Loading CUE sheet...'; + String get snackbarLoadingCueSheet => 'CAE-Sheet wird geladen...'; @override - String get snackbarMetadataSaved => 'Metadata saved successfully'; + String get snackbarMetadataSaved => 'Metadaten erfolgreich gespeichert'; @override - String get snackbarFailedToEmbedLyrics => 'Failed to embed lyrics'; + String get snackbarFailedToEmbedLyrics => 'Fehler beim Einbinden der Lyrics'; @override - String get snackbarFailedToWriteStorage => 'Failed to write back to storage'; + String get snackbarFailedToWriteStorage => + 'Fehler beim Zurückschreiben in den Speicher'; @override String snackbarError(String error) { @@ -2941,27 +2948,28 @@ class AppLocalizationsDe extends AppLocalizations { } @override - String get snackbarNoActionDefined => 'No action defined for this button'; + String get snackbarNoActionDefined => 'Keine Aktion für Taste definiert'; @override - String get noTracksFoundForAlbum => 'No tracks found for this album'; + String get noTracksFoundForAlbum => 'Keine Titel in diesem Album gefunden'; @override String get downloadLocationSubtitle => - 'Choose storage mode for downloaded files.'; + 'Wählen Sie den Speicherort für Ihre heruntergeladenen Titel'; @override - String get storageModeAppFolder => 'App folder (non-SAF)'; + String get storageModeAppFolder => 'App-Ordner (empfohlen)'; @override - String get storageModeAppFolderSubtitle => 'Use default Music/SpotiFLAC path'; + String get storageModeAppFolderSubtitle => + 'Standardmäßig in Music/SpotiFLAC speichern'; @override - String get storageModeSaf => 'SAF-Ordner'; + String get storageModeSaf => 'Benutzerdefinierter Ordner (SAF)'; @override String get storageModeSafSubtitle => - 'Pick folder via Android Storage Access Framework'; + 'Wähle einen beliebigen Ordner, inklusive SD-Karte'; @override String downloadFilenameDescription( @@ -2973,36 +2981,37 @@ class AppLocalizationsDe extends AppLocalizations { Object track, Object year, ) { - return 'Customize how your files are named.'; + return 'Verwende $artist, $title, $album, $track, $year, $date, $disc als Platzhalter.'; } @override String get downloadFilenameInsertTag => 'Tippe, um Tag einzufügen:'; @override - String get downloadSeparateSinglesEnabled => 'Albums/ and Singles/ folders'; + String get downloadSeparateSinglesEnabled => + 'Singles und EPs werden in einem separaten Ordner gespeichert'; @override - String get downloadSeparateSinglesDisabled => 'All files in same structure'; + String get downloadSeparateSinglesDisabled => + 'Singles und Alben im selben Ordner gespeichert'; @override - String get downloadArtistNameFilters => 'Artist Name Filters'; + String get downloadArtistNameFilters => 'Künstlernamen-Filter'; @override - String get downloadCreatePlaylistSourceFolder => - 'Create playlist source folder'; + String get downloadCreatePlaylistSourceFolder => 'Playlist-Quellordner'; @override String get downloadCreatePlaylistSourceFolderEnabled => - 'Playlist downloads use Playlist/ plus your normal folder structure.'; + 'Für jede Playlist wird ein Unterordner erstellt'; @override String get downloadCreatePlaylistSourceFolderDisabled => - 'Playlist downloads use the normal folder structure only.'; + 'Alle Titel direkt im Download-Ordner gespeichert'; @override String get downloadCreatePlaylistSourceFolderRedundant => - 'By Playlist already places downloads inside a playlist folder.'; + 'Wird durch die Ordnerorganisationseinstellung verarbeitet'; @override String get downloadSongLinkRegion => 'SongLink-Region'; @@ -3012,116 +3021,116 @@ class AppLocalizationsDe extends AppLocalizations { @override String get downloadNetworkCompatibilityModeEnabled => - 'Enabled: try HTTP + accept invalid TLS certificates (unsafe)'; + 'Verwendung der Legacy-TLS-Einstellungen für ältere Netzwerke'; @override String get downloadNetworkCompatibilityModeDisabled => - 'Off: strict HTTPS certificate validation (recommended)'; + 'Standard-Netzwerkeinstellungen verwenden'; @override String get downloadSelectServiceToEnable => - 'Select a built-in service to enable'; + 'Wähle Tidal oder Qobuz, um diese Option zu aktivieren'; @override String get downloadSelectTidalQobuz => - 'Select Tidal or Qobuz above to configure quality'; + 'Wähle Tidal oder Qobuz, um die Audioqualität auszuwählen'; @override String get downloadEmbedLyricsDisabled => - 'Disabled while Embed Metadata is turned off'; + 'Metadaten-Einbettung zuerst aktivieren'; @override String get downloadNeteaseIncludeTranslation => - 'Netease: Include Translation'; + 'Netease: Übersetzung einschließen'; @override String get downloadNeteaseIncludeTranslationEnabled => - 'Append translated lyrics when available'; + 'Chinesische Übersetzungszeilen enthalten'; @override String get downloadNeteaseIncludeTranslationDisabled => - 'Use original lyrics only'; + 'Original Lyrics verwenden'; @override String get downloadNeteaseIncludeRomanization => - 'Netease: Include Romanization'; + 'Netease: Romanisierung einschließen'; @override String get downloadNeteaseIncludeRomanizationEnabled => - 'Append romanized lyrics when available'; + 'Romanisierungszeilen enthalten'; @override - String get downloadNeteaseIncludeRomanizationDisabled => 'Deaktiviert'; + String get downloadNeteaseIncludeRomanizationDisabled => + 'Keine Romanisierung'; @override - String get downloadAppleQqMultiPerson => 'Apple/QQ Multi-Person Word-by-Word'; + String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Personen-Lyrics'; @override String get downloadAppleQqMultiPersonEnabled => - 'Enable v1/v2 speaker and [bg:] tags'; + 'Sängerlabel für Duette und Gruppentitel enthalten'; @override String get downloadAppleQqMultiPersonDisabled => - 'Simplified word-by-word formatting'; + 'Standardlyrics ohne Lautsprecher-Labels'; @override String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; @override - String get downloadAppleElrcWordSyncEnabled => - 'Raw word-by-word timestamps preserved'; + String get downloadAppleElrcWordSyncEnabled => 'Rohe Zeitstempel erhalten'; @override String get downloadAppleElrcWordSyncDisabled => - 'Safer line-by-line Apple Music lyrics'; + 'Sichere Line-by-line Apple Music Texte'; @override - String get downloadMusixmatchLanguage => 'Musixmatch Language'; + String get downloadMusixmatchLanguage => 'Musixmatch Sprache'; @override - String get downloadMusixmatchLanguageAuto => 'Auto (original)'; + String get downloadMusixmatchLanguageAuto => 'Auto (Originalsprache)'; @override - String get downloadFilterContributing => - 'Filter contributing artists in Album Artist'; + String get downloadFilterContributing => 'Mitwirkende Künstler filtern'; @override String get downloadFilterContributingEnabled => - 'Album Artist metadata uses primary artist only'; + 'Mitwirkende Künstler vom Albumname des Künstlers entfernt'; @override String get downloadFilterContributingDisabled => - 'Keep full Album Artist metadata value'; + 'Volle Album Künstler String verwendet'; @override - String get downloadProvidersNoneEnabled => 'Keine aktiviert'; + String get downloadProvidersNoneEnabled => 'Keine Anbieter aktiviert'; @override String get downloadMusixmatchLanguageCode => 'Sprach-Code'; @override - String get downloadMusixmatchLanguageHint => 'auto / en / es / ja'; + String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja'; @override String get downloadMusixmatchLanguageDesc => - 'Set preferred language code (example: en, es, ja). Leave empty for auto.'; + 'Gib einen BCP-47 Sprachcode ein (z.B. en, de, ja), um übersetzte Lyrics von Musixmatch anzufordern.'; @override String get downloadMusixmatchAuto => 'Auto'; @override - String get downloadNetworkAnySubtitle => 'WLAN + Mobile Daten'; + String get downloadNetworkAnySubtitle => 'WLAN oder mobile Daten verwenden'; @override String get downloadNetworkWifiOnlySubtitle => - 'Pause downloads on mobile data'; + 'Downloads bei mobilen Daten pausieren'; @override String get downloadSongLinkRegionDesc => - 'Used as userCountry for SongLink API lookup.'; + 'Region, die beim Auflösen von Titellinks über SongLink verwendet wird. Wähle das Land, in dem der Streaming-Dienste verfügbar sind.'; @override - String get snackbarUnsupportedAudioFormat => 'Unsupported audio format'; + String get snackbarUnsupportedAudioFormat => + 'Nicht unterstütztes Audioformat'; @override String get cacheRefresh => 'Aktualisieren'; @@ -3148,61 +3157,61 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'playlists', - one: 'playlist', + other: 'Playlists', + one: 'Playlist', ); - return 'Download $count $_temp0'; + return 'Lade $count $_temp0 herunter'; } @override - String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + String get bulkDownloadSelectPlaylists => 'Playlist zum Herunterladen wählen'; @override String get snackbarSelectedPlaylistsEmpty => - 'Selected playlists have no tracks'; + 'Ausgewählte Playlisten haben keine Titel'; @override String playlistsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count playlists', - one: '1 playlist', + other: '$count Playlists', + one: '1 Playlist', ); return '$_temp0'; } @override - String get editMetadataAutoFill => 'Auto-fill from online'; + String get editMetadataAutoFill => 'Aus online ausfüllen'; @override String get editMetadataAutoFillDesc => - 'Select fields to fill automatically from online metadata'; + 'Wähle Felder aus, die automatisch aus Online-Metadaten ausgefüllt werden sollen'; @override String get editMetadataAutoFillFetch => 'Abrufen & Ausfüllen'; @override - String get editMetadataAutoFillSearching => 'Searching online...'; + String get editMetadataAutoFillSearching => 'Online suchen...'; @override String get editMetadataAutoFillNoResults => - 'No matching metadata found online'; + 'Keine passenden Metadaten online gefunden'; @override String editMetadataAutoFillDone(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'fields', - one: 'field', + other: 'Felder', + one: 'Feld', ); - return 'Filled $count $_temp0 from online metadata'; + return '$count $_temp0 aus Online-Metadaten gefüllt'; } @override String get editMetadataAutoFillNoneSelected => - 'Select at least one field to auto-fill'; + 'Wähle mindestens ein Feld zum automatischen Ausfüllen aus'; @override String get editMetadataFieldTitle => 'Titel'; @@ -3248,7 +3257,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String queueDownloadingCount(int count) { - return 'Downloading ($count)'; + return '$count werden heruntergeladen'; } @override @@ -3262,8 +3271,8 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count tracks', - one: '1 track', + other: '$count Titel', + one: '1 Titel', ); return '$_temp0'; } @@ -3273,8 +3282,8 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count albums', - one: '1 album', + other: '$count Alben', + one: '1 Album', ); return '$_temp0'; } @@ -3284,36 +3293,38 @@ class AppLocalizationsDe extends AppLocalizations { @override String get queueEmptyAlbumsSubtitle => - 'Download multiple tracks from an album to see them here'; + 'Lade mehrere Titel eines Albums herunter, um sie hier zu sehen'; @override - String get queueEmptySingles => 'No single downloads'; + String get queueEmptySingles => 'Kein Single Download'; @override String get queueEmptySinglesSubtitle => - 'Single track downloads will appear here'; + 'Einzelne Titel-Downloads werden hier angezeigt'; @override - String get queueEmptyHistory => 'No download history'; + String get queueEmptyHistory => 'Kein Download-Verlauf'; @override - String get queueEmptyHistorySubtitle => 'Downloaded tracks will appear here'; + String get queueEmptyHistorySubtitle => + 'Heruntergeladene Titel werden hier angezeigt'; @override - String get selectionAllPlaylistsSelected => 'All playlists selected'; + String get selectionAllPlaylistsSelected => 'Alle Playlists ausgewählt'; @override - String get selectionTapPlaylistsToSelect => 'Tap playlists to select'; + String get selectionTapPlaylistsToSelect => + 'Zum Auswählen auf Playlists tippen'; @override String get selectionSelectPlaylistsToDelete => 'Playlist zum Löschen wählen'; @override - String get audioAnalysisTitle => 'Audio Quality Analysis'; + String get audioAnalysisTitle => 'Audio-Qualitätsanalyse'; @override String get audioAnalysisDescription => - 'Verify lossless quality with spectrum analysis'; + 'Verlustfreie Qualität mit Spektrumanalyse überprüfen'; @override String get audioAnalysisAnalyzing => 'Audio wird analysiert...'; @@ -3328,7 +3339,7 @@ class AppLocalizationsDe extends AppLocalizations { String get audioAnalysisContainer => 'Container'; @override - String get audioAnalysisDecodedFormat => 'Decoded Format'; + String get audioAnalysisDecodedFormat => 'Dekodiertes Format'; @override String get audioAnalysisBitDepth => 'Bit-Tiefe'; @@ -3364,26 +3375,26 @@ class AppLocalizationsDe extends AppLocalizations { String get audioAnalysisClipping => 'Clipping'; @override - String get audioAnalysisNoClipping => 'No clipping'; + String get audioAnalysisNoClipping => 'Kein Clipping'; @override - String get audioAnalysisSpectralCutoff => 'Spectral Cutoff'; + String get audioAnalysisSpectralCutoff => 'Spektralschnitt'; @override - String get audioAnalysisChannelStats => 'Per-channel Stats'; + String get audioAnalysisChannelStats => 'Pro Kanal Statistik'; @override String get audioAnalysisSamples => 'Proben'; @override - String get audioAnalysisRescan => 'Re-analyze'; + String get audioAnalysisRescan => 'Neu analysieren'; @override - String get audioAnalysisRescanning => 'Re-analyzing audio...'; + String get audioAnalysisRescanning => 'Audio wird analysiert...'; @override String extensionsSearchWith(String providerName) { - return 'Search with $providerName'; + return 'Mit $providerName suchen'; } @override @@ -3391,29 +3402,30 @@ class AppLocalizationsDe extends AppLocalizations { @override String get extensionsHomeFeedDescription => - 'Choose which extension provides the home feed on the main screen'; + 'Wählen Sie die Erweiterung aus, die den Start-Feed auf dem Hauptbildschirm anzeigt'; @override String get extensionsHomeFeedAuto => 'Auto'; @override String get extensionsHomeFeedAutoSubtitle => - 'Automatically select the best available'; + 'Automatisch die besten verfügbaren auswählen'; @override - String get extensionsHomeFeedOff => 'Off'; + String get extensionsHomeFeedOff => 'Aus'; @override String get extensionsHomeFeedOffSubtitle => - 'Do not show the home feed on the main screen'; + 'Start-Feed nicht auf dem Hauptbildschirm anzeigen'; @override String extensionsHomeFeedUse(String extensionName) { - return 'Use $extensionName home feed'; + return '$extensionName Home Feed verwenden'; } @override - String get extensionsNoHomeFeedExtensions => 'No extensions with home feed'; + String get extensionsNoHomeFeedExtensions => + 'Keine Erweiterungen mit Home-Feed'; @override String get sortAlphaAsc => 'A-Z'; @@ -3426,22 +3438,23 @@ class AppLocalizationsDe extends AppLocalizations { @override String cancelDownloadContent(String trackName) { - return 'This will cancel the active download for \"$trackName\".'; + return 'Dadurch wird der aktive Download für \"$trackName\" abgebrochen.'; } @override String get cancelDownloadKeep => 'Behalten'; @override - String get metadataSaveFailedFfmpeg => 'Failed to save metadata via FFmpeg'; + String get metadataSaveFailedFfmpeg => + 'Fehler beim Speichern der Metadaten über FFmpeg'; @override String get metadataSaveFailedStorage => - 'Failed to write metadata back to storage'; + 'Metadaten konnten nicht zurück in den Speicher geschrieben werden'; @override String snackbarFolderPickerFailed(String error) { - return 'Failed to open folder picker: $error'; + return 'Fehler beim Öffnen des Ordners: $error'; } @override @@ -3457,30 +3470,32 @@ class AppLocalizationsDe extends AppLocalizations { String get notifChannelDownloadName => 'Download Fortschritt'; @override - String get notifChannelDownloadDesc => 'Shows download progress for tracks'; + String get notifChannelDownloadDesc => + 'Zeigt Download-Fortschritt für Titel an'; @override String get notifChannelLibraryScanName => 'Bibliotheksscan'; @override - String get notifChannelLibraryScanDesc => 'Shows local library scan progress'; + String get notifChannelLibraryScanDesc => + 'Zeigt den Fortschritt des lokalen Bibliotheksscans an'; @override String notifDownloadingTrack(String trackName) { - return 'Downloading $trackName'; + return '$trackName wird heruntergeladen'; } @override String notifFinalizingTrack(String trackName) { - return 'Finalizing $trackName'; + return '$trackName wird fertiggestellt'; } @override - String get notifEmbeddingMetadata => 'Embedding metadata...'; + String get notifEmbeddingMetadata => 'Bette Metadaten ein...'; @override String notifAlreadyInLibraryCount(int completed, int total) { - return 'Already in Library ($completed/$total)'; + return 'Bereits in der Bibliothek ($completed/$total)'; } @override @@ -3488,7 +3503,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String notifDownloadCompleteCount(int completed, int total) { - return 'Download Complete ($completed/$total)'; + return 'Download abgeschlossen ($completed/$total)'; } @override @@ -3496,15 +3511,21 @@ class AppLocalizationsDe extends AppLocalizations { @override String notifDownloadsFinished(int completed, int failed) { - return 'Downloads Finished ($completed done, $failed failed)'; + return 'Downloads abgeschlossen ($completed fertig, $failed fehlgeschlagen)'; } @override - String get notifAllDownloadsComplete => 'All Downloads Complete'; + String get notifAllDownloadsComplete => 'Alle Downloads abgeschlossen'; @override String notifTracksDownloadedSuccess(int count) { - return '$count tracks downloaded successfully'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count Titel erfolgreich heruntergeladen', + one: '1 Titel erfolgreich heruntergeladen', + ); + return '$_temp0'; } @override @@ -3512,34 +3533,34 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( completed, locale: localeName, - other: '$completed tracks downloaded', - one: '1 track downloaded', + other: '$completed Titel heruntergeladen', + one: '1 Titel heruntergeladen', ); String _temp1 = intl.Intl.pluralLogic( failed, locale: localeName, - other: '$failed failed', - one: '1 failed', + other: '$failed fehlgeschlagen', + one: '1 fehlgeschlagen', ); return '$_temp0, $_temp1'; } @override - String get notifDownloadsCanceledTitle => 'Downloads canceled'; + String get notifDownloadsCanceledTitle => 'Downloads abgebrochen'; @override String notifDownloadsCanceledBody(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count downloads canceled by user', - one: '1 download canceled by user', + other: '$count Downloads vom Nutzer abgebrochen', + one: '1 Download vom Nutzer abgebrochen', ); return '$_temp0'; } @override - String get notifScanningLibrary => 'Scanning local library'; + String get notifScanningLibrary => 'Scanne lokale Bibliothek'; @override String notifLibraryScanProgressWithTotal( @@ -3547,20 +3568,20 @@ class AppLocalizationsDe extends AppLocalizations { int total, int percentage, ) { - return '$scanned/$total files • $percentage%'; + return '$scanned/$total Dateien • $percentage%'; } @override String notifLibraryScanProgressNoTotal(int scanned, int percentage) { - return '$scanned files scanned • $percentage%'; + return '$scanned gescannte Dateien • $percentage%'; } @override - String get notifLibraryScanComplete => 'Library scan complete'; + String get notifLibraryScanComplete => 'Bibliotheksscan abgeschlossen'; @override String notifLibraryScanCompleteBody(int count) { - return '$count tracks indexed'; + return '$count titel indiziert'; } @override @@ -3574,17 +3595,17 @@ class AppLocalizationsDe extends AppLocalizations { } @override - String get notifLibraryScanFailed => 'Library scan failed'; + String get notifLibraryScanFailed => 'Bibliotheksscan fehlgeschlagen'; @override - String get notifLibraryScanCancelled => 'Library scan cancelled'; + String get notifLibraryScanCancelled => 'Bibliotheksscan abgebrochen'; @override - String get notifLibraryScanStopped => 'Scan stopped before completion.'; + String get notifLibraryScanStopped => 'Scan wurde vor Abschluss gestoppt.'; @override String notifDownloadingUpdate(String version) { - return 'Downloading SpotiFLAC Mobile v$version'; + return 'SpotiFLAC Mobile v$version wird heruntergeladen'; } @override @@ -3597,7 +3618,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String notifUpdateReadyBody(String version) { - return 'SpotiFLAC Mobile v$version downloaded. Tap to install.'; + return 'SpotiFLAC Mobile v$version heruntergeladen. Zum Installieren tippen.'; } @override @@ -3605,60 +3626,61 @@ class AppLocalizationsDe extends AppLocalizations { @override String get notifUpdateFailedBody => - 'Could not download update. Try again later.'; + 'Update konnte nicht heruntergeladen werden. Versuche es später erneut.'; @override - String get searchTracks => 'Tracks'; + String get searchTracks => 'Titel'; @override - String get homeSearchHintDefault => 'Paste supported URL or search...'; + String get homeSearchHintDefault => + 'Unterstützte URL einfügen oder suchen...'; @override String homeSearchHintProvider(String providerName) { - return 'Search with $providerName...'; + return 'Mit $providerName suchen...'; } @override - String get homeImportCsvTooltip => 'Import CSV'; + String get homeImportCsvTooltip => 'CSV-Datei importieren'; @override - String get homeChangeSearchProviderTooltip => 'Change search provider'; + String get homeChangeSearchProviderTooltip => 'Suchanbieter ändern'; @override - String get actionPaste => 'Paste'; + String get actionPaste => 'Einfügen'; @override - String get searchTracksHint => 'Search tracks...'; + String get searchTracksHint => 'Titel suchen...'; @override - String get searchTracksEmptyPrompt => 'Search for tracks'; + String get searchTracksEmptyPrompt => 'Nach Titel suchen'; @override - String get tutorialSearchHint => 'Paste or search...'; + String get tutorialSearchHint => 'Einfügen oder suchen...'; @override - String get tutorialDownloadCompletedSemantics => 'Download completed'; + String get tutorialDownloadCompletedSemantics => 'Download abgeschlossen'; @override - String get tutorialDownloadInProgressSemantics => 'Download in progress'; + String get tutorialDownloadInProgressSemantics => 'Download wird ausgeführt'; @override - String get tutorialStartDownloadSemantics => 'Start download'; + String get tutorialStartDownloadSemantics => 'Download starten'; @override - String get optionsEmbedMetadata => 'Embed Metadata'; + String get optionsEmbedMetadata => 'Eingebettete Metadaten'; @override String get optionsEmbedMetadataSubtitleOn => - 'Write metadata, cover art, and embedded lyrics to files'; + 'Schreibe Metadaten, Cover und eingebettete Songtexte in Dateien'; @override String get optionsEmbedMetadataSubtitleOff => - 'Disabled (advanced): skip all metadata embedding'; + 'Deaktiviert (erweitert): Metadateneinbettung überspringen'; @override String get optionsMaxQualityCoverSubtitleDisabled => - 'Disabled when metadata embedding is off'; + 'Deaktiviert, wenn Metadateneinbettung aus ist'; @override String downloadFilenameHintExample(Object artist, Object title) { @@ -3666,38 +3688,39 @@ class AppLocalizationsDe extends AppLocalizations { } @override - String get trackCoverNoEmbeddedArt => 'No embedded album art found'; + String get trackCoverNoEmbeddedArt => + 'Kein eingebettetes Albumcover gefunden'; @override - String get trackCoverReplace => 'Replace Cover'; + String get trackCoverReplace => 'Cover ersetzen'; @override - String get trackCoverPick => 'Pick Cover'; + String get trackCoverPick => 'Cover auswählen'; @override - String get trackCoverClearSelected => 'Clear selected cover'; + String get trackCoverClearSelected => 'Ausgewähltes Cover löschen'; @override - String get trackCoverCurrent => 'Current cover'; + String get trackCoverCurrent => 'Aktuelles Cover'; @override - String get trackCoverSelected => 'Selected cover'; + String get trackCoverSelected => 'Ausgewähltes Cover'; @override String get trackCoverReplaceNotice => - 'The selected cover will replace the current embedded cover when you tap Save.'; + 'Das ausgewählte Cover ersetzt das aktuell eingebettete Cover, wenn auf speichern gedrückt wird.'; @override String get actionStop => 'Stop'; @override - String get queueFinalizingDownload => 'Finalizing download'; + String get queueFinalizingDownload => 'Download wird abgeschlossen'; @override - String get queueDownloadedFileMissing => 'Downloaded file missing'; + String get queueDownloadedFileMissing => 'Heruntergeladene Datei fehlt'; @override - String get queueDownloadCompleted => 'Download completed'; + String get queueDownloadCompleted => 'Download abgeschlossen'; @override String get queueRateLimitTitle => 'Service rate limited'; @@ -3708,94 +3731,95 @@ class AppLocalizationsDe extends AppLocalizations { @override String appearanceSelectAccentColor(String hex) { - return 'Select accent color $hex'; + return 'Wähle Akzentfarbe $hex'; } @override - String get logAutoScrollOn => 'Auto-scroll ON'; + String get logAutoScrollOn => 'Auto-Scrollen AN'; @override - String get logAutoScrollOff => 'Auto-scroll OFF'; + String get logAutoScrollOff => 'Auto-Scrollen AUS'; @override - String get logCopyLogs => 'Copy logs'; + String get logCopyLogs => 'Logs kopieren'; @override - String get logClearSearch => 'Clear search'; + String get logClearSearch => 'Suche löschen'; @override - String get logIssueIspBlockingLabel => 'ISP BLOCKING DETECTED'; + String get logIssueIspBlockingLabel => 'ISP BLOCKIERUNG ERKANNT'; @override String get logIssueIspBlockingDescription => - 'Your ISP may be blocking access to download services'; + 'Dein ISP blockiert möglicherweise den Zugriff auf den Download Dienst'; @override String get logIssueIspBlockingSuggestion => - 'Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8'; + 'Versuche es einem VPN oder ändere DNS auf 1.1.1.1 oder 8.8.8.8'; @override - String get logIssueRateLimitedLabel => 'RATE LIMITED'; + String get logIssueRateLimitedLabel => 'LIMIT ERKANNT'; @override String get logIssueRateLimitedDescription => - 'Too many requests to the service'; + 'Zu viele Anfragen an den Dienst'; @override String get logIssueRateLimitedSuggestion => - 'Wait a few minutes before trying again'; + 'Warte ein paar Minuten, bevor du es erneut versuchst'; @override - String get logIssueNetworkErrorLabel => 'NETWORK ERROR'; + String get logIssueNetworkErrorLabel => 'NETZWERKFEHLER'; @override - String get logIssueNetworkErrorDescription => 'Connection issues detected'; + String get logIssueNetworkErrorDescription => 'Verbindungsprobleme erkannt'; @override - String get logIssueNetworkErrorSuggestion => 'Check your internet connection'; + String get logIssueNetworkErrorSuggestion => + 'Überprüfe deine Internetverbindung'; @override - String get logIssueTrackNotFoundLabel => 'TRACK NOT FOUND'; + String get logIssueTrackNotFoundLabel => 'TITEL NICHT GEFUNDEN'; @override String get logIssueTrackNotFoundDescription => - 'Some tracks could not be found on download services'; + 'Einige Titel konnten auf Download-Diensten nicht gefunden werden'; @override String get logIssueTrackNotFoundSuggestion => - 'The track may not be available in lossless quality'; + 'Der Titel ist möglicherweise nicht in verlustfreier Qualität verfügbar'; @override - String get clickableLookingUpArtist => 'Looking up artist...'; + String get clickableLookingUpArtist => 'Künstler wird gesucht...'; @override String clickableInformationUnavailable(String type) { - return '$type information not available'; + return '$type Informationen nicht verfügbar'; } @override String get extensionDetailsTags => 'Tags'; @override - String get extensionDetailsInformation => 'Information'; + String get extensionDetailsInformation => 'Info'; @override - String get extensionUtilityFunctions => 'Utility Functions'; + String get extensionUtilityFunctions => 'Hilfsfunktionen'; @override - String get actionDismiss => 'Dismiss'; + String get actionDismiss => 'Schließen'; @override - String get setupChangeFolderTooltip => 'Change folder'; + String get setupChangeFolderTooltip => 'Ordner ändern'; @override String a11yOpenTrackByArtist(String trackName, String artistName) { - return 'Open track $trackName by $artistName'; + return 'Öffne Track $trackName von $artistName'; } @override String a11yOpenItem(String itemType, String name) { - return 'Open $itemType $name'; + return '$itemType $name öffnen'; } @override @@ -3803,10 +3827,10 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'items', - one: 'item', + other: 'Items', + one: 'Item', ); - return 'Open $title, $count $_temp0'; + return 'Öffne $title, $count $_temp0'; } @override @@ -3815,134 +3839,132 @@ class AppLocalizationsDe extends AppLocalizations { String artistName, int trackCount, ) { - return 'Open album $albumName by $artistName, $trackCount tracks'; + return 'Öffne Album $albumName von $artistName, $trackCount Titel'; } @override String a11yTrackByArtist(String trackName, String artistName) { - return '$trackName by $artistName'; + return '$trackName von $artistName'; } @override String a11ySelectAlbum(String albumName) { - return 'Select album $albumName'; + return 'Wähle Album $albumName'; } @override String a11yOpenAlbum(String albumName) { - return 'Open album $albumName'; + return 'Album öffnen $albumName'; } @override - String get optionsDefaultSearchTabAlbums => 'Albums'; + String get optionsDefaultSearchTabAlbums => 'Alben'; @override - String get optionsDefaultSearchTabTracks => 'Tracks'; + String get optionsDefaultSearchTabTracks => 'Titel'; @override - String get settingsFiles => 'Files & Folders'; + String get settingsFiles => 'Dateien & Ordner'; @override - String get settingsFilesSubtitle => - 'Download location, filename, folder structure'; + String get settingsFilesSubtitle => 'Speicherort, Dateiname, Ordnerstruktur'; @override - String get settingsMetadata => 'Metadata'; + String get settingsMetadata => 'Metadaten'; @override String get settingsMetadataSubtitle => - 'Cover art, tags, ReplayGain, providers'; + 'Cover Art, Tags, ReplayGain, Anbieter'; @override String get settingsLyrics => 'Lyrics'; @override String get settingsLyricsSubtitle => - 'Embed, mode, providers, language options'; + 'Einbetten, Modus, Anbieter, Sprachoptionen'; @override String get settingsApp => 'App'; @override - String get settingsAppSubtitle => 'Updates, data, extension repo, debug'; + String get settingsAppSubtitle => 'Updates, Daten, Erweiterungsrepo, Debug'; @override - String get sectionMetadataProviders => 'Providers'; + String get sectionMetadataProviders => 'Anbieter'; @override - String get sectionDuplicates => 'Duplicates'; + String get sectionDuplicates => 'Duplikate'; @override - String get sectionLyricsProviderOptions => 'Provider Options'; + String get sectionLyricsProviderOptions => 'Anbieter-Optionen'; @override - String get metadataProvidersTitle => 'Metadata Provider Priority'; + String get metadataProvidersTitle => 'Priorität des Metadaten-Anbieters'; @override String get metadataProvidersSubtitle => - 'Drag to set search and metadata source order'; + 'Zieh, um Such- und Metadatenquellenreihenfolge zu setzen'; @override - String get downloadDeduplication => 'Skip Duplicate Downloads'; + String get downloadDeduplication => 'Doppelte Downloads überspringen'; @override String get downloadDeduplicationEnabled => - 'Already-downloaded tracks will be skipped'; + 'Bereits heruntergeladene Titel werden übersprungen'; @override String get downloadDeduplicationDisabled => - 'All tracks will be downloaded regardless of history'; + 'Alle Titel werden unabhängig vom Verlauf heruntergeladen'; @override - String get downloadFallbackExtensions => 'Fallback Extensions'; + String get downloadFallbackExtensions => 'Fallback-Erweiterungen'; @override String get downloadFallbackExtensionsSubtitle => - 'Choose which extensions can be used as fallback'; + 'Wähle, welche Erweiterungen als Fallback verwendet werden können'; @override - String get editMetadataFieldDateHint => 'YYYY-MM-DD or YYYY'; + String get editMetadataFieldDateHint => 'JJJJ-MM-TT oder JJJJJ'; @override - String get editMetadataFieldTrackTotal => 'Track Total'; + String get editMetadataFieldTrackTotal => 'Titel insgesamt'; @override - String get editMetadataFieldDiscTotal => 'Disc Total'; + String get editMetadataFieldDiscTotal => 'Disc gesamt'; @override - String get editMetadataFieldComposer => 'Composer'; + String get editMetadataFieldComposer => 'Komponist'; @override - String get editMetadataFieldComment => 'Comment'; + String get editMetadataFieldComment => 'Kommentar'; @override - String get editMetadataAdvanced => 'Advanced'; + String get editMetadataAdvanced => 'Erweitert'; @override - String get libraryFilterMetadataMissingTrackNumber => 'Missing track number'; + String get libraryFilterMetadataMissingTrackNumber => 'Fehlende Tracknummer'; @override - String get libraryFilterMetadataMissingDiscNumber => 'Missing disc number'; + String get libraryFilterMetadataMissingDiscNumber => 'Fehlende Disc-Nummer'; @override - String get libraryFilterMetadataMissingArtist => 'Missing artist'; + String get libraryFilterMetadataMissingArtist => 'Fehlender Künstler'; @override - String get libraryFilterMetadataIncorrectIsrcFormat => - 'Incorrect ISRC format'; + String get libraryFilterMetadataIncorrectIsrcFormat => 'Falsches ISRC-Format'; @override - String get libraryFilterMetadataMissingLabel => 'Missing label'; + String get libraryFilterMetadataMissingLabel => 'Label fehlt'; @override String collectionDeletePlaylistsMessage(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'playlists', - one: 'playlist', + other: 'Playlists', + one: 'Playlist', ); - return 'Delete $count $_temp0?'; + return 'Lösche $count $_temp0?'; } @override @@ -3950,10 +3972,10 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'playlists', - one: 'playlist', + other: 'Playlists', + one: 'Playlist', ); - return '$count $_temp0 deleted'; + return '$count $_temp0 gelöscht'; } @override @@ -3961,10 +3983,10 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'Titel', + one: 'Titel', ); - return 'Added $count $_temp0 to $playlistName'; + return '$count $_temp0 zu $playlistName hinzugefügt'; } @override @@ -3976,10 +3998,10 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'Titel', + one: 'Titel', ); - return 'Added $count $_temp0 to $playlistName ($alreadyCount already in playlist)'; + return '$count $_temp0 zu $playlistName ($alreadyCount bereits in der Playlist)'; } @override @@ -3987,8 +4009,8 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'items', - one: 'item', + other: 'Sachen', + one: 'Sache', ); return '$count $_temp0'; } @@ -3999,7 +4021,7 @@ class AppLocalizationsDe extends AppLocalizations { int total, int failedCount, ) { - return 'Metadata re-enriched successfully ($successCount/$total) - Failed: $failedCount'; + return 'Metadaten erfolgreich neu angereichert ($successCount/$total) - fehlgeschlagen: $failedCount'; } @override @@ -4007,29 +4029,29 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'Titel', + one: 'Titel', ); - return 'Delete $count $_temp0'; + return 'Lösche $count $_temp0'; } @override String queueDownloadSpeedStatus(String speed) { - return 'Downloading - $speed MB/s'; + return 'Herunterladen - $speed MB/s'; } @override - String get queueDownloadStarting => 'Starting...'; + String get queueDownloadStarting => 'Starte...'; @override - String get a11ySelectTrack => 'Select track'; + String get a11ySelectTrack => 'Titel auswählen'; @override - String get a11yDeselectTrack => 'Deselect track'; + String get a11yDeselectTrack => 'Titel abwählen'; @override String a11yPlayTrackByArtist(String trackName, String artistName) { - return 'Play $trackName by $artistName'; + return 'Spiele $trackName von $artistName'; } @override @@ -4037,102 +4059,102 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'extensions', - one: 'extension', + other: 'Erweiterungen', + one: 'Erweiterung', ); return '$count $_temp0'; } @override String storeRequiresVersion(String version) { - return 'Requires v$version+'; + return 'Benötigt v$version+'; } @override - String get actionGo => 'Go'; + String get actionGo => 'Los'; @override - String get logIssueSummary => 'Issue Summary'; + String get logIssueSummary => 'Problemübersicht'; @override String logTotalErrors(int count) { - return 'Total errors: $count'; + return 'Gesamte Fehler: $count'; } @override String logAffectedDomains(String domains) { - return 'Affected: $domains'; + return 'Betroffen: $domains'; } @override - String get libraryScanCancelled => 'Scan cancelled'; + String get libraryScanCancelled => 'Scan abgebrochen'; @override String get libraryScanCancelledSubtitle => - 'You can retry the scan when ready.'; + 'Du kannst erneut Scannen, wenn er fertig ist.'; @override String libraryDownloadsHistoryExcluded(int count) { - return '$count from Downloads history (excluded from list)'; + return '$count aus dem Download-Verlauf (von der Liste ausgeschlossen)'; } @override - String get downloadNativeWorker => 'Native download worker'; + String get downloadNativeWorker => 'Nativer Download Dienst'; @override String get downloadNativeWorkerSubtitle => - 'Beta Android service worker for extension downloads'; + 'Beta Android Dienst für Downloads von Erweiterungen'; @override String get badgeBeta => 'BETA'; @override - String get extensionServiceStatus => 'Service Status'; + String get extensionServiceStatus => 'Dienststatus'; @override - String get extensionServiceHealth => 'Service health'; + String get extensionServiceHealth => 'Service-Gesundheit'; @override String extensionHealthChecksConfigured(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'checks', - one: 'check', + other: 'Prüfungen', + one: 'Prüfung', ); - return '$count $_temp0 configured'; + return '$count $_temp0 konfiguriert'; } @override String get extensionOauthConnectHint => - 'Tap Connect to Spotify to fill this field.'; + 'Tippe auf \"Mit Spotify verbinden\" um dieses Feld auszufüllen.'; @override String extensionLastChecked(String time) { - return 'Last checked $time'; + return 'Zuletzt geprüft $time'; } @override - String get extensionRefreshStatus => 'Refresh status'; + String get extensionRefreshStatus => 'Status aktualisieren'; @override - String get extensionCustomUrlHandling => 'Custom URL Handling'; + String get extensionCustomUrlHandling => 'Benutzerdefinierte URL-Handling'; @override String get extensionCustomUrlHandlingSubtitle => - 'This extension can handle links from these sites'; + 'Diese Erweiterung kann Links von diesen Seiten benutzen'; @override String get extensionCustomUrlHandlingShareHint => - 'Share links from these sites to SpotiFLAC Mobile and this extension will handle them.'; + 'Teile Links von diesen Seiten mit SpotiFLAC Mobile und diese Erweiterung wird sie verarbeiten.'; @override String extensionSettingsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'settings', - one: 'setting', + other: 'Einstellungen', + one: 'Einstellung', ); return '$count $_temp0'; } @@ -4141,40 +4163,40 @@ class AppLocalizationsDe extends AppLocalizations { String get extensionHealthOnline => 'Online'; @override - String get extensionHealthDegraded => 'Degraded'; + String get extensionHealthDegraded => 'Eingeschränkt'; @override String get extensionHealthOffline => 'Offline'; @override - String get extensionHealthNotConfigured => 'Not configured'; + String get extensionHealthNotConfigured => 'Nicht konfiguriert'; @override - String get extensionHealthUnknown => 'Unknown'; + String get extensionHealthUnknown => 'Unbekannt'; @override - String get extensionHealthRequired => 'required'; + String get extensionHealthRequired => 'benötigt'; @override - String get extensionSettingNotSet => 'Not set'; + String get extensionSettingNotSet => 'Nicht eingestellt'; @override - String get extensionActionFailed => 'Action failed'; + String get extensionActionFailed => 'Aktion fehlgeschlagen'; @override - String get extensionEnterValue => 'Enter value'; + String get extensionEnterValue => 'Wert eingeben'; @override - String get extensionHealthServiceOnline => 'Service online'; + String get extensionHealthServiceOnline => 'Dienste online'; @override - String get extensionHealthServiceDegraded => 'Service degraded'; + String get extensionHealthServiceDegraded => 'Dienst Eingeschränkt'; @override - String get extensionHealthServiceOffline => 'Service offline'; + String get extensionHealthServiceOffline => 'Dienst offline'; @override - String get extensionHealthServiceUnknown => 'Service status unknown'; + String get extensionHealthServiceUnknown => 'Dienst-Status unbekannt'; @override String get audioAnalysisStereo => 'Stereo'; @@ -4184,42 +4206,42 @@ class AppLocalizationsDe extends AppLocalizations { @override String trackOpenInService(String serviceName) { - return 'Open in $serviceName'; + return 'Öffne in $serviceName'; } @override - String get trackLyricsEmbeddedSource => 'Embedded'; + String get trackLyricsEmbeddedSource => 'Eingebettet'; @override - String get unknownAlbum => 'Unknown Album'; + String get unknownAlbum => 'Unbekanntes Album'; @override - String get unknownArtist => 'Unknown Artist'; + String get unknownArtist => 'Unbekannter Künstler'; @override String get permissionAudio => 'Audio'; @override - String get permissionStorage => 'Storage'; + String get permissionStorage => 'Speicher'; @override - String get permissionNotification => 'Notification'; + String get permissionNotification => 'Benachrichtigung'; @override - String get errorInvalidFolderSelected => 'Invalid folder selected'; + String get errorInvalidFolderSelected => 'Ungültiger Ordner ausgewählt'; @override String get errorCouldNotKeepFolderAccess => - 'Could not keep access to the selected folder'; + 'Konnte nicht auf den ausgewählten Ordner zugreifen'; @override - String get storeAnyVersion => 'Any'; + String get storeAnyVersion => 'Alle'; @override - String get storeCategoryMetadata => 'Metadata'; + String get storeCategoryMetadata => 'Metadaten'; @override - String get storeCategoryDownload => 'Download'; + String get storeCategoryDownload => 'Herunterladen'; @override String get storeCategoryUtility => 'Utility'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index ab61f22c..c39e5d52 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -4266,9 +4266,15 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get homeSubtitle => 'Pega una URL compatible o busca por nombre'; + @override + String get homeEmptyTitle => 'J'; + + @override + String get homeEmptySubtitle => 'Instalar una extensión para continuar.'; + @override String get homeSupports => - 'Soportes: Pista, Álbum, Lista de reproducción, URLs de Artistas'; + 'Soporte de URL: pista, álbum, listas de reproducción, artistas'; @override String get homeRecent => 'Recientes'; @@ -4355,11 +4361,11 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get optionsTitle => 'Opciones'; @override - String get optionsPrimaryProvider => 'Proveedor Principal'; + String get optionsPrimaryProvider => 'Proveedor principal'; @override String get optionsPrimaryProviderSubtitle => - 'Servicio usado al buscar por nombre de la pista.'; + 'Servicio usado para buscar por canción o nombre del álbum'; @override String optionsUsingExtension(String extensionName) { @@ -4367,11 +4373,11 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { } @override - String get optionsDefaultSearchTab => 'Default Search Tab'; + String get optionsDefaultSearchTab => 'Pestaña de búsqueda por defecto'; @override String get optionsDefaultSearchTabSubtitle => - 'Choose which tab opens first for new search results.'; + 'Escoger cuál pestaña se abre primero para nuevos resultados de búsqueda.'; @override String get optionsSwitchBack => @@ -4393,14 +4399,14 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get optionsUseExtensionProvidersOff => - 'Utilizando sólo proveedores integrados'; + 'Utilizando solo proveedores integrados'; @override - String get optionsEmbedLyrics => 'Incrustar Letras'; + String get optionsEmbedLyrics => 'Incrustar letras'; @override String get optionsEmbedLyricsSubtitle => - 'Insertar letras sincronizadas en archivos FLAC'; + 'Guardar letras sincronizadas con las pistas descargadas'; @override String get optionsMaxQualityCover => 'Carátula de calidad máxima'; @@ -4410,7 +4416,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { 'Descargar carátula de resolución máxima'; @override - String get optionsReplayGain => 'Nivelación de Ganancia'; + String get optionsReplayGain => 'Nivelación de ganancia'; @override String get optionsReplayGainSubtitleOn => @@ -4421,7 +4427,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { 'Desactivado: sin etiquetas de normalización de volumen'; @override - String get optionsArtistTagMode => 'Modo de Etiqueta de Artista'; + String get optionsArtistTagMode => 'Modo de etiqueta de artista'; @override String get optionsArtistTagModeDescription => @@ -4436,21 +4442,21 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get optionsArtistTagModeSplitVorbis => - 'Dividir (recortar) etiquetar para FLAC/OPUS'; + 'Dividir etiquetas para FLAC/OPUS'; @override String get optionsArtistTagModeSplitVorbisSubtitle => 'Escribe una etiqueta de artista por artista para FLAC y OPUS; MP3 y M4A se mantienen agrupados.'; @override - String get optionsConcurrentDownloads => 'Descargas Simultáneas'; + String get optionsConcurrentDownloads => 'Descargas simultáneas'; @override String get optionsConcurrentSequential => 'Secuencial (1 a la vez)'; @override String optionsConcurrentParallel(int count) { - return '$count descargas paralelas'; + return '$count descargas en paralelo'; } @override @@ -4458,7 +4464,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { 'Las descargas paralelas pueden activar la limitación de velocidad'; @override - String get optionsExtensionStore => 'Extensión .Repo (repositorio)'; + String get optionsExtensionStore => 'Extensión Repo'; @override String get optionsExtensionStoreSubtitle => 'Mostar barra de navegación repo'; @@ -4474,7 +4480,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get optionsUpdateChannel => 'Tipo de actualizaciones'; @override - String get optionsUpdateChannelStable => 'Sólo versiones estables'; + String get optionsUpdateChannelStable => 'Solo versiones estables'; @override String get optionsUpdateChannelPreview => 'Versión preliminar'; @@ -4540,7 +4546,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get extensionsUninstall => 'Desinstalar'; @override - String get storeTitle => 'Extensión .Repo'; + String get storeTitle => 'Extensión Repo'; @override String get storeSearch => 'Buscar extensiones...'; @@ -4586,7 +4592,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get aboutPCSource => 'Código fuente de PC'; @override - String get aboutKeepAndroidOpen => 'Keep Android Open'; + String get aboutKeepAndroidOpen => 'Mantener Android activo'; @override String get aboutReportIssue => 'Reportar un problema'; @@ -4637,13 +4643,13 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get aboutAppDescription => - 'Search music metadata, manage extensions, and organize your library.'; + 'Busca información musical, gestiona extensiones y organiza tu biblioteca.'; @override String get artistAlbums => 'Álbumes'; @override - String get artistSingles => 'Pistas y EPs'; + String get artistSingles => 'Pistas y mini-álbumes'; @override String get artistCompilations => 'Compilaciones'; @@ -4787,6 +4793,16 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get setupAllowAccessToManageFiles => 'Por favor, activa \"Permitir el acceso para gestionar todos los archivos\" en la siguiente pantalla.'; + @override + String get setupLanguageTitle => 'Elegir idioma'; + + @override + String get setupLanguageDescription => + 'Selecciona tu idioma preferido para la aplicación. Puedes cambiar esto luego en Configuración.'; + + @override + String get setupLanguageSystemDefault => 'Idioma predeterminado'; + @override String get dialogCancel => 'Cancelar'; @@ -4947,7 +4963,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get snackbarMetadataProviderSaved => - 'Prioridad de proveedor de metadatos guardada'; + 'Prioridad de proveedor de información guardada'; @override String snackbarExtensionInstalled(String extensionName) { @@ -4966,7 +4982,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get snackbarFailedToUpdate => 'Error al actualizar la extensión'; @override - String get errorRateLimited => 'Límite Excedido'; + String get errorRateLimited => 'Límite excedido'; @override String get errorRateLimitedMessage => @@ -4975,6 +4991,9 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get errorNoTracksFound => 'No se encontraron pistas'; + @override + String get searchEmptyResultSubtitle => 'Try another keyword'; + @override String get errorUrlNotRecognized => 'Enlace no reconocido'; @@ -5025,7 +5044,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String progressFetchingMetadata(int current, int total) { - return 'Obteniendo metadatos... $current/$total'; + return 'Obteniendo información... $current/$total'; } @override @@ -5090,11 +5109,11 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get folderOrganizationNone => 'Ninguna organización'; @override - String get folderOrganizationByPlaylist => 'Por Playlist'; + String get folderOrganizationByPlaylist => 'Por lista de reproducción'; @override String get folderOrganizationByPlaylistSubtitle => - 'Una carpeta independiente para cada Playlist'; + 'Una carpeta independiente para cada lista de reproducción'; @override String get folderOrganizationByArtist => 'Por Artista'; @@ -5173,11 +5192,11 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { 'Si una pista no está disponible en el primer proveedor, la aplicación intentará automáticamente el siguiente.'; @override - String get providerPriorityFallbackExtensionsTitle => 'Fallback de extensión'; + String get providerPriorityFallbackExtensionsTitle => 'Respaldo de extensión'; @override String get providerPriorityFallbackExtensionsDescription => - 'Elije qué extensiones instaladas se pueden utilizar durante el cambio automático a una alternativa. Los proveedores integrados siguen el orden de prioridad indicado anteriormente.'; + 'Elija las extensiones de descarga que se usarán como respaldo automático.'; @override String get providerPriorityFallbackExtensionsHint => @@ -5190,11 +5209,11 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get providerExtension => 'Extensión'; @override - String get metadataProviderPriorityTitle => 'Prioridad de los metadatos'; + String get metadataProviderPriorityTitle => 'Prioridad de la información'; @override String get metadataProviderPriorityDescription => - 'Arrastra para reordenar los proveedores de metadatos. La aplicación probará los proveedores de arriba hacia abajo al buscar pistas y obtener los metadatos.'; + 'Arrastra para reordenar los proveedores de información. La aplicación probará los proveedores de arriba hacia abajo al buscar pistas y obtener la información.'; @override String get metadataProviderPriorityInfo => @@ -5232,7 +5251,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get logClearLogsMessage => - '¿Estás seguro que deseas limpiar todos los registros?'; + '¿Estás seguro qué deseas limpiar todos los registros?'; @override String get logFilterBySeverity => 'Filtrar los registros por gravedad'; @@ -5268,10 +5287,10 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get credentialsClientIdHint => 'Pegar ID de cliente'; @override - String get credentialsClientSecret => 'Client Secret'; + String get credentialsClientSecret => 'Cliente Secreto'; @override - String get credentialsClientSecretHint => 'Pegar Client Secret'; + String get credentialsClientSecretHint => 'Pegar Cliente Secreto'; @override String get channelStable => 'Estable'; @@ -5321,7 +5340,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get lyricsModeEmbedSubtitle => - 'Letras almacenadas en los metadatos FLAC'; + 'Letras almacenadas en la información FLAC'; @override String get lyricsModeExternal => 'Archivo .lrc externo'; @@ -5355,12 +5374,10 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get settingsAppearanceSubtitle => 'Tema, colores, pantalla'; @override - String get settingsDownloadSubtitle => - 'Servicio, calidad, formato del nombre del archivo'; + String get settingsDownloadSubtitle => 'Servicio, calidad, respaldo'; @override - String get settingsOptionsSubtitle => - 'Alternativa, letras, carátula, actualizaciones'; + String get settingsOptionsSubtitle => 'Respaldo, meta datos, letras, portada'; @override String get settingsExtensionsSubtitle => @@ -5378,7 +5395,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String downloadAllCount(int count) { - return 'Descargar Todo ($count)'; + return 'Descargar todo ($count)'; } @override @@ -5402,7 +5419,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get trackLoadLyrics => 'Cargar letras'; @override - String get trackMetadata => 'Metadatos'; + String get trackMetadata => 'Información'; @override String get trackFileInfo => 'Información de archivo'; @@ -5461,6 +5478,11 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get trackCopyLyrics => 'Copiar letras'; + @override + String trackLyricsSource(String source) { + return 'Fuente: $source'; + } + @override String get trackLyricsNotAvailable => 'Letras no disponibles para este tema'; @@ -5484,7 +5506,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get trackLyricsEmbedded => 'Letra incrustada con éxito'; @override - String get trackInstrumental => 'Pista intrumental'; + String get trackInstrumental => 'Pista instrumental'; @override String get trackCopiedToClipboard => 'Copiado al portapapeles'; @@ -5521,7 +5543,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get storeFilterAll => 'Todo'; @override - String get storeFilterMetadata => 'Metadatos'; + String get storeFilterMetadata => 'Información'; @override String get storeFilterDownload => 'Descargar'; @@ -5553,7 +5575,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get storeRepoUrlHelper => - 'Ejemplo: https://github.com/user/extensions-repo'; + 'e.j. https://github.com/user/extensions-repo'; @override String get storeAddRepoButton => 'Añadir repositorio'; @@ -5571,7 +5593,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get storeNewRepoUrlLabel => 'Nueva URL del repositorio'; @override - String get storeLoadError => 'Falló al carga repositorio'; + String get storeLoadError => 'Falló al cargar repositorio'; @override String get storeEmptyNoExtensions => 'No hay extensiones disponibles'; @@ -5598,7 +5620,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get extensionCapabilities => 'Recursos'; @override - String get extensionMetadataProvider => 'Proveedor de metadatos'; + String get extensionMetadataProvider => 'Proveedor de información'; @override String get extensionDownloadProvider => 'Proveedor de descargas'; @@ -5613,7 +5635,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get extensionQualityOptions => 'Opciones de calidad'; @override - String get extensionPostProcessingHooks => 'Hooks post-procesamiento'; + String get extensionPostProcessingHooks => 'Post-procesamiento de hooks'; @override String get extensionPermissions => 'Permisos'; @@ -5670,11 +5692,21 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get extensionsInfoTip => - 'Las extensiones pueden añadir nuevos metadatos y proveedores de descargas. Sólo instalar extensiones desde fuentes confiables.'; + 'Las extensiones pueden añadir nueva información y proveedores de descargas. Solo instalar extensiones desde fuentes confiables.'; @override String get extensionsInstalledSuccess => 'Extensión instalada correctamente'; + @override + String extensionsInstalledCount(int count) { + return '$count Extensiones instaladas correctamente'; + } + + @override + String extensionsInstallPartialSuccess(int installed, int attempted) { + return '$installed Instalados de $attempted extensiones'; + } + @override String get extensionsDownloadPriority => 'Prioridad de descarga'; @@ -5683,7 +5715,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { 'Establecer orden de servicio de descarga'; @override - String get extensionsFallbackTitle => 'Fallback de extensiones'; + String get extensionsFallbackTitle => 'Respaldo de extensiones'; @override String get extensionsFallbackSubtitle => @@ -5694,15 +5726,15 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { 'No hay extensiones con proveedor de descargas'; @override - String get extensionsMetadataPriority => 'Prioridad de los metadatos'; + String get extensionsMetadataPriority => 'Prioridad de la información'; @override String get extensionsMetadataPrioritySubtitle => - 'Establecer orden de búsqueda y metadatos'; + 'Establecer orden de búsqueda y información'; @override String get extensionsNoMetadataProvider => - 'No hay extensiones con el proveedor de metadatos'; + 'No hay extensiones con el proveedor de información'; @override String get extensionsSearchProvider => 'Proveedor de búsqueda'; @@ -5722,22 +5754,22 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get extensionsErrorLoading => 'Error al cargar la extensión'; @override - String get qualityFlacLossless => 'FLAC Lossless'; + String get qualityFlacLossless => 'FLAC sin pérdida'; @override - String get qualityFlacLosslessSubtitle => '16-bit / 44.1kHz'; + String get qualityFlacLosslessSubtitle => '16-bit / 44,1 kHz'; @override - String get qualityHiResFlac => 'Hi-Res FLAC'; + String get qualityHiResFlac => 'FLAC de alta resolución'; @override - String get qualityHiResFlacSubtitle => '24 bits/hasta 96kHz'; + String get qualityHiResFlacSubtitle => '24-bit / hasta 96 kHz'; @override String get qualityHiResFlacMax => 'Hi-Res FLAC Max'; @override - String get qualityHiResFlacMaxSubtitle => '24 bits / hasta 192kHz'; + String get qualityHiResFlacMaxSubtitle => '24-bit / hasta 192 kHz'; @override String get downloadLossy320 => 'Con pérdida, 320 kbps'; @@ -5750,24 +5782,31 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get downloadLossy320FormatDesc => - 'Elige el formato de salida para las descargas con pérdida de Tidal a 320kbps. La transmisión AAC original se convertirá al formato que hayas seleccionado.'; + 'Elige el formato de salida para las descargas con pérdida de Tidal a 320 kbps. La transmisión AAC original se convertirá al formato que hayas seleccionado.'; @override - String get downloadLossyMp3 => 'MP3 (320kbps)'; + String get downloadLossyMp3 => 'MP3 (320 kbps)'; @override String get downloadLossyMp3Subtitle => - 'Óptima compatibilidad, ~10 MB por pista'; + 'Mejor compatibilidad, ~10 MB por pista'; @override - String get downloadLossyOpus256 => 'OPUS (256kbps)'; + String get downloadLossyAac => 'AAC/M4A (320 kbps)'; + + @override + String get downloadLossyAacSubtitle => + 'La mejor compatibilidad con dispositivos móviles, formato M4A'; + + @override + String get downloadLossyOpus256 => 'OPUS (256 kbps)'; @override String get downloadLossyOpus256Subtitle => - 'Opus de la mejor calidad, ~8 MB por pista'; + 'Mejor calidad de OPUS, ~8 MB por pista'; @override - String get downloadLossyOpus128 => 'OPUS (128kbps)'; + String get downloadLossyOpus128 => 'OPUS (128 kbps)'; @override String get downloadLossyOpus128Subtitle => 'Tamaño mínimo: ~4 MB por pista'; @@ -5834,14 +5873,14 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get settingsDownloadNetwork => 'Red de descarga'; @override - String get settingsDownloadNetworkAny => 'WiFi + Datos móviles'; + String get settingsDownloadNetworkAny => 'Wi-Fi + Datos móviles'; @override - String get settingsDownloadNetworkWifiOnly => 'Iniciar solo por Wifi'; + String get settingsDownloadNetworkWifiOnly => 'Iniciar solo por Wi-Fi'; @override String get settingsDownloadNetworkSubtitle => - 'Elegir qué red usar para descargas. Cuando se establece en WiFi solamente, las descargas se detendrán en los datos móviles.'; + 'Elegir qué red usar para descargas. Cuando se establece en Wi-Fi solamente, las descargas se detendrán en los datos móviles.'; @override String get albumFolderArtistAlbum => 'Artista / Álbum'; @@ -5881,10 +5920,10 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get albumFolderArtistAlbumFlatSubtitle => - 'Artist/Album/ and Artist/song.flac'; + 'Artista/Álbum/ y Artista/canción.flac'; @override - String get downloadedAlbumDeleteSelected => 'Borrar Seleccionados'; + String get downloadedAlbumDeleteSelected => 'Borrar seleccionados'; @override String downloadedAlbumDeleteMessage(int count) { @@ -5970,7 +6009,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { } @override - String get discographySinglesOnly => 'Solo sencillos & EPs '; + String get discographySinglesOnly => 'Solo sencillos & mini-álbum'; @override String discographySinglesOnlySubtitle(int count, int albumCount) { @@ -6002,139 +6041,142 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String discographyAddedToQueue(int count) { - return 'Added $count tracks to queue'; + return 'Se agregaron $count canciones a la lista de espera'; } @override String discographySkippedDownloaded(int added, int skipped) { - return '$added added, $skipped already downloaded'; + return '$added añadidas, $skipped ya fueron descargadas'; } @override - String get discographyNoAlbums => 'No albums available'; + String get discographyNoAlbums => 'No hay álbumes disponibles'; @override - String get discographyFailedToFetch => 'Failed to fetch some albums'; + String get discographyFailedToFetch => + 'Hubo un error para encontrar algunos álbumes'; @override - String get sectionStorageAccess => 'Storage Access'; + String get sectionStorageAccess => 'Permiso de almacenamiento'; @override - String get allFilesAccess => 'All Files Access'; + String get allFilesAccess => 'Acceso a todos los archivos'; @override - String get allFilesAccessEnabledSubtitle => 'Can write to any folder'; + String get allFilesAccessEnabledSubtitle => + 'Puede escribir en cualquier carpeta'; @override - String get allFilesAccessDisabledSubtitle => 'Limited to media folders only'; + String get allFilesAccessDisabledSubtitle => 'Limitado a carpetas de media'; @override String get allFilesAccessDescription => - 'Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.'; + 'Habilite esto si tiene problemas de escritura al guardar en carpetas personalizadas. Android 13+ restringe el acceso a ciertas carpetas por defecto.'; @override String get allFilesAccessDeniedMessage => - 'Permission was denied. Please enable \'All files access\' manually in system settings.'; + 'Permiso denegado. Por favor habilite \'Acceso a todos los archivos\' de manera manual en la configuración del sistema.'; @override String get allFilesAccessDisabledMessage => - 'All Files Access disabled. The app will use limited storage access.'; + 'Acceso a todos los archivos desactivado. La aplicación usará acceso limitado al almacenamiento.'; @override - String get settingsLocalLibrary => 'Local Library'; + String get settingsLocalLibrary => 'Librería local'; @override - String get settingsLocalLibrarySubtitle => 'Scan music & detect duplicates'; + String get settingsLocalLibrarySubtitle => + 'Escanear música y detectar duplicados'; @override - String get settingsCache => 'Almacenamiento & Caché'; + String get settingsCache => 'Almacenamiento & caché'; @override String get settingsCacheSubtitle => 'Ver tamaño y borrar datos en caché'; @override - String get libraryTitle => 'Local Library'; + String get libraryTitle => 'Librería local'; @override - String get libraryScanSettings => 'Scan Settings'; + String get libraryScanSettings => 'Configuración de escaneo'; @override - String get libraryEnableLocalLibrary => 'Enable Local Library'; + String get libraryEnableLocalLibrary => 'Habilitar librería local'; @override String get libraryEnableLocalLibrarySubtitle => 'Escanea y rastrea tu música existente'; @override - String get libraryFolder => 'Library Folder'; + String get libraryFolder => 'Carpeta de la librería'; @override - String get libraryFolderHint => 'Tap to select folder'; + String get libraryFolderHint => 'Toque para seleccionar la carpeta'; @override - String get libraryShowDuplicateIndicator => 'Show Duplicate Indicator'; + String get libraryShowDuplicateIndicator => 'Mostrar indicador de duplicados'; @override String get libraryShowDuplicateIndicatorSubtitle => - 'Show when searching for existing tracks'; + 'Mostrar al buscar canciones existentes'; @override - String get libraryAutoScan => 'Escaneo Automático'; + String get libraryAutoScan => 'Escaneo automático'; @override String get libraryAutoScanSubtitle => - 'Automatically scan your library for new files'; + 'Escanear automáticamente tu librería por nuevos archivos'; @override String get libraryAutoScanOff => 'Apagado'; @override - String get libraryAutoScanOnOpen => 'Every app open'; + String get libraryAutoScanOnOpen => 'Cada vez que la aplicación se abra'; @override - String get libraryAutoScanDaily => 'Daily'; + String get libraryAutoScanDaily => 'Diariamente'; @override - String get libraryAutoScanWeekly => 'Weekly'; + String get libraryAutoScanWeekly => 'Semanalmente'; @override - String get libraryActions => 'Actions'; + String get libraryActions => 'Acciones'; @override - String get libraryScan => 'Scan Library'; + String get libraryScan => 'Escanear librería'; @override - String get libraryScanSubtitle => 'Scan for audio files'; + String get libraryScanSubtitle => 'Escanear archivos de audio'; @override - String get libraryScanSelectFolderFirst => 'Select a folder first'; + String get libraryScanSelectFolderFirst => 'Primero seleccione una carpeta'; @override - String get libraryCleanupMissingFiles => 'Cleanup Missing Files'; + String get libraryCleanupMissingFiles => 'Limpiar archivos faltantes'; @override String get libraryCleanupMissingFilesSubtitle => - 'Remove entries for files that no longer exist'; + 'Remover entradas para archivos que ya no existen'; @override - String get libraryClear => 'Clear Library'; + String get libraryClear => 'Limpiar librería'; @override - String get libraryClearSubtitle => 'Remove all scanned tracks'; + String get libraryClearSubtitle => 'Remover todas las canciones escaneadas'; @override - String get libraryClearConfirmTitle => 'Clear Library'; + String get libraryClearConfirmTitle => 'Limpiar librería'; @override String get libraryClearConfirmMessage => - 'This will remove all scanned tracks from your library. Your actual music files will not be deleted.'; + 'Esto removerá todas las canciones escaneadas de tu librería. Los archivos de música no serán eliminados.'; @override - String get libraryAbout => 'About Local Library'; + String get libraryAbout => 'Acerca de la librería local'; @override String get libraryAboutDescription => - 'Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.'; + 'Escanea tu colección de música para detectar duplicados al descargar. Permite formatos FLAC, M4A, MP3, Opus, y OGG. La meta data será leída de los archivos cuando sea posible.'; @override String libraryTracksUnit(int count) { @@ -6160,135 +6202,137 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String libraryLastScanned(String time) { - return 'Last scanned: $time'; + return 'Último escaneo: $time'; } @override - String get libraryLastScannedNever => 'Never'; + String get libraryLastScannedNever => 'Nunca'; @override - String get libraryScanning => 'Scanning...'; + String get libraryScanning => 'Escaneando...'; @override - String get libraryScanFinalizing => 'Finalizing library...'; + String get libraryScanFinalizing => 'Finalizando la biblioteca...'; @override String libraryScanProgress(String progress, int total) { - return '$progress% of $total files'; + return '$progress% de $total archivos'; } @override - String get libraryInLibrary => 'In Library'; + String get libraryInLibrary => 'En la biblioteca'; @override String libraryRemovedMissingFiles(int count) { - return 'Removed $count missing files from library'; + return 'Eliminados $count archivos faltantes de la biblioteca'; } @override - String get libraryCleared => 'Library cleared'; + String get libraryCleared => 'Biblioteca vaciada'; @override - String get libraryStorageAccessRequired => 'Storage Access Required'; + String get libraryStorageAccessRequired => + 'Permiso de acceso al almacenamiento requerido'; @override String get libraryStorageAccessMessage => - 'SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.'; + 'SpotiFLAC necesita acceso al almacenamiento para escanear tu biblioteca musical. Por favor, concede el permiso en los ajustes.'; @override - String get libraryFolderNotExist => 'Selected folder does not exist'; + String get libraryFolderNotExist => 'La carpeta seleccionada no existe'; @override - String get librarySourceDownloaded => 'Downloaded'; + String get librarySourceDownloaded => 'Descargado'; @override - String get librarySourceLocal => 'Local'; + String get librarySourceLocal => 'En el dispositivo'; @override - String get libraryFilterAll => 'All'; + String get libraryFilterAll => 'Todos'; @override - String get libraryFilterDownloaded => 'Downloaded'; + String get libraryFilterDownloaded => 'Descargado'; @override - String get libraryFilterLocal => 'Local'; + String get libraryFilterLocal => 'En el dispositivo'; @override - String get libraryFilterTitle => 'Filters'; + String get libraryFilterTitle => 'Filtros'; @override - String get libraryFilterReset => 'Reset'; + String get libraryFilterReset => 'Restablecer'; @override - String get libraryFilterApply => 'Apply'; + String get libraryFilterApply => 'Aplicar'; @override - String get libraryFilterSource => 'Source'; + String get libraryFilterSource => 'Fuente'; @override - String get libraryFilterQuality => 'Quality'; + String get libraryFilterQuality => 'Calidad'; @override - String get libraryFilterQualityHiRes => 'Hi-Res (24bit)'; + String get libraryFilterQualityHiRes => 'Hi-Res (24-bit)'; @override - String get libraryFilterQualityCD => 'CD (16bit)'; + String get libraryFilterQualityCD => 'CD (16-bit)'; @override - String get libraryFilterQualityLossy => 'Lossy'; + String get libraryFilterQualityLossy => 'Con pérdida'; @override - String get libraryFilterFormat => 'Format'; + String get libraryFilterFormat => 'Formato'; @override - String get libraryFilterMetadata => 'Metadata'; + String get libraryFilterMetadata => 'Información'; @override - String get libraryFilterMetadataComplete => 'Complete metadata'; + String get libraryFilterMetadataComplete => 'Información completa'; @override - String get libraryFilterMetadataMissingAny => 'Missing any metadata'; + String get libraryFilterMetadataMissingAny => 'Falta información (meta-data)'; @override - String get libraryFilterMetadataMissingYear => 'Missing year'; + String get libraryFilterMetadataMissingYear => 'Falta año'; @override - String get libraryFilterMetadataMissingGenre => 'Missing genre'; + String get libraryFilterMetadataMissingGenre => 'Falta género'; @override - String get libraryFilterMetadataMissingAlbumArtist => 'Missing album artist'; + String get libraryFilterMetadataMissingAlbumArtist => + 'Falta artiste de álbum'; @override - String get libraryFilterSort => 'Sort'; + String get libraryFilterSort => 'Ordenar'; @override - String get libraryFilterSortLatest => 'Latest'; + String get libraryFilterSortLatest => 'Reciente'; @override - String get libraryFilterSortOldest => 'Oldest'; + String get libraryFilterSortOldest => 'Más antiguo'; @override - String get libraryFilterSortAlbumAsc => 'Album (A-Z)'; + String get libraryFilterSortAlbumAsc => 'Álbum (A-Z)'; @override - String get libraryFilterSortAlbumDesc => 'Album (Z-A)'; + String get libraryFilterSortAlbumDesc => 'Álbum (Z-A)'; @override - String get libraryFilterSortGenreAsc => 'Genre (A-Z)'; + String get libraryFilterSortGenreAsc => 'Género (A-Z)'; @override - String get libraryFilterSortGenreDesc => 'Genre (Z-A)'; + String get libraryFilterSortGenreDesc => 'Género (Z-A)'; @override - String get timeJustNow => 'Just now'; + String get timeJustNow => 'Hace un momento'; @override String timeMinutesAgo(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count minutes ago', - one: '1 minute ago', + other: '$count minutos atrás', + one: 'hace 1 minuto', ); return '$_temp0'; } @@ -6298,199 +6342,202 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count hours ago', - one: '1 hour ago', + other: '$count horas atrás', + one: '1 hora atrás', ); return '$_temp0'; } @override - String get tutorialWelcomeTitle => 'Welcome to SpotiFLAC!'; + String get tutorialWelcomeTitle => '¡Bienvenido a SpotiFLAC!'; @override String get tutorialWelcomeDesc => - 'Let\'s learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.'; + 'Aprende cómo descargar tu música favorita en excelente calidad. Este tutorial te mostrará lo básico.'; @override String get tutorialWelcomeTip1 => - 'Download music from Spotify, Deezer, or paste any supported URL'; + 'Descarga música de Spotify, Deezer, o pega cualquier URL soportada'; @override String get tutorialWelcomeTip2 => - 'Get FLAC quality audio from Tidal, Qobuz, or Deezer'; + 'Obtener audio de calidad FLAC de Tidal, Qobuz o Deezer'; @override String get tutorialWelcomeTip3 => - 'Automatic metadata, cover art, and lyrics embedding'; + 'Información automática, portadas y letras integradas'; @override - String get tutorialSearchTitle => 'Finding Music'; + String get tutorialSearchTitle => 'Buscando música'; @override String get tutorialSearchDesc => - 'There are two easy ways to find music you want to download.'; + 'Hay dos maneras fáciles de encontrar la música que quieres descargar.'; @override - String get tutorialDownloadTitle => 'Downloading Music'; + String get tutorialDownloadTitle => 'Descargando música'; @override String get tutorialDownloadDesc => - 'Downloading music is simple and fast. Here\'s how it works.'; + 'Descargar música es simple y rápido. Así es como funciona.'; @override - String get tutorialLibraryTitle => 'Your Library'; + String get tutorialLibraryTitle => 'Tu biblioteca'; @override String get tutorialLibraryDesc => - 'All your downloaded music is organized in the Library tab.'; + 'Toda tu música descargada está organizada en la pestaña Biblioteca.'; @override String get tutorialLibraryTip1 => - 'View download progress and queue in the Library tab'; + 'Ver progreso de descarga y cola en la pestaña de biblioteca'; @override String get tutorialLibraryTip2 => - 'Tap any track to play it with your music player'; + 'Pulsa cualquier pista para abrirla con tu reproductor multimedia'; @override String get tutorialLibraryTip3 => - 'Switch between list and grid view for better browsing'; + 'Cambiar modo de vista entre modo lista y cuadrícula para mejorar navegación'; @override - String get tutorialExtensionsTitle => 'Extensions'; + String get tutorialExtensionsTitle => 'Extensiones'; @override String get tutorialExtensionsDesc => - 'Extend the app\'s capabilities with community extensions.'; + 'Extiende las capacidades de la aplicación con extensiones creadas por la comunidad.'; @override String get tutorialExtensionsTip1 => - 'Browse the Repo tab to discover useful extensions'; + 'Navega por la pestaña de repo para descubrir extensiones'; @override String get tutorialExtensionsTip2 => - 'Add new download providers or search sources'; + 'Añadir nuevos proveedores de descargas o fuentes de búsqueda'; @override String get tutorialExtensionsTip3 => - 'Get lyrics, enhanced metadata, and more features'; + 'Obtén letras, información mejorada y más características'; @override - String get tutorialSettingsTitle => 'Customize Your Experience'; + String get tutorialSettingsTitle => 'Personaliza tu experiencia'; @override String get tutorialSettingsDesc => - 'Personalize the app in Settings to match your preferences.'; + 'Personaliza la aplicación en Ajustes según tus preferencias.'; @override String get tutorialSettingsTip1 => - 'Change download location and folder organization'; + 'Cambia la ubicación de las descargas y la organización de las carpetas'; @override String get tutorialSettingsTip2 => - 'Set default audio quality and format preferences'; + 'Configura la calidad de audio predeterminada y las preferencias de formato'; @override - String get tutorialSettingsTip3 => 'Customize app theme and appearance'; + String get tutorialSettingsTip3 => + 'Personaliza el tema y el aspecto de la aplicación'; @override String get tutorialReadyMessage => - 'You\'re all set! Start downloading your favorite music now.'; + '¡Todo preparado!, puedes descargar tu música favorita.'; @override - String get libraryForceFullScan => 'Force Full Scan'; + String get libraryForceFullScan => 'Forzar análisis completo'; @override - String get libraryForceFullScanSubtitle => 'Rescan all files, ignoring cache'; + String get libraryForceFullScanSubtitle => + 'Volver a escanear archivos, ignorando caché'; @override - String get cleanupOrphanedDownloads => 'Cleanup Orphaned Downloads'; + String get cleanupOrphanedDownloads => 'Borrar descargar huérfanas'; @override String get cleanupOrphanedDownloadsSubtitle => - 'Remove history entries for files that no longer exist'; + 'Borrar historial de archivos que no existen'; @override String cleanupOrphanedDownloadsResult(int count) { - return 'Removed $count orphaned entries from history'; + return 'Se removieron $count entradas huérfanas del historial.'; } @override - String get cleanupOrphanedDownloadsNone => 'No orphaned entries found'; + String get cleanupOrphanedDownloadsNone => + 'Sin entradas huérfanas encontradas'; @override - String get cacheTitle => 'Storage & Cache'; + String get cacheTitle => 'Almacenamiento y caché'; @override - String get cacheSummaryTitle => 'Cache overview'; + String get cacheSummaryTitle => 'Resumen de la caché'; @override String get cacheSummarySubtitle => - 'Clearing cache will not remove downloaded music files.'; + 'Limpiar la caché no eliminará los archivos de música descargados.'; @override String cacheEstimatedTotal(String size) { - return 'Estimated cache usage: $size'; + return 'Uso estimado de caché: $size'; } @override - String get cacheSectionStorage => 'Cached Data'; + String get cacheSectionStorage => 'Datos almacenados en caché'; @override - String get cacheSectionMaintenance => 'Maintenance'; + String get cacheSectionMaintenance => 'Mantenimiento'; @override - String get cacheAppDirectory => 'App cache directory'; + String get cacheAppDirectory => 'Directorio de caché'; @override String get cacheAppDirectoryDesc => - 'HTTP responses, WebView data, and other temporary app data.'; + 'Respuestas HTTP, datos WebView y otros datos temporales.'; @override - String get cacheTempDirectory => 'Temporary directory'; + String get cacheTempDirectory => 'Directorio temporal'; @override String get cacheTempDirectoryDesc => - 'Temporary files from downloads and audio conversion.'; + 'Archivos temporales de descargas y conversión de audio.'; @override - String get cacheCoverImage => 'Cover image cache'; + String get cacheCoverImage => 'Caché de imágenes de portada'; @override String get cacheCoverImageDesc => - 'Downloaded album and track cover art. Will re-download when viewed.'; + 'Álbum descargado y portada de pista. Se volverá a descargar cuando se vea.'; @override - String get cacheLibraryCover => 'Library cover cache'; + String get cacheLibraryCover => 'Caché de portada (biblioteca)'; @override String get cacheLibraryCoverDesc => - 'Cover art extracted from local music files. Will re-extract on next scan.'; + 'Portada extraída de archivos locales. Se extraerá de nuevo en el próximo escaneo.'; @override - String get cacheExploreFeed => 'Explore feed cache'; + String get cacheExploreFeed => 'Explorar caché de inicio'; @override String get cacheExploreFeedDesc => - 'Explore tab content (new releases, trending). Will refresh on next visit.'; + 'Explorar contenido de pestaña (nuevas versiones, tendencias). Se actualiza en cada visita.'; @override - String get cacheTrackLookup => 'Track lookup cache'; + String get cacheTrackLookup => 'Caché de búsqueda'; @override String get cacheTrackLookupDesc => - 'Spotify/Deezer track ID lookups. Clearing may slow next few searches.'; + 'Búsqueda de ID de Spotify/Deezer. Limpiar podría ralentizar algunas búsquedas.'; @override String get cacheCleanupUnusedDesc => - 'Remove orphaned download history and library entries for missing files.'; + 'Borre el historial de archivos huérfanos y las entradas en la biblioteca.'; @override - String get cacheNoData => 'No cached data'; + String get cacheNoData => 'No hay datos en caché'; @override String cacheSizeWithFiles(String size, int count) { - return '$size in $count files'; + return '$size en $count archivos'; } @override @@ -6500,166 +6547,169 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String cacheEntries(int count) { - return '$count entries'; + return '$count registros'; } @override String cacheClearSuccess(String target) { - return 'Cleared: $target'; + return 'Limpiado: $target'; } @override - String get cacheClearConfirmTitle => 'Clear cache?'; + String get cacheClearConfirmTitle => '¿Limpiar caché?'; @override String cacheClearConfirmMessage(String target) { - return 'This will clear cached data for $target. Downloaded music files will not be deleted.'; + return 'Esto borrará los datos en caché para $target. Los archivos descargados no se eliminan.'; } @override - String get cacheClearAllConfirmTitle => 'Clear all cache?'; + String get cacheClearAllConfirmTitle => '¿Quieres limpiar todas las cachés?'; @override String get cacheClearAllConfirmMessage => - 'This will clear all cache categories on this page. Downloaded music files will not be deleted.'; + 'Esto borrará todo el caché de categorías en esta página. Los archivos descargados no se eliminan.'; @override - String get cacheClearAll => 'Clear all cache'; + String get cacheClearAll => 'Borrar todo el caché'; @override - String get cacheCleanupUnused => 'Cleanup unused data'; + String get cacheCleanupUnused => 'Limpiar datos sin usar'; @override String get cacheCleanupUnusedSubtitle => - 'Remove orphaned download history and missing library entries'; + 'Borrar historial de descargas huérfanas y entradas faltantes en biblioteca'; @override String cacheCleanupResult(int downloadCount, int libraryCount) { - return 'Cleanup completed: $downloadCount orphaned downloads, $libraryCount missing library entries'; + return 'Limpieza copletada: $downloadCount descargas huéranas, $libraryCount entradas faltantes de librería'; } @override - String get cacheRefreshStats => 'Refresh stats'; + String get cacheRefreshStats => 'Actualizar estadisticas'; @override - String get trackSaveCoverArt => 'Save Cover Art'; + String get trackSaveCoverArt => 'Guardar portada'; @override - String get trackSaveCoverArtSubtitle => 'Save album art as .jpg file'; + String get trackSaveCoverArtSubtitle => + 'Guardar imagen del álbum como archivo .jpg'; @override - String get trackSaveLyrics => 'Save Lyrics (.lrc)'; + String get trackSaveLyrics => 'Guardar letra (.lrc)'; @override - String get trackSaveLyricsSubtitle => 'Fetch and save lyrics as .lrc file'; + String get trackSaveLyricsSubtitle => + 'Buscar y guardar letras como archivo .lrc'; @override - String get trackSaveLyricsProgress => 'Saving lyrics...'; + String get trackSaveLyricsProgress => 'Guardando letra...'; @override - String get trackReEnrich => 'Re-enrich'; + String get trackReEnrich => 'Volver a enriquecer'; @override String get trackReEnrichOnlineSubtitle => - 'Search metadata online and embed into file'; + 'Buscar información en línea y incrustar al archivo'; @override - String get trackReEnrichFieldsTitle => 'Fields to update'; + String get trackReEnrichFieldsTitle => 'Campos a actualizar'; @override - String get trackReEnrichFieldCover => 'Cover Art'; + String get trackReEnrichFieldCover => 'Carátula'; @override - String get trackReEnrichFieldLyrics => 'Lyrics'; + String get trackReEnrichFieldLyrics => 'Letra'; @override - String get trackReEnrichFieldBasicTags => 'Album, Album Artist'; + String get trackReEnrichFieldBasicTags => 'Álbum, Artista del Álbum'; @override - String get trackReEnrichFieldTrackInfo => 'Track & Disc Number'; + String get trackReEnrichFieldTrackInfo => 'Número de pista(s) y disco(s).'; @override - String get trackReEnrichFieldReleaseInfo => 'Date & ISRC'; + String get trackReEnrichFieldReleaseInfo => 'Fecha e ISRC'; @override - String get trackReEnrichFieldExtra => 'Genre, Label, Copyright'; + String get trackReEnrichFieldExtra => 'Género, etiqueta, derechos de autor'; @override - String get trackReEnrichSelectAll => 'Select All'; + String get trackReEnrichSelectAll => 'Seleccionar todos'; @override - String get trackEditMetadata => 'Edit Metadata'; + String get trackEditMetadata => 'Editar información'; @override String trackCoverSaved(String fileName) { - return 'Cover art saved to $fileName'; + return 'Carátula guardada en $fileName'; } @override - String get trackCoverNoSource => 'No cover art source available'; + String get trackCoverNoSource => 'No hay fuente de portadas disponible'; @override String trackLyricsSaved(String fileName) { - return 'Lyrics saved to $fileName'; + return 'Letra guardada en $fileName'; } @override - String get trackReEnrichProgress => 'Re-enriching metadata...'; + String get trackReEnrichProgress => 'Obteniendo información...'; @override - String get trackReEnrichSearching => 'Searching metadata online...'; + String get trackReEnrichSearching => 'Buscando información en línea...'; @override - String get trackReEnrichSuccess => 'Metadata re-enriched successfully'; + String get trackReEnrichSuccess => 'Información '; @override - String get trackReEnrichFfmpegFailed => 'FFmpeg metadata embed failed'; + String get trackReEnrichFfmpegFailed => + 'Información incrustada con FFmpeg falló'; @override - String get queueFlacAction => 'Queue FLAC'; + String get queueFlacAction => 'Encolar FLAC'; @override String queueFlacConfirmMessage(int count) { - return 'Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n$count selected'; + return 'Buscar coincidencias en línea para las pistas seleccionadas y en cola de descargas\n\nArchivos existentes no serán afectados o borrados.\n\nSolo coincidencia de alta confianza serán puestas automáticamente.\n\n$count seleccionado'; } @override String queueFlacFindingProgress(int current, int total) { - return 'Finding FLAC matches... ($current/$total)'; + return 'Buscando coincidencias FLAC'; } @override String get queueFlacNoReliableMatches => - 'No reliable online matches found for the selection'; + 'Sin coincidencias en línea de confianza'; @override String queueFlacQueuedWithSkipped(int addedCount, int skippedCount) { - return 'Added $addedCount tracks to queue, skipped $skippedCount'; + return 'Añadido $addedCount pistas a la cola, omitidas $skippedCount'; } @override String trackSaveFailed(String error) { - return 'Failed: $error'; + return 'Error: $error'; } @override - String get trackConvertFormat => 'Convert Format'; + String get trackConvertFormat => 'Convertir formato'; @override String get trackConvertFormatSubtitle => - 'Convert to MP3, Opus, ALAC, or FLAC'; + 'Convertir a AAC/M4A, MP3, Opus, ALAC, o FLAC'; @override - String get trackConvertTitle => 'Convert Audio'; + String get trackConvertTitle => 'Convertir audio'; @override - String get trackConvertTargetFormat => 'Target Format'; + String get trackConvertTargetFormat => 'Formato de destino'; @override - String get trackConvertBitrate => 'Bitrate'; + String get trackConvertBitrate => 'Tasa de bits'; @override - String get trackConvertConfirmTitle => 'Confirm Conversion'; + String get trackConvertConfirmTitle => 'Confirmar conversión'; @override String trackConvertConfirmMessage( @@ -6667,7 +6717,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String targetFormat, String bitrate, ) { - return 'Convert from $sourceFormat to $targetFormat at $bitrate?\n\nThe original file will be deleted after conversion.'; + return '¿Convertir desde $sourceFormat a $targetFormat a $bitrate?'; } @override @@ -6675,23 +6725,23 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String sourceFormat, String targetFormat, ) { - return 'Convert from $sourceFormat to $targetFormat? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.'; + return 'Convertir de $sourceFormat a $targetFormat? \n(Sin pérdidas)\n\nEl archivo original será eliminado después de la conversión.'; } @override String get trackConvertLosslessHint => - 'Lossless conversion — no quality loss'; + 'Conversión sin pérdidas — sin pérdida de calidad'; @override - String get trackConvertConverting => 'Converting audio...'; + String get trackConvertConverting => 'Convirtiendo Audio...'; @override String trackConvertSuccess(String format) { - return 'Converted to $format successfully'; + return 'Convertido a $format con éxito'; } @override - String get trackConvertFailed => 'Conversion failed'; + String get trackConvertFailed => 'La conversión ha fallado'; @override String get cueSplitTitle => 'Split CUE Sheet'; @@ -6701,17 +6751,17 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String cueSplitAlbum(String album) { - return 'Album: $album'; + return 'Álbum: $album'; } @override String cueSplitArtist(String artist) { - return 'Artist: $artist'; + return 'Artista: $artist'; } @override String cueSplitTrackCount(int count) { - return '$count tracks'; + return '$count pistas'; } @override @@ -6739,38 +6789,41 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get cueSplitNoAudioFile => 'Audio file not found for this CUE sheet'; @override - String get cueSplitButton => 'Split into Tracks'; + String get cueSplitButton => 'Dividir en pistas'; @override - String get actionCreate => 'Create'; + String get actionCreate => 'Crear'; @override - String get collectionFoldersTitle => 'My folders'; + String get collectionFoldersTitle => 'Mis carpetas'; @override - String get collectionWishlist => 'Wishlist'; + String get collectionWishlist => 'Lista de deseos'; @override String get collectionLoved => 'Loved'; @override - String get collectionPlaylists => 'Playlists'; + String get collectionFavoriteArtists => 'Artistas favoritos'; @override - String get collectionPlaylist => 'Playlist'; + String get collectionPlaylists => 'Listas de reproducción'; @override - String get collectionAddToPlaylist => 'Add to playlist'; + String get collectionPlaylist => 'Lista de reproducción'; @override - String get collectionCreatePlaylist => 'Create playlist'; + String get collectionAddToPlaylist => 'Añadir a la lista'; @override - String get collectionNoPlaylistsYet => 'No playlists yet'; + String get collectionCreatePlaylist => 'Crear lista de reproducción'; + + @override + String get collectionNoPlaylistsYet => 'Aún no hay listas de reproducción'; @override String get collectionNoPlaylistsSubtitle => - 'Create a playlist to start categorizing tracks'; + 'Crear una lista de reproducción para empezar a categorizar pistas'; @override String collectionPlaylistTracks(int count) { @@ -6783,30 +6836,41 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { return '$_temp0'; } + @override + String collectionArtistCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count artists', + one: '1 artist', + ); + return '$_temp0'; + } + @override String collectionAddedToPlaylist(String playlistName) { - return 'Added to \"$playlistName\"'; + return 'Añadida a \"$playlistName\"'; } @override String collectionAlreadyInPlaylist(String playlistName) { - return 'Already in \"$playlistName\"'; + return 'Ya está en \"$playlistName\"'; } @override - String get collectionPlaylistCreated => 'Playlist created'; + String get collectionPlaylistCreated => 'Lista de reproducción creada'; @override - String get collectionPlaylistNameHint => 'Playlist name'; + String get collectionPlaylistNameHint => 'Nombre de la lista de reproducción'; @override String get collectionPlaylistNameRequired => 'Playlist name is required'; @override - String get collectionRenamePlaylist => 'Rename playlist'; + String get collectionRenamePlaylist => 'Renombrar lista de reproducción'; @override - String get collectionDeletePlaylist => 'Delete playlist'; + String get collectionDeletePlaylist => 'Eliminar lista de reproducción'; @override String collectionDeletePlaylistMessage(String playlistName) { @@ -6814,13 +6878,13 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { } @override - String get collectionPlaylistDeleted => 'Playlist deleted'; + String get collectionPlaylistDeleted => 'Lista de reproducción eliminada'; @override String get collectionPlaylistRenamed => 'Playlist renamed'; @override - String get collectionWishlistEmptyTitle => 'Wishlist is empty'; + String get collectionWishlistEmptyTitle => 'La lista de deseos está vacía'; @override String get collectionWishlistEmptySubtitle => @@ -6834,17 +6898,27 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { 'Tap love on tracks to keep your favorites'; @override - String get collectionPlaylistEmptyTitle => 'Playlist is empty'; + String get collectionFavoriteArtistsEmptyTitle => + 'Aún no hay artistas favoritos'; + + @override + String get collectionFavoriteArtistsEmptySubtitle => + 'Tap the heart on an artist page to keep them here'; + + @override + String get collectionPlaylistEmptyTitle => + 'La lista de reproducción está vacía'; @override String get collectionPlaylistEmptySubtitle => 'Long-press + on any track to add it here'; @override - String get collectionRemoveFromPlaylist => 'Remove from playlist'; + String get collectionRemoveFromPlaylist => + 'Quitar de la lista de reproducción'; @override - String get collectionRemoveFromFolder => 'Remove from folder'; + String get collectionRemoveFromFolder => 'Quitar de la carpeta'; @override String collectionRemoved(String trackName) { @@ -6871,6 +6945,16 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { return '\"$trackName\" removed from Wishlist'; } + @override + String collectionAddedToFavoriteArtists(String artistName) { + return '\"$artistName\" added to Favorite Artists'; + } + + @override + String collectionRemovedFromFavoriteArtists(String artistName) { + return '\"$artistName\" removed from Favorite Artists'; + } + @override String get trackOptionAddToLoved => 'Add to Loved'; @@ -6878,16 +6962,22 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get trackOptionRemoveFromLoved => 'Remove from Loved'; @override - String get trackOptionAddToWishlist => 'Add to Wishlist'; + String get trackOptionAddToWishlist => 'Añadir a la lista de deseos'; @override String get trackOptionRemoveFromWishlist => 'Remove from Wishlist'; @override - String get collectionPlaylistChangeCover => 'Change cover image'; + String get artistOptionAddToFavorites => 'Añadir a artistas favoritos'; @override - String get collectionPlaylistRemoveCover => 'Remove cover image'; + String get artistOptionRemoveFromFavorites => 'Remove from Favorite Artists'; + + @override + String get collectionPlaylistChangeCover => 'Cambiar imagen de portada'; + + @override + String get collectionPlaylistRemoveCover => 'Eliminar imagen de portada'; @override String selectionShareCount(int count) { @@ -6918,7 +7008,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get selectionConvertNoConvertible => 'No convertible tracks selected'; @override - String get selectionBatchConvertConfirmTitle => 'Batch Convert'; + String get selectionBatchConvertConfirmTitle => 'Conversión por lotes'; @override String selectionBatchConvertConfirmMessage( @@ -6963,14 +7053,14 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Artist folders use Album Artist when available'; + 'Folder named after Album Artist tag'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => - 'Artist folders use Track Artist only'; + 'Folder named after Track Artist tag'; @override - String get lyricsProvidersTitle => 'Lyrics Providers'; + String get lyricsProvidersTitle => 'Prioridad de proveedores de letras'; @override String get lyricsProvidersDescription => @@ -6982,12 +7072,12 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String lyricsProvidersEnabledSection(int count) { - return 'Enabled ($count)'; + return 'Activados ($count)'; } @override String lyricsProvidersDisabledSection(int count) { - return 'Disabled ($count)'; + return 'Desactivados ($count)'; } @override @@ -7021,7 +7111,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { 'QQ Music (good for Chinese songs, via proxy)'; @override - String get lyricsProviderExtensionDesc => 'Extension provider'; + String get lyricsProviderExtensionDesc => 'Proveedor de extensiones'; @override String get safMigrationTitle => 'Storage Update Required'; @@ -7038,16 +7128,16 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get safMigrationSuccess => 'Download folder updated to SAF mode'; @override - String get settingsDonate => 'Donate'; + String get settingsDonate => 'Apoya el desarrollo'; @override - String get settingsDonateSubtitle => 'Support SpotiFLAC-Mobile development'; + String get settingsDonateSubtitle => 'Compra un café al desarrollador'; @override String get tooltipLoveAll => 'Love All'; @override - String get tooltipAddToPlaylist => 'Add to Playlist'; + String get tooltipAddToPlaylist => 'Añadir a la lista de reproducción'; @override String snackbarRemovedTracksFromLoved(int count) { @@ -7060,7 +7150,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { } @override - String get dialogDownloadAllTitle => 'Download All'; + String get dialogDownloadAllTitle => 'Descargar todo'; @override String dialogDownloadAllMessage(int count) { @@ -7071,7 +7161,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @override - String get homeGoToAlbum => 'Go to Album'; + String get homeGoToAlbum => 'Ir al álbum'; @override String get homeAlbumInfoUnavailable => 'Album info not available'; @@ -7101,20 +7191,21 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get downloadLocationSubtitle => - 'Choose storage mode for downloaded files.'; + 'Choose where to save your downloaded tracks'; @override - String get storageModeAppFolder => 'App folder (non-SAF)'; + String get storageModeAppFolder => 'App Folder (Recommended)'; @override - String get storageModeAppFolderSubtitle => 'Use default Music/SpotiFLAC path'; + String get storageModeAppFolderSubtitle => + 'Saves to Music/SpotiFLAC by default'; @override - String get storageModeSaf => 'SAF folder'; + String get storageModeSaf => 'Carpeta personalizada (SAF)'; @override String get storageModeSafSubtitle => - 'Pick folder via Android Storage Access Framework'; + 'Escoge cualquier carpeta, incluyendo la tarjeta SD'; @override String downloadFilenameDescription( @@ -7126,62 +7217,63 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { Object track, Object year, ) { - return 'Customize how your files are named.'; + return 'Usa $artist, $title, $album, $track, $year, $date, $disc como marcadores de posición.'; } @override String get downloadFilenameInsertTag => 'Tap to insert tag:'; @override - String get downloadSeparateSinglesEnabled => 'Albums/ and Singles/ folders'; + String get downloadSeparateSinglesEnabled => + 'Singles and EPs saved in a separate folder'; @override - String get downloadSeparateSinglesDisabled => 'All files in same structure'; + String get downloadSeparateSinglesDisabled => + 'Singles and albums saved in the same folder'; @override String get downloadArtistNameFilters => 'Artist Name Filters'; @override - String get downloadCreatePlaylistSourceFolder => - 'Create playlist source folder'; + String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder'; @override String get downloadCreatePlaylistSourceFolderEnabled => - 'Playlist downloads use Playlist/ plus your normal folder structure.'; + 'A subfolder is created for each playlist'; @override String get downloadCreatePlaylistSourceFolderDisabled => - 'Playlist downloads use the normal folder structure only.'; + 'All tracks saved directly to download folder'; @override String get downloadCreatePlaylistSourceFolderRedundant => - 'By Playlist already places downloads inside a playlist folder.'; + 'Handled by folder organization setting'; @override - String get downloadSongLinkRegion => 'SongLink Region'; + String get downloadSongLinkRegion => 'Región de SongLink'; @override - String get downloadNetworkCompatibilityMode => 'Network compatibility mode'; + String get downloadNetworkCompatibilityMode => + 'Modo de compatibilidad de red'; @override String get downloadNetworkCompatibilityModeEnabled => - 'Enabled: try HTTP + accept invalid TLS certificates (unsafe)'; + 'Using legacy TLS settings for older networks'; @override String get downloadNetworkCompatibilityModeDisabled => - 'Off: strict HTTPS certificate validation (recommended)'; + 'Utilizando ajustes de red estándar'; @override String get downloadSelectServiceToEnable => - 'Select a built-in service to enable'; + 'Select Tidal or Qobuz to enable this option'; @override String get downloadSelectTidalQobuz => - 'Select Tidal or Qobuz above to configure quality'; + 'Select Tidal or Qobuz to choose audio quality'; @override - String get downloadEmbedLyricsDisabled => - 'Disabled while Embed Metadata is turned off'; + String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first'; @override String get downloadNeteaseIncludeTranslation => @@ -7189,11 +7281,11 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get downloadNeteaseIncludeTranslationEnabled => - 'Append translated lyrics when available'; + 'Chinese translation lines included'; @override String get downloadNeteaseIncludeTranslationDisabled => - 'Use original lyrics only'; + 'Solo letras originales'; @override String get downloadNeteaseIncludeRomanization => @@ -7201,72 +7293,82 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get downloadNeteaseIncludeRomanizationEnabled => - 'Append romanized lyrics when available'; + 'Romanization lines included'; @override - String get downloadNeteaseIncludeRomanizationDisabled => 'Disabled'; + String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization'; @override - String get downloadAppleQqMultiPerson => 'Apple/QQ Multi-Person Word-by-Word'; + String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics'; @override String get downloadAppleQqMultiPersonEnabled => - 'Enable v1/v2 speaker and [bg:] tags'; + 'Speaker labels included for duets and group tracks'; @override String get downloadAppleQqMultiPersonDisabled => - 'Simplified word-by-word formatting'; + 'Standard lyrics without speaker labels'; @override - String get downloadMusixmatchLanguage => 'Musixmatch Language'; + String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; @override - String get downloadMusixmatchLanguageAuto => 'Auto (original)'; + String get downloadAppleElrcWordSyncEnabled => + 'Raw word-by-word timestamps preserved'; @override - String get downloadFilterContributing => - 'Filter contributing artists in Album Artist'; + String get downloadAppleElrcWordSyncDisabled => + 'Safer line-by-line Apple Music lyrics'; + + @override + String get downloadMusixmatchLanguage => 'Idioma de Musixmatch'; + + @override + String get downloadMusixmatchLanguageAuto => 'Auto (original language)'; + + @override + String get downloadFilterContributing => 'Filter Contributing Artists'; @override String get downloadFilterContributingEnabled => - 'Album Artist metadata uses primary artist only'; + 'Contributing artists removed from Album Artist folder name'; @override String get downloadFilterContributingDisabled => - 'Keep full Album Artist metadata value'; + 'Full Album Artist string used'; @override - String get downloadProvidersNoneEnabled => 'None enabled'; + String get downloadProvidersNoneEnabled => 'No hay proveedores activos'; @override - String get downloadMusixmatchLanguageCode => 'Language code'; + String get downloadMusixmatchLanguageCode => 'Código de idioma'; @override - String get downloadMusixmatchLanguageHint => 'auto / en / es / ja'; + String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja'; @override String get downloadMusixmatchLanguageDesc => - 'Set preferred language code (example: en, es, ja). Leave empty for auto.'; + 'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.'; @override String get downloadMusixmatchAuto => 'Auto'; @override - String get downloadNetworkAnySubtitle => 'WiFi + Mobile Data'; + String get downloadNetworkAnySubtitle => 'Usar Wi-Fi o datos móviles'; @override String get downloadNetworkWifiOnlySubtitle => - 'Pause downloads on mobile data'; + 'Downloads pause when on mobile data'; @override String get downloadSongLinkRegionDesc => - 'Used as userCountry for SongLink API lookup.'; + 'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.'; @override - String get snackbarUnsupportedAudioFormat => 'Unsupported audio format'; + String get snackbarUnsupportedAudioFormat => 'Formato de audio no soportado'; @override - String get cacheRefresh => 'Refresh'; + String get cacheRefresh => 'Actualizar'; @override String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { @@ -7301,7 +7403,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get snackbarSelectedPlaylistsEmpty => - 'Selected playlists have no tracks'; + 'Las listas de reproducción seleccionadas no tienen pistas'; @override String playlistsCount(int count) { @@ -7322,14 +7424,14 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { 'Select fields to fill automatically from online metadata'; @override - String get editMetadataAutoFillFetch => 'Fetch & Fill'; + String get editMetadataAutoFillFetch => 'Recuperar y llenar'; @override - String get editMetadataAutoFillSearching => 'Searching online...'; + String get editMetadataAutoFillSearching => 'Buscando en línea...'; @override String get editMetadataAutoFillNoResults => - 'No matching metadata found online'; + 'No hay información coincidente en línea'; @override String editMetadataAutoFillDone(int count) { @@ -7347,28 +7449,28 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { 'Select at least one field to auto-fill'; @override - String get editMetadataFieldTitle => 'Title'; + String get editMetadataFieldTitle => 'Título'; @override - String get editMetadataFieldArtist => 'Artist'; + String get editMetadataFieldArtist => 'Artista'; @override - String get editMetadataFieldAlbum => 'Album'; + String get editMetadataFieldAlbum => 'Álbum'; @override - String get editMetadataFieldAlbumArtist => 'Album Artist'; + String get editMetadataFieldAlbumArtist => 'Artista del álbum'; @override - String get editMetadataFieldDate => 'Date'; + String get editMetadataFieldDate => 'Fecha'; @override - String get editMetadataFieldTrackNum => 'Track #'; + String get editMetadataFieldTrackNum => 'Pista #'; @override - String get editMetadataFieldDiscNum => 'Disc #'; + String get editMetadataFieldDiscNum => 'Disco #'; @override - String get editMetadataFieldGenre => 'Genre'; + String get editMetadataFieldGenre => 'Género'; @override String get editMetadataFieldIsrc => 'ISRC'; @@ -7377,27 +7479,27 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get editMetadataFieldLabel => 'Label'; @override - String get editMetadataFieldCopyright => 'Copyright'; + String get editMetadataFieldCopyright => 'Derechos de autor'; @override - String get editMetadataFieldCover => 'Cover Art'; + String get editMetadataFieldCover => 'Carátula'; @override - String get editMetadataSelectAll => 'All'; + String get editMetadataSelectAll => 'Todos'; @override - String get editMetadataSelectEmpty => 'Empty only'; + String get editMetadataSelectEmpty => 'Solo vacíos'; @override String queueDownloadingCount(int count) { - return 'Downloading ($count)'; + return 'Descargando ($count)'; } @override - String get queueDownloadedHeader => 'Downloaded'; + String get queueDownloadedHeader => 'Descargadas'; @override - String get queueFilteringIndicator => 'Filtering...'; + String get queueFilteringIndicator => 'Filtrando...'; @override String queueTrackCount(int count) { @@ -7422,30 +7524,31 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { } @override - String get queueEmptyAlbums => 'No album downloads'; + String get queueEmptyAlbums => 'No se han descargado álbumes'; @override String get queueEmptyAlbumsSubtitle => - 'Download multiple tracks from an album to see them here'; + 'Descarga varias canciones de un álbum para verlas aquí'; @override - String get queueEmptySingles => 'No single downloads'; + String get queueEmptySingles => 'No hay descargas'; @override String get queueEmptySinglesSubtitle => 'Single track downloads will appear here'; @override - String get queueEmptyHistory => 'No download history'; + String get queueEmptyHistory => 'No hay historial de descargas'; @override String get queueEmptyHistorySubtitle => 'Downloaded tracks will appear here'; @override - String get selectionAllPlaylistsSelected => 'All playlists selected'; + String get selectionAllPlaylistsSelected => 'Todas las listas seleccionadas'; @override - String get selectionTapPlaylistsToSelect => 'Tap playlists to select'; + String get selectionTapPlaylistsToSelect => + 'Pulsa listas de reproducción para seleccionar'; @override String get selectionSelectPlaylistsToDelete => 'Select playlists to delete'; @@ -7458,28 +7561,37 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { 'Verify lossless quality with spectrum analysis'; @override - String get audioAnalysisAnalyzing => 'Analyzing audio...'; + String get audioAnalysisAnalyzing => 'Analizando audio...'; @override - String get audioAnalysisSampleRate => 'Sample Rate'; + String get audioAnalysisSampleRate => 'Frecuencia de muestreo'; @override - String get audioAnalysisBitDepth => 'Bit Depth'; + String get audioAnalysisCodec => 'Códec'; @override - String get audioAnalysisChannels => 'Channels'; + String get audioAnalysisContainer => 'Contenedor'; @override - String get audioAnalysisDuration => 'Duration'; + String get audioAnalysisDecodedFormat => 'Formato decodificado'; + + @override + String get audioAnalysisBitDepth => 'Profundidad de bits'; + + @override + String get audioAnalysisChannels => 'Canales'; + + @override + String get audioAnalysisDuration => 'Duración'; @override String get audioAnalysisNyquist => 'Nyquist'; @override - String get audioAnalysisFileSize => 'Size'; + String get audioAnalysisFileSize => 'Tamaño'; @override - String get audioAnalysisDynamicRange => 'Dynamic Range'; + String get audioAnalysisDynamicRange => 'Rango dinámico'; @override String get audioAnalysisPeak => 'Peak'; @@ -7488,17 +7600,35 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get audioAnalysisRms => 'RMS'; @override - String get audioAnalysisSamples => 'Samples'; + String get audioAnalysisLufs => 'LUFS'; @override - String get audioAnalysisRescan => 'Re-analyze'; + String get audioAnalysisTruePeak => 'True Peak'; @override - String get audioAnalysisRescanning => 'Re-analyzing audio...'; + String get audioAnalysisClipping => 'Clipping'; + + @override + String get audioAnalysisNoClipping => 'No clipping'; + + @override + String get audioAnalysisSpectralCutoff => 'Spectral Cutoff'; + + @override + String get audioAnalysisChannelStats => 'Per-channel Stats'; + + @override + String get audioAnalysisSamples => 'Muestras'; + + @override + String get audioAnalysisRescan => 'Volver a analizar'; + + @override + String get audioAnalysisRescanning => 'Volviendo a analizar audio...'; @override String extensionsSearchWith(String providerName) { - return 'Search with $providerName'; + return 'Buscar con $providerName'; } @override @@ -7513,7 +7643,14 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get extensionsHomeFeedAutoSubtitle => - 'Automatically select the best available'; + 'Seleccionar automáticamente la mejor disponible'; + + @override + String get extensionsHomeFeedOff => 'Desactivado'; + + @override + String get extensionsHomeFeedOffSubtitle => + 'Do not show the home feed on the main screen'; @override String extensionsHomeFeedUse(String extensionName) { @@ -7530,7 +7667,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get sortAlphaDesc => 'Z-A'; @override - String get cancelDownloadTitle => 'Cancel download?'; + String get cancelDownloadTitle => '¿Cancelar descarga?'; @override String cancelDownloadContent(String trackName) { @@ -7538,7 +7675,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { } @override - String get cancelDownloadKeep => 'Keep'; + String get cancelDownloadKeep => 'Mantener'; @override String get metadataSaveFailedFfmpeg => 'Failed to save metadata via FFmpeg'; @@ -7565,10 +7702,11 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get notifChannelDownloadName => 'Download Progress'; @override - String get notifChannelDownloadDesc => 'Shows download progress for tracks'; + String get notifChannelDownloadDesc => + 'Muestra el progreso de la descarga para las pistas'; @override - String get notifChannelLibraryScanName => 'Library Scan'; + String get notifChannelLibraryScanName => 'Escaneo de biblioteca'; @override String get notifChannelLibraryScanDesc => 'Shows local library scan progress'; @@ -7580,11 +7718,11 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String notifFinalizingTrack(String trackName) { - return 'Finalizing $trackName'; + return 'Finalizando $trackName'; } @override - String get notifEmbeddingMetadata => 'Embedding metadata...'; + String get notifEmbeddingMetadata => 'Insertando información...'; @override String notifAlreadyInLibraryCount(int completed, int total) { @@ -7600,7 +7738,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { } @override - String get notifDownloadComplete => 'Download Complete'; + String get notifDownloadComplete => 'Descarga completa'; @override String notifDownloadsFinished(int completed, int failed) { @@ -7608,15 +7746,52 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { } @override - String get notifAllDownloadsComplete => 'All Downloads Complete'; + String get notifAllDownloadsComplete => 'Todas las descargas completadas'; @override String notifTracksDownloadedSuccess(int count) { - return '$count tracks downloaded successfully'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks downloaded successfully', + one: '1 track downloaded successfully', + ); + return '$_temp0'; } @override - String get notifScanningLibrary => 'Scanning local library'; + String notifDownloadsFinishedBody(int completed, int failed) { + String _temp0 = intl.Intl.pluralLogic( + completed, + locale: localeName, + other: '$completed tracks downloaded', + one: '1 track downloaded', + ); + String _temp1 = intl.Intl.pluralLogic( + failed, + locale: localeName, + other: '$failed failed', + one: '1 failed', + ); + return '$_temp0, $_temp1'; + } + + @override + String get notifDownloadsCanceledTitle => 'Descargas canceladas'; + + @override + String notifDownloadsCanceledBody(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count downloads canceled by user', + one: '1 download canceled by user', + ); + return '$_temp0'; + } + + @override + String get notifScanningLibrary => 'Escaneando biblioteca local'; @override String notifLibraryScanProgressWithTotal( @@ -7633,7 +7808,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { } @override - String get notifLibraryScanComplete => 'Library scan complete'; + String get notifLibraryScanComplete => 'Escaneo de biblioteca completado'; @override String notifLibraryScanCompleteBody(int count) { @@ -7647,7 +7822,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String notifLibraryScanErrors(int count) { - return '$count errors'; + return '$count errores'; } @override @@ -7670,7 +7845,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { } @override - String get notifUpdateReady => 'Update Ready'; + String get notifUpdateReady => 'Actualización preparada'; @override String notifUpdateReadyBody(String version) { @@ -7685,69 +7860,671 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { 'Could not download update. Try again later.'; @override - String get optionsDefaultSearchTabAlbums => 'Albums'; + String get searchTracks => 'Pistas'; @override - String get optionsDefaultSearchTabTracks => 'Tracks'; + String get homeSearchHintDefault => 'Paste supported URL or search...'; @override - String get settingsFiles => 'Files & Folders'; + String homeSearchHintProvider(String providerName) { + return 'Search with $providerName...'; + } + + @override + String get homeImportCsvTooltip => 'Importar CSV'; + + @override + String get homeChangeSearchProviderTooltip => 'Change search provider'; + + @override + String get actionPaste => 'Pegar'; + + @override + String get searchTracksHint => 'Buscar canciones...'; + + @override + String get searchTracksEmptyPrompt => 'Buscar pistas'; + + @override + String get tutorialSearchHint => 'Pegar o buscar...'; + + @override + String get tutorialDownloadCompletedSemantics => 'Descarga completada'; + + @override + String get tutorialDownloadInProgressSemantics => 'Descarga en curso'; + + @override + String get tutorialStartDownloadSemantics => 'Comenzar descarga'; + + @override + String get optionsEmbedMetadata => 'Incrustar información'; + + @override + String get optionsEmbedMetadataSubtitleOn => + 'Escribir información, carátulas y letras incrustadas en archivos'; + + @override + String get optionsEmbedMetadataSubtitleOff => + 'Disabled (advanced): skip all metadata embedding'; + + @override + String get optionsMaxQualityCoverSubtitleDisabled => + 'Disabled when metadata embedding is off'; + + @override + String downloadFilenameHintExample(Object artist, Object title) { + return '$artist - $title'; + } + + @override + String get trackCoverNoEmbeddedArt => 'No embedded album art found'; + + @override + String get trackCoverReplace => 'Reemplazar portada'; + + @override + String get trackCoverPick => 'Elegir portada'; + + @override + String get trackCoverClearSelected => 'Borrar portada seleccionada'; + + @override + String get trackCoverCurrent => 'Portada actual'; + + @override + String get trackCoverSelected => 'Carátula seleccionada'; + + @override + String get trackCoverReplaceNotice => + 'La portada seleccionada sustituirá a la portada actual incrustada cuando pulses Guardar.'; + + @override + String get actionStop => 'Detener'; + + @override + String get queueFinalizingDownload => 'Finalizando descarga'; + + @override + String get queueDownloadedFileMissing => 'Downloaded file missing'; + + @override + String get queueDownloadCompleted => 'Descarga completada'; + + @override + String get queueRateLimitTitle => 'Service rate limited'; + + @override + String get queueRateLimitMessage => + 'This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.'; + + @override + String appearanceSelectAccentColor(String hex) { + return 'Selecciona un color de contraste $hex'; + } + + @override + String get logAutoScrollOn => 'Auto-scroll ON'; + + @override + String get logAutoScrollOff => 'Auto-scroll OFF'; + + @override + String get logCopyLogs => 'Copy logs'; + + @override + String get logClearSearch => 'Limpiar búsqueda'; + + @override + String get logIssueIspBlockingLabel => 'ISP BLOCKING DETECTED'; + + @override + String get logIssueIspBlockingDescription => + 'Your ISP may be blocking access to download services'; + + @override + String get logIssueIspBlockingSuggestion => + 'Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8'; + + @override + String get logIssueRateLimitedLabel => 'RATE LIMITED'; + + @override + String get logIssueRateLimitedDescription => + 'Too many requests to the service'; + + @override + String get logIssueRateLimitedSuggestion => + 'Wait a few minutes before trying again'; + + @override + String get logIssueNetworkErrorLabel => 'NETWORK ERROR'; + + @override + String get logIssueNetworkErrorDescription => 'Connection issues detected'; + + @override + String get logIssueNetworkErrorSuggestion => 'Check your internet connection'; + + @override + String get logIssueTrackNotFoundLabel => 'TRACK NOT FOUND'; + + @override + String get logIssueTrackNotFoundDescription => + 'Some tracks could not be found on download services'; + + @override + String get logIssueTrackNotFoundSuggestion => + 'The track may not be available in lossless quality'; + + @override + String get clickableLookingUpArtist => 'Looking up artist...'; + + @override + String clickableInformationUnavailable(String type) { + return '$type information not available'; + } + + @override + String get extensionDetailsTags => 'Etiquetas'; + + @override + String get extensionDetailsInformation => 'Información'; + + @override + String get extensionUtilityFunctions => 'Utility Functions'; + + @override + String get actionDismiss => 'Descartar'; + + @override + String get setupChangeFolderTooltip => 'Change folder'; + + @override + String a11yOpenTrackByArtist(String trackName, String artistName) { + return 'Open track $trackName by $artistName'; + } + + @override + String a11yOpenItem(String itemType, String name) { + return 'Abrir $itemType $name'; + } + + @override + String a11yOpenItemCount(String title, int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'objetos', + one: 'objeto', + ); + return 'Abrir $title, $count $_temp0'; + } + + @override + String a11yOpenAlbumByArtistTrackCount( + String albumName, + String artistName, + int trackCount, + ) { + return 'Abrir álbum $albumName de $artistName, $trackCount pistas'; + } + + @override + String a11yTrackByArtist(String trackName, String artistName) { + return '$trackName de $artistName'; + } + + @override + String a11ySelectAlbum(String albumName) { + return 'Seleccionar álbum $albumName'; + } + + @override + String a11yOpenAlbum(String albumName) { + return 'Abrir álbum $albumName'; + } + + @override + String get optionsDefaultSearchTabAlbums => 'Álbumes'; + + @override + String get optionsDefaultSearchTabTracks => 'Pistas'; + + @override + String get settingsFiles => 'Archivos y carpetas'; @override String get settingsFilesSubtitle => - 'Download location, filename, folder structure'; + 'Directorio de descarga, nombre de archivo y estructura de carpetas'; @override - String get settingsMetadata => 'Metadata'; + String get settingsMetadata => 'Información'; @override String get settingsMetadataSubtitle => - 'Cover art, tags, ReplayGain, providers'; + 'Carátula, etiquetas, ReplayGain, proveedores'; @override - String get settingsLyrics => 'Lyrics'; + String get settingsLyrics => 'Letra'; @override String get settingsLyricsSubtitle => - 'Embed, mode, providers, language options'; + 'Insertar, modo, proveedores, opciones de idioma'; @override - String get settingsApp => 'App'; + String get settingsApp => 'Aplicación'; @override - String get settingsAppSubtitle => 'Updates, data, extension repo, debug'; + String get settingsAppSubtitle => + 'Actualizaciones, datos, extensiones repo, depuración'; @override - String get sectionMetadataProviders => 'Providers'; + String get sectionMetadataProviders => 'Proveedores'; @override - String get sectionDuplicates => 'Duplicates'; + String get sectionDuplicates => 'Duplicados'; @override - String get sectionLyricsProviderOptions => 'Provider Options'; + String get sectionLyricsProviderOptions => 'Opciones del proveedor'; @override - String get metadataProvidersTitle => 'Metadata Provider Priority'; + String get metadataProvidersTitle => 'Prioridad de proveedor de información'; @override String get metadataProvidersSubtitle => - 'Drag to set search and metadata source order'; + 'Arrastre para establecer orden de búsqueda y origen de información'; @override - String get downloadDeduplication => 'Skip Duplicate Downloads'; + String get downloadDeduplication => 'Saltar descargas duplicadas'; @override String get downloadDeduplicationEnabled => - 'Already-downloaded tracks will be skipped'; + 'Las pistas previamente descargadas se omitirán'; @override String get downloadDeduplicationDisabled => - 'All tracks will be downloaded regardless of history'; + 'Todas las pistas se descargarán independientemente del historial'; @override - String get downloadFallbackExtensions => 'Fallback Extensions'; + String get downloadFallbackExtensions => 'Reslpado de extensiones'; @override String get downloadFallbackExtensionsSubtitle => - 'Choose which extensions can be used as fallback'; + 'Elige qué extensiones se pueden utilizar como alternativa'; + + @override + String get editMetadataFieldDateHint => 'AAA-MM-DD o AAAA'; + + @override + String get editMetadataFieldTrackTotal => 'Total de pistas'; + + @override + String get editMetadataFieldDiscTotal => 'Total de discos'; + + @override + String get editMetadataFieldComposer => 'Compositor'; + + @override + String get editMetadataFieldComment => 'Comentario'; + + @override + String get editMetadataAdvanced => 'Avanzado'; + + @override + String get libraryFilterMetadataMissingTrackNumber => 'Falta número de pista'; + + @override + String get libraryFilterMetadataMissingDiscNumber => 'Falta número de álbum'; + + @override + String get libraryFilterMetadataMissingArtist => 'Falta artista'; + + @override + String get libraryFilterMetadataIncorrectIsrcFormat => + 'Formato de ISRC erróneo'; + + @override + String get libraryFilterMetadataMissingLabel => 'Falta etiqueta'; + + @override + String collectionDeletePlaylistsMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'listas de reproducción', + one: 'lista', + ); + return '¿Eliminar $count $_temp0?'; + } + + @override + String collectionPlaylistsDeleted(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'listas de reproducción', + one: 'lista', + ); + return '$count $_temp0 eliminadas'; + } + + @override + String collectionAddedTracksToPlaylist(int count, String playlistName) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Añadido $count $_temp0 a $playlistName'; + } + + @override + String collectionAddedTracksToPlaylistWithExisting( + int count, + String playlistName, + int alreadyCount, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'pistas', + one: 'pista', + ); + return 'Añadido $count $_temp0 a $playlistName ($alreadyCount ya en la lista de reproducción)'; + } + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'objetos', + one: 'objeto', + ); + return '$count $_temp0'; + } + + @override + String trackReEnrichSuccessWithFailures( + int successCount, + int total, + int failedCount, + ) { + return 'Información enriquecida nuevamente con éxito\n($successCount/$total) - Fallaron: $failedCount'; + } + + @override + String selectionDeleteTracksCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'pistas', + one: 'pista', + ); + return 'Eliminar $count $_temp0'; + } + + @override + String queueDownloadSpeedStatus(String speed) { + return 'Descargando - $speed MB/s'; + } + + @override + String get queueDownloadStarting => 'Comenzando...'; + + @override + String get a11ySelectTrack => 'Seleccionar pista'; + + @override + String get a11yDeselectTrack => 'No seleccionar pista'; + + @override + String a11yPlayTrackByArtist(String trackName, String artistName) { + return 'Reproducir $trackName de $artistName'; + } + + @override + String storeExtensionsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'extensiones', + one: 'extensión', + ); + return '$count $_temp0'; + } + + @override + String storeRequiresVersion(String version) { + return 'Requiere v$version+'; + } + + @override + String get actionGo => 'Ir'; + + @override + String get logIssueSummary => 'Resumen de incidencias'; + + @override + String logTotalErrors(int count) { + return 'Total de errores: $count'; + } + + @override + String logAffectedDomains(String domains) { + return 'Afectados: $domains'; + } + + @override + String get libraryScanCancelled => 'Escaneo cancelado'; + + @override + String get libraryScanCancelledSubtitle => + 'Puedes volver a intentar el escaneo cuando esté listo.'; + + @override + String libraryDownloadsHistoryExcluded(int count) { + return '$count del historial de descargas (excluidos de la lista)'; + } + + @override + String get downloadNativeWorker => 'Trabajador de descarga nativo'; + + @override + String get downloadNativeWorkerSubtitle => + 'Operador de servicios beta android para descargas de extensión'; + + @override + String get badgeBeta => 'BETA'; + + @override + String get extensionServiceStatus => 'Estado del servicio'; + + @override + String get extensionServiceHealth => 'Estado de servicio'; + + @override + String extensionHealthChecksConfigured(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'chequeos', + one: 'chequeo', + ); + return '$count $_temp0 '; + } + + @override + String get extensionOauthConnectHint => + 'Pulsa para conectar a Spotify y rellenar el campo.'; + + @override + String extensionLastChecked(String time) { + return 'Última comprobación $time'; + } + + @override + String get extensionRefreshStatus => 'Actualizar estado'; + + @override + String get extensionCustomUrlHandling => 'Gestión de URL personalizada'; + + @override + String get extensionCustomUrlHandlingSubtitle => + 'Esta extensión puede manejar enlaces de estos sitios'; + + @override + String get extensionCustomUrlHandlingShareHint => + 'Comparte enlaces de estos sitios a SpotiFLAC Mobile y esta extensión los manejará.'; + + @override + String extensionSettingsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ajustes', + one: 'ajuste', + ); + return '$count $_temp0'; + } + + @override + String get extensionHealthOnline => 'En línea'; + + @override + String get extensionHealthDegraded => 'Degradado'; + + @override + String get extensionHealthOffline => 'Sin conexión'; + + @override + String get extensionHealthNotConfigured => 'Sin configurar'; + + @override + String get extensionHealthUnknown => 'Desconocido'; + + @override + String get extensionHealthRequired => 'requerido'; + + @override + String get extensionSettingNotSet => 'Sin establecer'; + + @override + String get extensionActionFailed => 'Error de acción'; + + @override + String get extensionEnterValue => 'Ingrese un valor'; + + @override + String get extensionHealthServiceOnline => 'Servicio en línea'; + + @override + String get extensionHealthServiceDegraded => 'Servicio degradado'; + + @override + String get extensionHealthServiceOffline => 'Servicio fuera de línea'; + + @override + String get extensionHealthServiceUnknown => 'Estado de servicio desconocido'; + + @override + String get audioAnalysisStereo => 'Estéreo'; + + @override + String get audioAnalysisMono => 'Mono'; + + @override + String trackOpenInService(String serviceName) { + return 'Abrir en $serviceName'; + } + + @override + String get trackLyricsEmbeddedSource => 'Incrustado'; + + @override + String get unknownAlbum => 'Álbum desconocido'; + + @override + String get unknownArtist => 'Artista desconocido'; + + @override + String get permissionAudio => 'Audio'; + + @override + String get permissionStorage => 'Almacenamiento'; + + @override + String get permissionNotification => 'Notificación'; + + @override + String get errorInvalidFolderSelected => 'Directorio seleccionado inválido'; + + @override + String get errorCouldNotKeepFolderAccess => + 'No se puede obtener acceso al directorio seleccionado'; + + @override + String get storeAnyVersion => 'Cualquier'; + + @override + String get storeCategoryMetadata => 'Información'; + + @override + String get storeCategoryDownload => 'Descargar'; + + @override + String get storeCategoryUtility => 'Utilidad'; + + @override + String get storeCategoryLyrics => 'Letras'; + + @override + String get storeCategoryIntegration => 'Integración'; + + @override + String get artistReleases => 'Lanzamientos'; + + @override + String get editMetadataSelectNone => 'None'; + + @override + String queueRetryAllFailed(int count) { + return 'Retry $count failed'; + } + + @override + String get settingsSaveDownloadHistory => 'Save download history'; + + @override + String get settingsSaveDownloadHistorySubtitle => + 'Keep completed downloads in history and library views'; + + @override + String get dialogDisableHistoryTitle => 'Turn off download history?'; + + @override + String get dialogDisableHistoryMessage => + 'Existing history will be cleared. Downloaded files will not be deleted.'; + + @override + String get dialogDisableAndClear => 'Turn off and clear'; + + @override + String get openInOtherServices => 'Open in Other Services'; + + @override + String get shareSheetNoExtensions => 'No other compatible services'; + + @override + String get shareSheetNotFound => 'Not found'; + + @override + String get shareSheetCopyLink => 'Copy Link'; + + @override + String shareSheetLinkCopied(Object service) { + return '$service link copied'; + } } diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 38001eb2..c222c28b 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -15,28 +15,30 @@ class AppLocalizationsFr extends AppLocalizations { String get navHome => 'Accueil'; @override - String get navLibrary => 'Bibliothèques'; + String get navLibrary => 'Bibliothèque'; @override String get navSettings => 'Paramètres'; @override - String get navStore => 'Repo'; + String get navStore => 'Dépôt'; @override String get homeTitle => 'Accueil'; @override - String get homeSubtitle => 'Paste a supported URL or search by name'; + String get homeSubtitle => + 'Collez une URL prise en charge ou effectuez une recherche par nom'; @override - String get homeEmptyTitle => 'No search providers yet'; + String get homeEmptyTitle => 'Aucun moteur de recherche pour le moment'; @override - String get homeEmptySubtitle => 'Install an extension to continue.'; + String get homeEmptySubtitle => 'Installez une extension pour continuer.'; @override - String get homeSupports => 'Supports: Piste, Album, Playlist, Artiste URLs'; + String get homeSupports => + 'Prise en charge : URL de titres, d’albums, de playlists et d’artistes'; @override String get homeRecent => 'Récent'; @@ -82,11 +84,11 @@ class AppLocalizationsFr extends AppLocalizations { String get downloadFilenameFormat => 'Nom du fichier'; @override - String get downloadSingleFilenameFormat => 'Single Filename Format'; + String get downloadSingleFilenameFormat => 'Format de nom de fichier unique'; @override String get downloadSingleFilenameFormatDescription => - 'Filename pattern for singles and EPs. Uses the same tags as the album format.'; + 'Modèle de nom de fichier pour les singles et les EP. Utilise les mêmes balises que le format album.'; @override String get downloadFolderOrganization => 'Organisation du dossier'; @@ -111,10 +113,10 @@ class AppLocalizationsFr extends AppLocalizations { 'Utilisez les couleurs de votre fond d\'écran'; @override - String get appearanceHistoryView => 'Historique Vue'; + String get appearanceHistoryView => 'Historique'; @override - String get appearanceHistoryViewList => ''; + String get appearanceHistoryViewList => 'Liste'; @override String get appearanceHistoryViewGrid => 'Grille'; @@ -127,26 +129,26 @@ class AppLocalizationsFr extends AppLocalizations { @override String get optionsPrimaryProviderSubtitle => - 'Service utilisé lors de la recherche par nom de piste.'; + 'Service permettant d\'effectuer une recherche par titre de morceau ou d\'album'; @override String optionsUsingExtension(String extensionName) { - return 'Utilisation de l\'extension: $extensionName'; + return 'Utilisation de l\'extension : $extensionName'; } @override - String get optionsDefaultSearchTab => 'Default Search Tab'; + String get optionsDefaultSearchTab => 'Onglet de recherche par défaut'; @override String get optionsDefaultSearchTabSubtitle => - 'Choose which tab opens first for new search results.'; + 'Choisissez l\'onglet qui s\'ouvre en premier pour les nouveaux résultats de recherche.'; @override String get optionsSwitchBack => 'Appuyez sur Deezer ou Spotify pour revenir à l\'extension'; @override - String get optionsAutoFallback => 'Auto Fallback'; + String get optionsAutoFallback => 'Récupération automatique'; @override String get optionsAutoFallbackSubtitle => @@ -157,132 +159,139 @@ class AppLocalizationsFr extends AppLocalizations { 'Utiliser des fournisseurs d\'extension'; @override - String get optionsUseExtensionProvidersOn => 'Extensions will be tried first'; + String get optionsUseExtensionProvidersOn => + 'Les extensions seront d\'abord essayées'; @override - String get optionsUseExtensionProvidersOff => 'Using built-in providers only'; + String get optionsUseExtensionProvidersOff => + 'Utilisation exclusive des fournisseurs intégrés'; @override - String get optionsEmbedLyrics => 'Embed Lyrics'; + String get optionsEmbedLyrics => 'Intégrer les paroles'; @override String get optionsEmbedLyricsSubtitle => - 'Embed synced lyrics into FLAC files'; + 'Enregistrez les paroles synchronisées avec vos morceaux téléchargés'; @override - String get optionsMaxQualityCover => 'Max Quality Cover'; + String get optionsMaxQualityCover => 'Pochette de qualité supérieure'; @override String get optionsMaxQualityCoverSubtitle => - 'Download highest resolution cover art'; + 'Télécharger la pochette en haute résolution'; @override String get optionsReplayGain => 'ReplayGain'; @override String get optionsReplayGainSubtitleOn => - 'Scan loudness and embed ReplayGain tags (EBU R128)'; + 'Analyser le niveau sonore et intégrer des balises ReplayGain (EBU R128)'; @override String get optionsReplayGainSubtitleOff => - 'Disabled: no loudness normalization tags'; + 'Désactivé : aucune balise de normalisation du volume'; @override - String get optionsArtistTagMode => 'Artist Tag Mode'; + String get optionsArtistTagMode => 'Mode « Artiste »'; @override String get optionsArtistTagModeDescription => - 'Choose how multiple artists are written into embedded tags.'; + 'Choisissez comment les noms de plusieurs artistes doivent apparaître dans les balises intégrées.'; @override - String get optionsArtistTagModeJoined => 'Single joined value'; + String get optionsArtistTagModeJoined => 'Valeur unique combinée'; @override String get optionsArtistTagModeJoinedSubtitle => - 'Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.'; + 'Indiquez une seule valeur ARTIST, par exemple « Artiste A, Artiste B », pour garantir une compatibilité maximale avec les lecteurs.'; @override - String get optionsArtistTagModeSplitVorbis => 'Split tags for FLAC/Opus'; + String get optionsArtistTagModeSplitVorbis => + 'Diviser les balises pour FLAC/Opus'; @override String get optionsArtistTagModeSplitVorbisSubtitle => - 'Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.'; + 'Créez une balise « artiste » par artiste pour les fichiers FLAC et Opus ; les fichiers MP3 et M4A restent regroupés.'; @override - String get optionsConcurrentDownloads => 'Concurrent Downloads'; + String get optionsConcurrentDownloads => 'Téléchargements simultanés'; @override - String get optionsConcurrentSequential => 'Sequential (1 at a time)'; + String get optionsConcurrentSequential => 'Séquentiel (1 à la fois)'; @override String optionsConcurrentParallel(int count) { - return '$count parallel downloads'; + return '$count téléchargements simultanés'; } @override String get optionsConcurrentWarning => - 'Parallel downloads may trigger rate limiting'; + 'Les téléchargements simultanés peuvent déclencher une limitation du débit'; @override - String get optionsExtensionStore => 'Extension Repo'; + String get optionsExtensionStore => 'Référentiel d\'extensions'; @override - String get optionsExtensionStoreSubtitle => 'Show Repo tab in navigation'; + String get optionsExtensionStoreSubtitle => + 'Afficher l\'onglet « Dépôt » dans le menu de navigation'; @override - String get optionsCheckUpdates => 'Check for Updates'; + String get optionsCheckUpdates => 'Vérifier les mises à jour'; @override String get optionsCheckUpdatesSubtitle => - 'Notify when new version is available'; + 'M\'avertir lorsqu\'une nouvelle version est disponible'; @override - String get optionsUpdateChannel => 'Update Channel'; + String get optionsUpdateChannel => 'Chaîne de mise à jour'; @override - String get optionsUpdateChannelStable => 'Stable releases only'; + String get optionsUpdateChannelStable => 'Uniquement les versions stables'; @override - String get optionsUpdateChannelPreview => 'Get preview releases'; + String get optionsUpdateChannelPreview => + 'Accédez aux versions préliminaires'; @override String get optionsUpdateChannelWarning => - 'Preview may contain bugs or incomplete features'; + 'La version préliminaire peut contenir des bogues ou des fonctionnalités incomplètes'; @override - String get optionsClearHistory => 'Clear Download History'; + String get optionsClearHistory => 'Effacer l\'historique des téléchargements'; @override String get optionsClearHistorySubtitle => - 'Remove all downloaded tracks from history'; + 'Supprimez tous les morceaux téléchargés de l\'historique'; @override - String get optionsDetailedLogging => 'Detailed Logging'; + String get optionsDetailedLogging => 'Journalisation détaillée'; @override - String get optionsDetailedLoggingOn => 'Detailed logs are being recorded'; + String get optionsDetailedLoggingOn => + 'Des journaux détaillés sont enregistrés'; @override - String get optionsDetailedLoggingOff => 'Enable for bug reports'; + String get optionsDetailedLoggingOff => 'Activer pour les rapports de bogues'; @override - String get optionsSpotifyCredentials => 'Spotify Credentials'; + String get optionsSpotifyCredentials => 'Identifiants Spotify'; @override String optionsSpotifyCredentialsConfigured(String clientId) { - return 'Client ID: $clientId...'; + return 'Identifiant client : $clientId...'; } @override - String get optionsSpotifyCredentialsRequired => 'Required - tap to configure'; + String get optionsSpotifyCredentialsRequired => + 'Obligatoire - appuyez pour configurer'; @override String get optionsSpotifyWarning => - 'Spotify requires your own API credentials. Get them free from developer.spotify.com'; + 'Spotify nécessite vos propres identifiants API. Vous pouvez les obtenir gratuitement sur developer.spotify.com'; @override String get optionsSpotifyDeprecationWarning => - 'Spotify search will be deprecated on March 3, 2026 due to Spotify API changes. Please switch to Deezer.'; + 'La fonction de recherche Spotify sera supprimée le 3 mars 2026 en raison de modifications apportées à l\'API Spotify. Veuillez passer à Deezer.'; @override String get extensionsTitle => 'Extensions'; @@ -304,7 +313,7 @@ class AppLocalizationsFr extends AppLocalizations { String get extensionsUninstall => 'Désinstaller'; @override - String get storeTitle => 'Extension Repo'; + String get storeTitle => 'Répertoire des extensions'; @override String get storeSearch => 'Recherche d\'extensions...'; @@ -319,7 +328,7 @@ class AppLocalizationsFr extends AppLocalizations { String get storeUpdate => 'Mettre à jour'; @override - String get aboutTitle => 'À propos de'; + String get aboutTitle => 'À propos'; @override String get aboutContributors => 'Contributeurs'; @@ -328,78 +337,82 @@ class AppLocalizationsFr extends AppLocalizations { String get aboutMobileDeveloper => 'Développeur de la version mobile'; @override - String get aboutOriginalCreator => 'Créateur de SpotiFLAC original'; + String get aboutOriginalCreator => + 'Créateur de la version originale de SpotiFLAC'; @override String get aboutLogoArtist => - 'The talented artist who created our beautiful app logo!'; + 'Le talentueux artiste qui a créé le magnifique logo de notre application !'; @override - String get aboutTranslators => 'Translators'; + String get aboutTranslators => 'Traducteurs'; @override - String get aboutSpecialThanks => 'Special Thanks'; + String get aboutSpecialThanks => 'Remerciements particuliers'; @override - String get aboutLinks => 'Links'; + String get aboutLinks => 'Liens'; @override - String get aboutMobileSource => 'Mobile source code'; + String get aboutMobileSource => 'Code source pour mobile'; @override - String get aboutPCSource => 'PC source code'; + String get aboutPCSource => 'Code source pour PC'; @override - String get aboutKeepAndroidOpen => 'Keep Android Open'; + String get aboutKeepAndroidOpen => 'Garder Android ouvert'; @override - String get aboutReportIssue => 'Report an issue'; + String get aboutReportIssue => 'Signaler un problème'; @override - String get aboutReportIssueSubtitle => 'Report any problems you encounter'; + String get aboutReportIssueSubtitle => + 'Signalez tout problème que vous rencontrez'; @override - String get aboutFeatureRequest => 'Feature request'; + String get aboutFeatureRequest => 'Demande de fonctionnalité'; @override - String get aboutFeatureRequestSubtitle => 'Suggest new features for the app'; + String get aboutFeatureRequestSubtitle => + 'Proposez de nouvelles fonctionnalités pour l\'application'; @override - String get aboutTelegramChannel => 'Telegram Channel'; + String get aboutTelegramChannel => 'Chaîne Telegram'; @override String get aboutTelegramChannelSubtitle => 'Annonces et mises à jour'; @override - String get aboutTelegramChat => 'Telegram Community'; + String get aboutTelegramChat => 'Communauté Telegram'; @override - String get aboutTelegramChatSubtitle => 'Chat with other users'; + String get aboutTelegramChatSubtitle => + 'Discutez avec d\'autres utilisateurs'; @override - String get aboutSocial => 'Social'; + String get aboutSocial => 'Réseaux sociaux'; @override - String get aboutApp => 'App'; + String get aboutApp => 'Application'; @override String get aboutVersion => 'Version'; @override String get aboutBinimumDesc => - 'The creator of QQDL & HiFi API. Without this API, Tidal downloads wouldn\'t exist!'; + 'Le créateur de QQDL et de l\'API HiFi. Sans cette API, les téléchargements depuis Tidal n\'existeraient pas !'; @override String get aboutSachinsenalDesc => - 'The original HiFi project creator. The foundation of Tidal integration!'; + 'Le créateur du projet HiFi original. La base de l\'intégration de Tidal !'; @override String get aboutSjdonadoDesc => - 'Creator of I Don\'t Have Spotify (IDHS). The fallback link resolver that saves the day!'; + 'Créateur de « I Don\'t Have Spotify » (IDHS). Le résolveur de liens de secours qui sauve la mise !'; @override String get aboutAppDescription => - 'Search music metadata, manage extensions, and organize your library.'; + 'Recherchez des métadonnées musicales, gérez les extensions et organisez votre bibliothèque.'; @override String get artistAlbums => 'Albums'; @@ -411,18 +424,18 @@ class AppLocalizationsFr extends AppLocalizations { String get artistCompilations => 'Compilations'; @override - String get artistPopular => 'Popular'; + String get artistPopular => 'Populaire'; @override String artistMonthlyListeners(String count) { - return '$count monthly listeners'; + return '$count auditeurs mensuels'; } @override String get trackMetadataService => 'Service'; @override - String get trackMetadataPlay => 'Jouer'; + String get trackMetadataPlay => 'Lire'; @override String get trackMetadataShare => 'Partager'; @@ -431,95 +444,98 @@ class AppLocalizationsFr extends AppLocalizations { String get trackMetadataDelete => 'Supprimer'; @override - String get setupGrantPermission => 'Grant Permission'; + String get setupGrantPermission => 'Accorder l\'autorisation'; @override - String get setupSkip => 'Skip for now'; + String get setupSkip => 'Ignorer pour le moment'; @override - String get setupStorageAccessRequired => 'Storage Access Required'; + String get setupStorageAccessRequired => 'Accès au stockage requis'; @override String get setupStorageAccessMessageAndroid11 => - 'Android 11+ requires \"All files access\" permission to save files to your chosen download folder.'; + 'Depuis Android 11, l\'autorisation « Accès à tous les fichiers » est requise pour enregistrer des fichiers dans le dossier de téléchargement de votre choix.'; @override - String get setupOpenSettings => 'Open Settings'; + String get setupOpenSettings => 'Ouvrir les paramètres'; @override String get setupPermissionDeniedMessage => - 'Permission denied. Please grant all permissions to continue.'; + 'Autorisation refusée. Veuillez accorder toutes les autorisations pour continuer.'; @override String setupPermissionRequired(String permissionType) { - return '$permissionType Permission Required'; + return 'Autorisation $permissionType requise'; } @override String setupPermissionRequiredMessage(String permissionType) { - return '$permissionType permission is required for the best experience. You can change this later in Settings.'; + return 'L\'autorisation $permissionType est requise pour profiter pleinement de l\'application. Vous pourrez modifier ce paramètre ultérieurement dans les Paramètres.'; } @override - String get setupUseDefaultFolder => 'Use Default Folder?'; + String get setupUseDefaultFolder => 'Utiliser le dossier par défaut ?'; @override String get setupNoFolderSelected => - 'No folder selected. Would you like to use the default Music folder?'; + 'Aucun dossier n\'est sélectionné. Souhaitez-vous utiliser le dossier Musique par défaut ?'; @override - String get setupUseDefault => 'Use Default'; + String get setupUseDefault => 'Utiliser les paramètres par défaut'; @override - String get setupDownloadLocationTitle => 'Download Location'; + String get setupDownloadLocationTitle => 'Emplacement de téléchargement'; @override String get setupDownloadLocationIosMessage => - 'On iOS, downloads are saved to the app\'s Documents folder. You can access them via the Files app.'; + 'Sous iOS, les fichiers téléchargés sont enregistrés dans le dossier « Documents » de l\'application. Vous pouvez y accéder via l\'application Fichiers.'; @override - String get setupAppDocumentsFolder => 'App Documents Folder'; + String get setupAppDocumentsFolder => + 'Dossier « Documents » de l\'application'; @override String get setupAppDocumentsFolderSubtitle => - 'Recommended - accessible via Files app'; + 'Recommandé - accessible via l\'application Fichiers'; @override - String get setupChooseFromFiles => 'Choose from Files'; + String get setupChooseFromFiles => 'Sélectionnez un fichier'; @override - String get setupChooseFromFilesSubtitle => 'Select iCloud or other location'; + String get setupChooseFromFilesSubtitle => + 'Sélectionnez iCloud ou un autre emplacement'; @override String get setupIosEmptyFolderWarning => - 'iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.'; + 'Limitation iOS : les dossiers vides ne peuvent pas être sélectionnés. Choisissez un dossier contenant au moins un fichier.'; @override String get setupIcloudNotSupported => - 'iCloud Drive is not supported. Please use the app Documents folder.'; + 'iCloud Drive n\'est pas pris en charge. Veuillez utiliser le dossier « Documents » de l\'application.'; @override - String get setupDownloadInFlac => 'Download Spotify tracks in FLAC'; + String get setupDownloadInFlac => + 'Télécharger des morceaux Spotify au format FLAC'; @override - String get setupStorageGranted => 'Storage Permission Granted!'; + String get setupStorageGranted => 'Autorisation de stockage accordée !'; @override - String get setupStorageRequired => 'Storage Permission Required'; + String get setupStorageRequired => 'Autorisation de stockage requise'; @override String get setupStorageDescription => - 'SpotiFLAC needs storage permission to save your downloaded music files.'; + 'SpotiFLAC a besoin d\'une autorisation d\'accès au stockage pour enregistrer vos fichiers musicaux téléchargés.'; @override String get setupNotificationGranted => - 'Autorisation de notifications accordée!'; + 'Autorisation de notification accordée !'; @override String get setupNotificationEnable => 'Activer les notifications'; @override - String get setupFolderChoose => 'Choisissez le dossier pour télécharger'; + String get setupFolderChoose => 'Choisissez le dossier de téléchargement'; @override String get setupFolderDescription => @@ -533,7 +549,7 @@ class AppLocalizationsFr extends AppLocalizations { @override String get setupNotificationBackgroundDescription => - 'Get notified about download progress and completion. This helps you track downloads when the app is in background.'; + 'Recevez des notifications sur la progression et la fin du téléchargement. Cela vous permet de suivre les téléchargements lorsque l\'application est en arrière-plan.'; @override String get setupSkipForNow => 'Ignorer pour le moment'; @@ -546,17 +562,17 @@ class AppLocalizationsFr extends AppLocalizations { @override String get setupAllowAccessToManageFiles => - 'Veuillez activer \"Autoriser l\'accès à tous les fichiers\" sur l\'écran suivant.'; + 'Veuillez cocher la case « Autoriser l\'accès pour gérer tous les fichiers » sur l\'écran suivant.'; @override - String get setupLanguageTitle => 'Choose Language'; + String get setupLanguageTitle => 'Choisir la langue'; @override String get setupLanguageDescription => - 'Select your preferred language for the app. You can change this later in Settings.'; + 'Sélectionnez la langue de votre choix pour l\'application. Vous pourrez la modifier ultérieurement dans les Paramètres.'; @override - String get setupLanguageSystemDefault => 'System Default'; + String get setupLanguageSystemDefault => 'Paramètres par défaut du système'; @override String get dialogCancel => 'Annuler'; @@ -571,22 +587,22 @@ class AppLocalizationsFr extends AppLocalizations { String get dialogRetry => 'Réessayer'; @override - String get dialogClear => 'Clear'; + String get dialogClear => 'Effacer'; @override - String get dialogDone => 'Done'; + String get dialogDone => 'C\'est fait'; @override - String get dialogImport => 'Import'; + String get dialogImport => 'Importer'; @override String get dialogDownload => 'Télécharger'; @override - String get dialogDiscard => 'Discard'; + String get dialogDiscard => 'Ignorer'; @override - String get dialogRemove => 'Remove'; + String get dialogRemove => 'Supprimer'; @override String get dialogUninstall => 'Désinstaller'; @@ -596,219 +612,223 @@ class AppLocalizationsFr extends AppLocalizations { @override String get dialogUnsavedChanges => - 'You have unsaved changes. Do you want to discard them?'; + 'Vous avez des modifications non enregistrées. Voulez-vous les ignorer ?'; @override - String get dialogClearAll => 'Clear All'; + String get dialogClearAll => 'Tout effacer'; @override - String get dialogRemoveExtension => 'Remove Extension'; + String get dialogRemoveExtension => 'Supprimer l\'extension'; @override String get dialogRemoveExtensionMessage => - 'Are you sure you want to remove this extension? This cannot be undone.'; + 'Êtes-vous sûr de vouloir supprimer cette extension ? Cette action ne peut pas être annulée.'; @override - String get dialogUninstallExtension => 'Uninstall Extension?'; + String get dialogUninstallExtension => 'Supprimer l\'extension ?'; @override String dialogUninstallExtensionMessage(String extensionName) { - return 'Are you sure you want to remove $extensionName?'; + return 'Êtes-vous sûr de vouloir supprimer $extensionName ?'; } @override - String get dialogClearHistoryTitle => 'Clear History'; + String get dialogClearHistoryTitle => 'Effacer l\'historique'; @override String get dialogClearHistoryMessage => - 'Are you sure you want to clear all download history? This cannot be undone.'; + 'Êtes-vous sûr de vouloir effacer tout l\'historique des téléchargements ? Cette action ne peut pas être annulée.'; @override - String get dialogDeleteSelectedTitle => 'Delete Selected'; + String get dialogDeleteSelectedTitle => 'Supprimer la sélection'; @override String dialogDeleteSelectedMessage(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'titres', + one: 'titre', ); - return 'Delete $count $_temp0 from history?\n\nThis will also delete the files from storage.'; + return 'Supprimer $count $_temp0 de l\'historique ?\n\nCela supprimera également les fichiers du stockage.'; } @override - String get dialogImportPlaylistTitle => 'Import Playlist'; + String get dialogImportPlaylistTitle => 'Importer une playlist'; @override String dialogImportPlaylistMessage(int count) { - return 'Found $count tracks in CSV. Add them to download queue?'; + return '$count pistes ont été trouvées dans le fichier CSV. Voulez-vous les ajouter à la file d\'attente de téléchargement ?'; } @override String csvImportTracks(int count) { - return '$count tracks from CSV'; + return '$count pistes issues d\'un fichier CSV'; } @override String snackbarAddedToQueue(String trackName) { - return 'Added \"$trackName\" to queue'; + return 'Ajout de « $trackName » à la file d\'attente'; } @override String snackbarAddedTracksToQueue(int count) { - return 'Added $count tracks to queue'; + return '$count titres ont été ajoutés à la file d\'attente'; } @override String snackbarAlreadyDownloaded(String trackName) { - return '\"$trackName\" already downloaded'; + return '« $trackName » a déjà été téléchargé'; } @override String snackbarAlreadyInLibrary(String trackName) { - return '\"$trackName\" already exists in your library'; + return '« $trackName » existe déjà dans votre bibliothèque'; } @override - String get snackbarHistoryCleared => 'History cleared'; + String get snackbarHistoryCleared => 'Historique effacé'; @override - String get snackbarCredentialsSaved => 'Credentials saved'; + String get snackbarCredentialsSaved => 'Identifiants enregistrés'; @override - String get snackbarCredentialsCleared => 'Credentials cleared'; + String get snackbarCredentialsCleared => 'Identifiants validés'; @override String snackbarDeletedTracks(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'titres', + one: 'titre', ); - return 'Deleted $count $_temp0'; + return 'Supprimé $count $_temp0'; } @override String snackbarCannotOpenFile(String error) { - return 'Cannot open file: $error'; + return 'Impossible d\'ouvrir le fichier : $error'; } @override - String get snackbarFillAllFields => 'Please fill all fields'; + String get snackbarFillAllFields => 'Veuillez remplir tous les champs'; @override - String get snackbarViewQueue => 'View Queue'; + String get snackbarViewQueue => 'Afficher la file d\'attente'; @override String snackbarUrlCopied(String platform) { - return '$platform URL copied to clipboard'; + return 'L\'URL de $platform a été copiée dans le presse-papiers'; } @override - String get snackbarFileNotFound => 'File not found'; + String get snackbarFileNotFound => 'Fichier introuvable'; @override - String get snackbarSelectExtFile => 'Please select a .spotiflac-ext file'; + String get snackbarSelectExtFile => + 'Veuillez sélectionner un fichier .spotiflac-ext'; @override - String get snackbarProviderPrioritySaved => 'Provider priority saved'; + String get snackbarProviderPrioritySaved => + 'Priorité du fournisseur enregistrée'; @override String get snackbarMetadataProviderSaved => - 'Metadata provider priority saved'; + 'Priorité du fournisseur de métadonnées enregistrée'; @override String snackbarExtensionInstalled(String extensionName) { - return '$extensionName installed.'; + return '$extensionName est installée.'; } @override String snackbarExtensionUpdated(String extensionName) { - return '$extensionName updated.'; + return '$extensionName a été mis à jour.'; } @override - String get snackbarFailedToInstall => 'Failed to install extension'; + String get snackbarFailedToInstall => + 'Échec de l\'installation de l\'extension'; @override - String get snackbarFailedToUpdate => 'Failed to update extension'; + String get snackbarFailedToUpdate => + 'Échec de la mise à jour de l\'extension'; @override - String get errorRateLimited => 'Rate Limited'; + String get errorRateLimited => 'Débit limité'; @override String get errorRateLimitedMessage => - 'Too many requests. Please wait a moment before searching again.'; + 'Trop de requêtes. Veuillez patienter quelques instants avant de relancer la recherche.'; @override - String get errorNoTracksFound => 'No tracks found'; + String get errorNoTracksFound => 'Aucun titre trouvé'; @override - String get searchEmptyResultSubtitle => 'Try another keyword'; + String get searchEmptyResultSubtitle => 'Essayez un autre mot-clé'; @override - String get errorUrlNotRecognized => 'Link not recognized'; + String get errorUrlNotRecognized => 'Lien non reconnu'; @override String get errorUrlNotRecognizedMessage => - 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; + 'Ce lien n\'est pas pris en charge. Vérifiez que l\'URL est correcte et qu\'une extension compatible est installée.'; @override String get errorUrlFetchFailed => - 'Failed to load content from this link. Please try again.'; + 'Impossible de charger le contenu de ce lien. Veuillez réessayer.'; @override String errorMissingExtensionSource(String item) { - return 'Cannot load $item: missing extension source'; + return 'Impossible de charger $item : source de l\'extension manquante'; } @override String get actionPause => 'Pause'; @override - String get actionResume => 'Resume'; + String get actionResume => 'Resumer'; @override - String get actionCancel => 'Cancel'; + String get actionCancel => 'Annuler'; @override - String get actionSelectAll => 'Select All'; + String get actionSelectAll => 'Tout sélectionner'; @override - String get actionDeselect => 'Deselect'; + String get actionDeselect => 'Désélectionner'; @override - String get actionRemoveCredentials => 'Remove Credentials'; + String get actionRemoveCredentials => 'Supprimer les identifiants'; @override - String get actionSaveCredentials => 'Save Credentials'; + String get actionSaveCredentials => 'Enregistrer les identifiants'; @override String selectionSelected(int count) { - return '$count selected'; + return '$count sélectionnés'; } @override - String get selectionAllSelected => 'All tracks selected'; + String get selectionAllSelected => 'Toutes les pistes sélectionnées'; @override - String get selectionSelectToDelete => 'Select tracks to delete'; + String get selectionSelectToDelete => 'Sélectionnez les titres à supprimer'; @override String progressFetchingMetadata(int current, int total) { - return 'Fetching metadata... $current/$total'; + return 'Récupération des métadonnées... $current/$total'; } @override - String get progressReadingCsv => 'Reading CSV...'; + String get progressReadingCsv => 'Lecture du fichier CSV...'; @override - String get searchSongs => 'Songs'; + String get searchSongs => 'Titres'; @override - String get searchArtists => 'Artists'; + String get searchArtists => 'Artistes'; @override String get searchAlbums => 'Albums'; @@ -817,333 +837,345 @@ class AppLocalizationsFr extends AppLocalizations { String get searchPlaylists => 'Playlists'; @override - String get searchSortTitle => 'Sort Results'; + String get searchSortTitle => 'Trier les résultats'; @override - String get searchSortDefault => 'Default'; + String get searchSortDefault => 'Par défaut'; @override - String get searchSortTitleAZ => 'Title (A-Z)'; + String get searchSortTitleAZ => 'Titre (A-Z)'; @override - String get searchSortTitleZA => 'Title (Z-A)'; + String get searchSortTitleZA => 'Titre (Z-A)'; @override - String get searchSortArtistAZ => 'Artist (A-Z)'; + String get searchSortArtistAZ => 'Artiste (A-Z)'; @override - String get searchSortArtistZA => 'Artist (Z-A)'; + String get searchSortArtistZA => 'Artiste (Z-A)'; @override - String get searchSortDurationShort => 'Duration (Shortest)'; + String get searchSortDurationShort => 'Durée (la plus courte)'; @override - String get searchSortDurationLong => 'Duration (Longest)'; + String get searchSortDurationLong => 'Durée (la plus longue)'; @override - String get searchSortDateOldest => 'Release Date (Oldest)'; + String get searchSortDateOldest => 'Date de sortie (la plus ancienne)'; @override - String get searchSortDateNewest => 'Release Date (Newest)'; + String get searchSortDateNewest => 'Date de sortie (la plus récente)'; @override - String get tooltipPlay => 'Play'; + String get tooltipPlay => 'Lecture'; @override - String get filenameFormat => 'Filename Format'; + String get filenameFormat => 'Format des noms de fichiers'; @override - String get filenameShowAdvancedTags => 'Show advanced tags'; + String get filenameShowAdvancedTags => 'Afficher les balises avancées'; @override String get filenameShowAdvancedTagsDescription => - 'Enable formatted tags for track padding and date patterns'; + 'Activer les balises de formatage pour le remplissage des pistes et les formats de date'; @override - String get folderOrganizationNone => 'No organization'; + String get folderOrganizationNone => 'Aucune organisation'; @override - String get folderOrganizationByPlaylist => 'By Playlist'; + String get folderOrganizationByPlaylist => 'Par playlist'; @override String get folderOrganizationByPlaylistSubtitle => - 'Separate folder for each playlist'; + 'Un dossier distinct pour chaque playlist'; @override - String get folderOrganizationByArtist => 'By Artist'; + String get folderOrganizationByArtist => 'Par artiste'; @override - String get folderOrganizationByAlbum => 'By Album'; + String get folderOrganizationByAlbum => 'Par album'; @override - String get folderOrganizationByArtistAlbum => 'Artist/Album'; + String get folderOrganizationByArtistAlbum => 'Artiste/Album'; @override String get folderOrganizationDescription => - 'Organize downloaded files into folders'; + 'Classer les fichiers téléchargés dans des dossiers'; @override - String get folderOrganizationNoneSubtitle => 'All files in download folder'; + String get folderOrganizationNoneSubtitle => + 'Tous les fichiers du dossier « Téléchargements »'; @override String get folderOrganizationByArtistSubtitle => - 'Separate folder for each artist'; + 'Un dossier distinct pour chaque artiste'; @override String get folderOrganizationByAlbumSubtitle => - 'Separate folder for each album'; + 'Un dossier distinct pour chaque album'; @override String get folderOrganizationByArtistAlbumSubtitle => - 'Nested folders for artist and album'; + 'Dossiers imbriqués pour les artistes et les albums'; @override - String get updateAvailable => 'Update Available'; + String get updateAvailable => 'Mise à jour disponible'; @override - String get updateLater => 'Later'; + String get updateLater => 'Plus tard'; @override - String get updateStartingDownload => 'Starting download...'; + String get updateStartingDownload => 'Début du téléchargement...'; @override - String get updateDownloadFailed => 'Download failed'; + String get updateDownloadFailed => 'Échec du téléchargement'; @override - String get updateFailedMessage => 'Failed to download update'; + String get updateFailedMessage => 'Échec du téléchargement de la mise à jour'; @override - String get updateNewVersionReady => 'A new version is ready'; + String get updateNewVersionReady => 'Une nouvelle version est disponible'; @override - String get updateCurrent => 'Current'; + String get updateCurrent => 'Actuel'; @override - String get updateNew => 'New'; + String get updateNew => 'Nouveau'; @override - String get updateDownloading => 'Downloading...'; + String get updateDownloading => 'Téléchargement en cours...'; @override - String get updateWhatsNew => 'What\'s New'; + String get updateWhatsNew => 'Quoi de neuf ?'; @override - String get updateDownloadInstall => 'Download & Install'; + String get updateDownloadInstall => 'Télécharger & Installer'; @override - String get updateDontRemind => 'Don\'t remind'; + String get updateDontRemind => 'Ne plus me le rappeler'; @override - String get providerPriorityTitle => 'Provider Priority'; + String get providerPriorityTitle => 'Priorité accordée aux prestataires'; @override String get providerPriorityDescription => - 'Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.'; + 'Faites glisser pour réorganiser les fournisseurs de téléchargement. L\'application testera les fournisseurs dans l\'ordre indiqué, de haut en bas, lors du téléchargement des morceaux.'; @override String get providerPriorityInfo => - 'If a track is not available on the first provider, the app will automatically try the next one.'; + 'Si un morceau n\'est pas disponible chez le premier fournisseur, l\'application essaiera automatiquement le suivant.'; @override - String get providerPriorityFallbackExtensionsTitle => 'Extension Fallback'; + String get providerPriorityFallbackExtensionsTitle => + 'Solution de secours pour les extensions'; @override String get providerPriorityFallbackExtensionsDescription => - 'Choose which installed download extensions can be used during automatic fallback.'; + 'Sélectionnez les extensions de téléchargement installées qui peuvent être utilisées lors du basculement automatique.'; @override String get providerPriorityFallbackExtensionsHint => - 'Only enabled extensions with download-provider capability are listed here.'; + 'Seules les extensions activées disposant de la fonctionnalité « fournisseur de téléchargement » sont répertoriées ici.'; @override - String get providerBuiltIn => 'Built-in'; + String get providerBuiltIn => 'Intégré'; @override String get providerExtension => 'Extension'; @override - String get metadataProviderPriorityTitle => 'Metadata Priority'; + String get metadataProviderPriorityTitle => 'Priorité des métadonnées'; @override String get metadataProviderPriorityDescription => - 'Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.'; + 'Faites glisser pour réorganiser les fournisseurs de métadonnées. L\'application testera les fournisseurs dans l\'ordre de haut en bas lors de la recherche de morceaux et de la récupération des métadonnées.'; @override String get metadataProviderPriorityInfo => - 'Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.'; + 'Deezer n\'impose aucune limite de débit et est recommandé comme service principal. Spotify peut limiter le débit après un certain nombre de requêtes.'; @override - String get metadataNoRateLimits => 'No rate limits'; + String get metadataNoRateLimits => 'Pas de limite de débit'; @override - String get metadataMayRateLimit => 'May rate limit'; + String get metadataMayRateLimit => 'Limite de taux de métadonnées'; @override - String get logTitle => 'Logs'; + String get logTitle => 'Journaux'; @override - String get logCopied => 'Logs copied to clipboard'; + String get logCopied => 'Journaux copiés dans le presse-papiers'; @override - String get logSearchHint => 'Search logs...'; + String get logSearchHint => 'Recherche dans les journaux...'; @override - String get logFilterLevel => 'Level'; + String get logFilterLevel => 'Niveau'; @override - String get logFilterSection => 'Filter'; + String get logFilterSection => 'Filtre'; @override - String get logShareLogs => 'Share logs'; + String get logShareLogs => 'Partager les journaux'; @override - String get logClearLogs => 'Clear logs'; + String get logClearLogs => 'Effacer les journaux'; @override - String get logClearLogsTitle => 'Clear Logs'; + String get logClearLogsTitle => 'Effacer les journaux'; @override - String get logClearLogsMessage => 'Are you sure you want to clear all logs?'; + String get logClearLogsMessage => + 'Êtes-vous sûr de vouloir effacer tous les journaux ?'; @override - String get logFilterBySeverity => 'Filter logs by severity'; + String get logFilterBySeverity => + 'Filtrer les journaux par niveau de gravité'; @override - String get logNoLogsYet => 'No logs yet'; + String get logNoLogsYet => 'Pas encore de journal'; @override - String get logNoLogsYetSubtitle => 'Logs will appear here as you use the app'; + String get logNoLogsYetSubtitle => + 'Les journaux s\'afficheront ici au fur et à mesure que vous utiliserez l\'application'; @override String logEntriesFiltered(int count) { - return 'Entries ($count filtered)'; + return 'Entrées ($count résultats filtrés)'; } @override String logEntries(int count) { - return 'Entries ($count)'; + return 'Entrées ($count)'; } @override - String get credentialsTitle => 'Spotify Credentials'; + String get credentialsTitle => 'Identifiants Spotify'; @override String get credentialsDescription => - 'Enter your Client ID and Secret to use your own Spotify application quota.'; + 'Saisissez votre identifiant client et votre clé secrète pour utiliser votre propre quota d\'application Spotify.'; @override - String get credentialsClientId => 'Client ID'; + String get credentialsClientId => 'Identifiant client'; @override - String get credentialsClientIdHint => 'Paste Client ID'; + String get credentialsClientIdHint => 'Coller l\'identifiant client'; @override - String get credentialsClientSecret => 'Client Secret'; + String get credentialsClientSecret => 'Clé secrète du client'; @override - String get credentialsClientSecretHint => 'Paste Client Secret'; + String get credentialsClientSecretHint => 'Coller la clé secrète du client'; @override String get channelStable => 'Stable'; @override - String get channelPreview => 'Preview'; + String get channelPreview => 'Aperçu'; @override - String get sectionSearchSource => 'Search Source'; + String get sectionSearchSource => 'Rechercher dans la source'; @override - String get sectionDownload => 'Download'; + String get sectionDownload => 'Télécharger'; @override - String get sectionPerformance => 'Performance'; + String get sectionPerformance => 'Performances'; @override - String get sectionApp => 'App'; + String get sectionApp => 'Application'; @override - String get sectionData => 'Data'; + String get sectionData => 'Données'; @override - String get sectionDebug => 'Debug'; + String get sectionDebug => 'Débogage'; @override String get sectionService => 'Service'; @override - String get sectionAudioQuality => 'Audio Quality'; + String get sectionAudioQuality => 'Qualité audio'; @override - String get sectionFileSettings => 'File Settings'; + String get sectionFileSettings => 'Paramètres du fichier'; @override - String get sectionLyrics => 'Lyrics'; + String get sectionLyrics => 'Paroles'; @override - String get lyricsMode => 'Lyrics Mode'; + String get lyricsMode => 'Mode Paroles'; @override String get lyricsModeDescription => - 'Choose how lyrics are saved with your downloads'; + 'Choisissez comment les paroles sont enregistrées avec vos téléchargements'; @override - String get lyricsModeEmbed => 'Embed in file'; + String get lyricsModeEmbed => 'Intégrer dans un fichier'; @override - String get lyricsModeEmbedSubtitle => 'Lyrics stored inside FLAC metadata'; + String get lyricsModeEmbedSubtitle => + 'Paroles enregistrées dans les métadonnées FLAC'; @override - String get lyricsModeExternal => 'External .lrc file'; + String get lyricsModeExternal => 'Fichier .lrc externe'; @override String get lyricsModeExternalSubtitle => - 'Separate .lrc file for players like Samsung Music'; + 'Fichier .lrc distinct pour les lecteurs tels que Samsung Music'; @override - String get lyricsModeBoth => 'Both'; + String get lyricsModeBoth => 'Les deux'; @override - String get lyricsModeBothSubtitle => 'Embed and save .lrc file'; + String get lyricsModeBothSubtitle => + 'Intégrer et enregistrer le fichier .lrc'; @override - String get sectionColor => 'Color'; + String get sectionColor => 'Couleur'; @override - String get sectionTheme => 'Theme'; + String get sectionTheme => 'Thème'; @override - String get sectionLayout => 'Layout'; + String get sectionLayout => 'Mise en page'; @override - String get sectionLanguage => 'Language'; + String get sectionLanguage => 'Langue'; @override - String get appearanceLanguage => 'App Language'; + String get appearanceLanguage => 'Langue de l\'application'; @override - String get settingsAppearanceSubtitle => 'Theme, colors, display'; + String get settingsAppearanceSubtitle => 'Thème, couleurs, affichage'; @override - String get settingsDownloadSubtitle => 'Service, quality, filename format'; + String get settingsDownloadSubtitle => + 'Service, qualité, solution de secours'; @override - String get settingsOptionsSubtitle => 'Fallback, lyrics, cover art, updates'; + String get settingsOptionsSubtitle => + 'Fichier de secours, métadonnées, paroles, pochette'; @override - String get settingsExtensionsSubtitle => 'Manage download providers'; + String get settingsExtensionsSubtitle => + 'Gérez les fournisseurs de téléchargement'; @override - String get settingsLogsSubtitle => 'View app logs for debugging'; + String get settingsLogsSubtitle => + 'Consulter les journaux de l\'application pour le débogage'; @override - String get loadingSharedLink => 'Loading shared link...'; + String get loadingSharedLink => 'Chargement du lien partagé...'; @override - String get pressBackAgainToExit => 'Press back again to exit'; + String get pressBackAgainToExit => + 'Appuyez de nouveau sur retour pour quitter'; @override String downloadAllCount(int count) { - return 'Download All ($count)'; + return 'Tout télécharger ($count)'; } @override @@ -1151,65 +1183,65 @@ class AppLocalizationsFr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count tracks', - one: '1 track', + other: '$count titres', + one: '1 titre', ); return '$_temp0'; } @override - String get trackCopyFilePath => 'Copy file path'; + String get trackCopyFilePath => 'Copier le chemin d\'accès au fichier'; @override - String get trackRemoveFromDevice => 'Remove from device'; + String get trackRemoveFromDevice => 'Supprimer de l\'appareil'; @override - String get trackLoadLyrics => 'Load Lyrics'; + String get trackLoadLyrics => 'Charger les paroles'; @override - String get trackMetadata => 'Metadata'; + String get trackMetadata => 'Métadonnées'; @override - String get trackFileInfo => 'File Info'; + String get trackFileInfo => 'Informations sur le fichier'; @override - String get trackLyrics => 'Lyrics'; + String get trackLyrics => 'Paroles'; @override - String get trackFileNotFound => 'File not found'; + String get trackFileNotFound => 'Fichier introuvable'; @override - String get trackOpenInDeezer => 'Open in Deezer'; + String get trackOpenInDeezer => 'Ouvrir dans Deezer'; @override - String get trackOpenInSpotify => 'Open in Spotify'; + String get trackOpenInSpotify => 'Ouvrir dans Spotify'; @override - String get trackTrackName => 'Track name'; + String get trackTrackName => 'Nom de la piste'; @override - String get trackArtist => 'Artist'; + String get trackArtist => 'Artiste'; @override - String get trackAlbumArtist => 'Album artist'; + String get trackAlbumArtist => 'Artiste de l\'album'; @override String get trackAlbum => 'Album'; @override - String get trackTrackNumber => 'Track number'; + String get trackTrackNumber => 'Numéro de piste'; @override - String get trackDiscNumber => 'Disc number'; + String get trackDiscNumber => 'Numéro de disque'; @override - String get trackDuration => 'Duration'; + String get trackDuration => 'Durée'; @override - String get trackAudioQuality => 'Audio quality'; + String get trackAudioQuality => 'Qualité audio'; @override - String get trackReleaseDate => 'Release date'; + String get trackReleaseDate => 'Date de sortie'; @override String get trackGenre => 'Genre'; @@ -1218,710 +1250,734 @@ class AppLocalizationsFr extends AppLocalizations { String get trackLabel => 'Label'; @override - String get trackCopyright => 'Copyright'; + String get trackCopyright => 'Droits d\'auteur'; @override - String get trackDownloaded => 'Downloaded'; + String get trackDownloaded => 'Téléchargé'; @override - String get trackCopyLyrics => 'Copy lyrics'; + String get trackCopyLyrics => 'Copier les paroles'; @override String trackLyricsSource(String source) { - return 'Source: $source'; + return 'Source : $source'; } @override - String get trackLyricsNotAvailable => 'Lyrics not available for this track'; + String get trackLyricsNotAvailable => + 'Les paroles de ce morceau ne sont pas disponibles'; @override - String get trackLyricsNotInFile => 'No lyrics found in this file'; + String get trackLyricsNotInFile => + 'Aucune parole n\'a été trouvée dans ce fichier'; @override - String get trackFetchOnlineLyrics => 'Fetch from Online'; + String get trackFetchOnlineLyrics => 'Télécharger depuis Internet'; @override - String get trackLyricsTimeout => 'Request timed out. Try again later.'; + String get trackLyricsTimeout => + 'La requête a expiré. Veuillez réessayer plus tard.'; @override - String get trackLyricsLoadFailed => 'Failed to load lyrics'; + String get trackLyricsLoadFailed => 'Impossible de charger les paroles'; @override - String get trackEmbedLyrics => 'Embed Lyrics'; + String get trackEmbedLyrics => 'Intégrer les paroles'; @override - String get trackLyricsEmbedded => 'Lyrics embedded successfully'; + String get trackLyricsEmbedded => 'Les paroles ont été intégrées avec succès'; @override - String get trackInstrumental => 'Instrumental track'; + String get trackInstrumental => 'Morceau instrumental'; @override - String get trackCopiedToClipboard => 'Copied to clipboard'; + String get trackCopiedToClipboard => 'Copié dans le presse-papiers'; @override - String get trackDeleteConfirmTitle => 'Remove from device?'; + String get trackDeleteConfirmTitle => 'Supprimer de l\'appareil ?'; @override String get trackDeleteConfirmMessage => - 'This will permanently delete the downloaded file and remove it from your history.'; + 'Cela supprimera définitivement le fichier téléchargé et l\'effacera de votre historique.'; @override - String get dateToday => 'Today'; + String get dateToday => 'Aujourd\'hui'; @override - String get dateYesterday => 'Yesterday'; + String get dateYesterday => 'Hier'; @override String dateDaysAgo(int count) { - return '$count days ago'; + return 'Il y a $count jours'; } @override String dateWeeksAgo(int count) { - return '$count weeks ago'; + return 'Il y a $count semaines'; } @override String dateMonthsAgo(int count) { - return '$count months ago'; + return 'Il y a $count mois'; } @override - String get storeFilterAll => 'All'; + String get storeFilterAll => 'Tout'; @override - String get storeFilterMetadata => 'Metadata'; + String get storeFilterMetadata => 'Métadonnées'; @override - String get storeFilterDownload => 'Download'; + String get storeFilterDownload => 'Télécharger'; @override - String get storeFilterUtility => 'Utility'; + String get storeFilterUtility => 'Utilitaire'; @override - String get storeFilterLyrics => 'Lyrics'; + String get storeFilterLyrics => 'Paroles'; @override - String get storeFilterIntegration => 'Integration'; + String get storeFilterIntegration => 'Intégration'; @override - String get storeClearFilters => 'Clear filters'; + String get storeClearFilters => 'Effacer les filtres'; @override - String get storeAddRepoTitle => 'Add Extension Repository'; + String get storeAddRepoTitle => 'Ajouter un dépôt d\'extensions'; @override String get storeAddRepoDescription => - 'Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.'; + 'Saisissez l\'URL d\'un dépôt GitHub contenant un fichier registry.json pour parcourir et installer des extensions.'; @override - String get storeRepoUrlLabel => 'Repository URL'; + String get storeRepoUrlLabel => 'URL du dépôt'; @override String get storeRepoUrlHint => 'https://github.com/user/repo'; @override String get storeRepoUrlHelper => - 'e.g. https://github.com/user/extensions-repo'; + 'par exemple : https://github.com/user/extensions-repo'; @override - String get storeAddRepoButton => 'Add Repository'; + String get storeAddRepoButton => 'Ajouter un dépôt'; @override - String get storeChangeRepoTooltip => 'Change repository'; + String get storeChangeRepoTooltip => 'Changer de dépôt'; @override - String get storeRepoDialogTitle => 'Extension Repository'; + String get storeRepoDialogTitle => 'Répertoire des extensions'; @override - String get storeRepoDialogCurrent => 'Current repository:'; + String get storeRepoDialogCurrent => 'Dépôt actuel :'; @override - String get storeNewRepoUrlLabel => 'New Repository URL'; + String get storeNewRepoUrlLabel => 'Nouvelle URL du dépôt'; @override - String get storeLoadError => 'Failed to load repository'; + String get storeLoadError => 'Échec du chargement du dépôt'; @override - String get storeEmptyNoExtensions => 'No extensions available'; + String get storeEmptyNoExtensions => 'Aucune extension disponible'; @override - String get storeEmptyNoResults => 'No extensions found'; + String get storeEmptyNoResults => 'Aucune extension trouvée'; @override - String get extensionDefaultProvider => 'Default (Deezer)'; + String get extensionDefaultProvider => 'Par défaut (Deezer)'; @override - String get extensionDefaultProviderSubtitle => 'Use built-in search'; + String get extensionDefaultProviderSubtitle => + 'Utiliser la fonction de recherche intégrée'; @override - String get extensionAuthor => 'Author'; + String get extensionAuthor => 'Auteur'; @override String get extensionId => 'ID'; @override - String get extensionError => 'Error'; + String get extensionError => 'Erreur'; @override - String get extensionCapabilities => 'Capabilities'; + String get extensionCapabilities => 'Fonctionnalités'; @override - String get extensionMetadataProvider => 'Metadata Provider'; + String get extensionMetadataProvider => 'Fournisseur de métadonnées'; @override - String get extensionDownloadProvider => 'Download Provider'; + String get extensionDownloadProvider => 'Fournisseur de téléchargement'; @override - String get extensionLyricsProvider => 'Lyrics Provider'; + String get extensionLyricsProvider => 'Fournisseur de paroles'; @override - String get extensionUrlHandler => 'URL Handler'; + String get extensionUrlHandler => 'Gestionnaire d\'URL'; @override - String get extensionQualityOptions => 'Quality Options'; + String get extensionQualityOptions => 'Options de qualité'; @override - String get extensionPostProcessingHooks => 'Post-Processing Hooks'; + String get extensionPostProcessingHooks => 'Crochets de post-traitement'; @override - String get extensionPermissions => 'Permissions'; + String get extensionPermissions => 'Autorisations'; @override - String get extensionSettings => 'Settings'; + String get extensionSettings => 'Paramètres'; @override - String get extensionRemoveButton => 'Remove Extension'; + String get extensionRemoveButton => 'Supprimer l\'extension'; @override - String get extensionUpdated => 'Updated'; + String get extensionUpdated => 'Mis à jour'; @override - String get extensionMinAppVersion => 'Min App Version'; + String get extensionMinAppVersion => 'Version minimale de l\'application'; @override - String get extensionCustomTrackMatching => 'Custom Track Matching'; + String get extensionCustomTrackMatching => + 'Correspondance personnalisée des pistes'; @override - String get extensionPostProcessing => 'Post-Processing'; + String get extensionPostProcessing => 'Post-traitement'; @override String extensionHooksAvailable(int count) { - return '$count hook(s) available'; + return '$count crochet(s) disponibles'; } @override String extensionPatternsCount(int count) { - return '$count pattern(s)'; + return '$count motif(s)'; } @override String extensionStrategy(String strategy) { - return 'Strategy: $strategy'; + return 'Stratégie : $strategy'; } @override - String get extensionsProviderPrioritySection => 'Provider Priority'; + String get extensionsProviderPrioritySection => + 'Priorité accordée aux prestataires'; @override - String get extensionsInstalledSection => 'Installed Extensions'; + String get extensionsInstalledSection => 'Extensions installées'; @override - String get extensionsNoExtensions => 'No extensions installed'; + String get extensionsNoExtensions => 'Aucune extension installée'; @override String get extensionsNoExtensionsSubtitle => - 'Install .spotiflac-ext files to add new providers'; + 'Installez les fichiers .spotiflac-ext pour ajouter de nouveaux fournisseurs'; @override - String get extensionsInstallButton => 'Install Extension'; + String get extensionsInstallButton => 'Installer l\'extension'; @override String get extensionsInfoTip => - 'Extensions can add new metadata and download providers. Only install extensions from trusted sources.'; + 'Les extensions permettent d\'ajouter de nouvelles métadonnées et de nouveaux fournisseurs de téléchargement. N\'installez que des extensions provenant de sources fiables.'; @override - String get extensionsInstalledSuccess => 'Extension installed successfully'; + String get extensionsInstalledSuccess => + 'L\'extension a été installée avec succès'; @override String extensionsInstalledCount(int count) { - return '$count extensions installed successfully'; + return '$count extensions ont été installées avec succès'; } @override String extensionsInstallPartialSuccess(int installed, int attempted) { - return 'Installed $installed of $attempted extensions'; + return '$installed extensions sur $attempted'; } @override - String get extensionsDownloadPriority => 'Download Priority'; + String get extensionsDownloadPriority => 'Priorité de téléchargement'; @override - String get extensionsDownloadPrioritySubtitle => 'Set download service order'; + String get extensionsDownloadPrioritySubtitle => + 'Définissez l\'ordre des services de téléchargement'; @override - String get extensionsFallbackTitle => 'Fallback Extensions'; + String get extensionsFallbackTitle => 'Extensions de secours'; @override String get extensionsFallbackSubtitle => - 'Choose which installed download extensions can be used as fallback'; + 'Choisissez les extensions de téléchargement installées qui peuvent servir de solution de secours'; @override String get extensionsNoDownloadProvider => - 'No extensions with download provider'; + 'Aucune extension avec le fournisseur de téléchargement'; @override - String get extensionsMetadataPriority => 'Metadata Priority'; + String get extensionsMetadataPriority => 'Priorité des métadonnées'; @override String get extensionsMetadataPrioritySubtitle => - 'Set search & metadata source order'; + 'Définissez l\'ordre des sources de recherche et de métadonnées'; @override String get extensionsNoMetadataProvider => - 'No extensions with metadata provider'; + 'Aucune extension avec fournisseur de métadonnées'; @override - String get extensionsSearchProvider => 'Search Provider'; + String get extensionsSearchProvider => 'Moteur de recherche'; @override - String get extensionsNoCustomSearch => 'No extensions with custom search'; + String get extensionsNoCustomSearch => + 'Aucune extension avec recherche personnalisée'; @override String get extensionsSearchProviderDescription => - 'Choose which service to use for searching tracks'; + 'Choisissez le service que vous souhaitez utiliser pour rechercher des morceaux'; @override - String get extensionsCustomSearch => 'Custom search'; + String get extensionsCustomSearch => 'Recherche personnalisée'; @override - String get extensionsErrorLoading => 'Error loading extension'; + String get extensionsErrorLoading => + 'Erreur lors du chargement de l\'extension'; @override - String get qualityFlacLossless => 'FLAC Lossless'; + String get qualityFlacLossless => 'FLAC sans perte'; @override - String get qualityFlacLosslessSubtitle => '16-bit / 44.1kHz'; + String get qualityFlacLosslessSubtitle => '16 bits / 44,1 kHz'; @override - String get qualityHiResFlac => 'Hi-Res FLAC'; + String get qualityHiResFlac => 'FLAC haute résolution'; @override - String get qualityHiResFlacSubtitle => '24-bit / up to 96kHz'; + String get qualityHiResFlacSubtitle => '24 bits / jusqu\'à 96 kHz'; @override - String get qualityHiResFlacMax => 'Hi-Res FLAC Max'; + String get qualityHiResFlacMax => 'FLAC haute résolution Max'; @override - String get qualityHiResFlacMaxSubtitle => '24-bit / up to 192kHz'; + String get qualityHiResFlacMaxSubtitle => '24 bits / jusqu\'à 192 kHz'; @override - String get downloadLossy320 => 'Lossy 320kbps'; + String get downloadLossy320 => 'Compression avec perte à 320 kbps'; @override - String get downloadLossyFormat => 'Lossy Format'; + String get downloadLossyFormat => 'Format avec perte'; @override - String get downloadLossy320Format => 'Lossy 320kbps Format'; + String get downloadLossy320Format => 'Format avec perte à 320 kbps'; @override String get downloadLossy320FormatDesc => - 'Choose the output format for Tidal 320kbps lossy downloads. The original AAC stream will be converted to your selected format.'; + 'Choisissez le format de sortie pour les téléchargements Tidal en 320 kbps avec perte. Le flux AAC d\'origine sera converti au format que vous aurez sélectionné.'; @override - String get downloadLossyMp3 => 'MP3 320kbps'; + String get downloadLossyMp3 => 'MP3 320 kbps'; @override - String get downloadLossyMp3Subtitle => 'Best compatibility, ~10MB per track'; + String get downloadLossyMp3Subtitle => + 'Compatibilité optimale, environ 10 Mo par piste'; @override - String get downloadLossyAac => 'AAC/M4A 320kbps'; + String get downloadLossyAac => 'AAC/M4A 320 kbps'; @override String get downloadLossyAacSubtitle => - 'Best mobile compatibility, M4A container'; + 'Compatibilité optimale avec les appareils mobiles, format M4A'; @override - String get downloadLossyOpus256 => 'Opus 256kbps'; + String get downloadLossyOpus256 => 'Opus 256 kbps'; @override String get downloadLossyOpus256Subtitle => - 'Best quality Opus, ~8MB per track'; + 'Opus en qualité optimale, environ 8 Mo par piste'; @override - String get downloadLossyOpus128 => 'Opus 128kbps'; + String get downloadLossyOpus128 => 'Opus 128 kbps'; @override - String get downloadLossyOpus128Subtitle => 'Smallest size, ~4MB per track'; + String get downloadLossyOpus128Subtitle => + 'Taille minimale : environ 4 Mo par piste'; @override String get qualityNote => - 'Actual quality depends on track availability from the service'; + 'La qualité réelle dépend de la disponibilité des pistes sur le service'; @override - String get downloadAskBeforeDownload => 'Ask Before Download'; + String get downloadAskBeforeDownload => 'Demander avant de télécharger'; @override - String get downloadDirectory => 'Download Directory'; + String get downloadDirectory => 'Répertoire de téléchargement'; @override - String get downloadSeparateSinglesFolder => 'Separate Singles Folder'; + String get downloadSeparateSinglesFolder => + 'Dossier dédié aux titres individuels'; @override - String get downloadAlbumFolderStructure => 'Album Folder Structure'; + String get downloadAlbumFolderStructure => 'Structure du dossier de l\'album'; @override - String get downloadUseAlbumArtistForFolders => 'Use Album Artist for folders'; + String get downloadUseAlbumArtistForFolders => + 'Utilisez l\'artiste de l\'album pour les dossiers'; @override - String get downloadUsePrimaryArtistOnly => 'Primary artist only for folders'; + String get downloadUsePrimaryArtistOnly => + 'Artiste principal uniquement pour les dossiers'; @override String get downloadUsePrimaryArtistOnlyEnabled => - 'Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)'; + 'Les noms des artistes mis en avant ont été supprimés du nom du dossier (par exemple : Justin Bieber, Quavo → Justin Bieber)'; @override String get downloadUsePrimaryArtistOnlyDisabled => - 'Full artist string used for folder name'; + 'Nom complet de l\'artiste utilisé pour le nom du dossier'; @override - String get downloadSelectQuality => 'Select Quality'; + String get downloadSelectQuality => 'Sélectionner la qualité'; @override - String get downloadFrom => 'Download From'; + String get downloadFrom => 'Télécharger depuis'; @override - String get appearanceAmoledDark => 'AMOLED Dark'; + String get appearanceAmoledDark => 'Noir Amoled'; @override - String get appearanceAmoledDarkSubtitle => 'Pure black background'; + String get appearanceAmoledDarkSubtitle => 'Fond noir pur'; @override - String get queueClearAll => 'Clear All'; + String get queueClearAll => 'Tout effacer'; @override String get queueClearAllMessage => - 'Are you sure you want to clear all downloads?'; + 'Êtes-vous sûr de vouloir supprimer tous les fichiers téléchargés ?'; @override - String get settingsAutoExportFailed => 'Auto-export failed downloads'; + String get settingsAutoExportFailed => + 'Échec de l\'exportation automatique des téléchargements'; @override String get settingsAutoExportFailedSubtitle => - 'Save failed downloads to TXT file automatically'; + 'Enregistrez automatiquement les téléchargements ayant échoué dans un fichier TXT'; @override - String get settingsDownloadNetwork => 'Download Network'; + String get settingsDownloadNetwork => 'Réseau de téléchargement'; @override - String get settingsDownloadNetworkAny => 'WiFi + Mobile Data'; + String get settingsDownloadNetworkAny => 'Wi-Fi + données mobiles'; @override - String get settingsDownloadNetworkWifiOnly => 'WiFi Only'; + String get settingsDownloadNetworkWifiOnly => 'Wi-Fi uniquement'; @override String get settingsDownloadNetworkSubtitle => - 'Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.'; + 'Choisissez le réseau à utiliser pour les téléchargements. Si vous sélectionnez « Wi-Fi uniquement », les téléchargements seront interrompus lorsque vous utilisez les données mobiles.'; @override - String get albumFolderArtistAlbum => 'Artist / Album'; + String get albumFolderArtistAlbum => 'Artiste / Album'; @override - String get albumFolderArtistAlbumSubtitle => 'Albums/Artist Name/Album Name/'; + String get albumFolderArtistAlbumSubtitle => + 'Albums/Nom de l\'artiste/Titre de l\'album/'; @override - String get albumFolderArtistYearAlbum => 'Artist / [Year] Album'; + String get albumFolderArtistYearAlbum => 'Artiste / [Année] Album'; @override String get albumFolderArtistYearAlbumSubtitle => - 'Albums/Artist Name/[2005] Album Name/'; + 'Albums/Nom de l\'artiste/[2005] Nom de l\'album/'; @override - String get albumFolderAlbumOnly => 'Album Only'; + String get albumFolderAlbumOnly => 'Album uniquement'; @override - String get albumFolderAlbumOnlySubtitle => 'Albums/Album Name/'; + String get albumFolderAlbumOnlySubtitle => 'Albums/Nom de l\'album/'; @override - String get albumFolderYearAlbum => '[Year] Album'; + String get albumFolderYearAlbum => '[Année] Album'; @override - String get albumFolderYearAlbumSubtitle => 'Albums/[2005] Album Name/'; + String get albumFolderYearAlbumSubtitle => 'Albums/[2005] Titre de l\'album/'; @override - String get albumFolderArtistAlbumSingles => 'Artist / Album + Singles'; + String get albumFolderArtistAlbumSingles => 'Artiste / Album + Singles'; @override String get albumFolderArtistAlbumSinglesSubtitle => - 'Artist/Album/ and Artist/Singles/'; + 'Artiste/Album/ et Artiste/Singles/'; @override - String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + String get albumFolderArtistAlbumFlat => 'Artiste / Album (singles)'; @override String get albumFolderArtistAlbumFlatSubtitle => - 'Artist/Album/ and Artist/song.flac'; + 'Artiste/Album/ et Artiste/titre.flac'; @override - String get downloadedAlbumDeleteSelected => 'Delete Selected'; + String get downloadedAlbumDeleteSelected => 'Supprimer la sélection'; @override String downloadedAlbumDeleteMessage(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'pistes', + one: 'piste', ); - return 'Delete $count $_temp0 from this album?\n\nThis will also delete the files from storage.'; + return 'Souhaitez-vous supprimer $count $_temp0 de cet album ?\n\nCela supprimera également les fichiers de l\'espace de stockage.'; } @override String downloadedAlbumSelectedCount(int count) { - return '$count selected'; + return '$count sélectionnés'; } @override - String get downloadedAlbumAllSelected => 'All tracks selected'; + String get downloadedAlbumAllSelected => 'Tous les titres sélectionnés'; @override - String get downloadedAlbumTapToSelect => 'Tap tracks to select'; + String get downloadedAlbumTapToSelect => + 'Appuyez sur les titres pour les sélectionner'; @override String downloadedAlbumDeleteCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'pistes', + one: 'piste', ); - return 'Delete $count $_temp0'; + return 'Supprimer $count $_temp0'; } @override - String get downloadedAlbumSelectToDelete => 'Select tracks to delete'; + String get downloadedAlbumSelectToDelete => + 'Sélectionnez les pistes à supprimer'; @override String downloadedAlbumDiscHeader(int discNumber) { - return 'Disc $discNumber'; + return 'Disque $discNumber'; } @override - String get recentTypeArtist => 'Artist'; + String get recentTypeArtist => 'Artiste'; @override String get recentTypeAlbum => 'Album'; @override - String get recentTypeSong => 'Song'; + String get recentTypeSong => 'Titre'; @override String get recentTypePlaylist => 'Playlist'; @override - String get recentEmpty => 'No recent items yet'; + String get recentEmpty => 'Aucun élément récent pour le moment'; @override - String get recentShowAllDownloads => 'Show All Downloads'; + String get recentShowAllDownloads => 'Afficher tous les téléchargements'; @override String recentPlaylistInfo(String name) { - return 'Playlist: $name'; + return 'Playlist : $name'; } @override - String get discographyDownload => 'Download Discography'; + String get discographyDownload => 'Télécharger la discographie'; @override - String get discographyDownloadAll => 'Download All'; + String get discographyDownloadAll => 'Tout télécharger'; @override String discographyDownloadAllSubtitle(int count, int albumCount) { - return '$count tracks from $albumCount releases'; + return '$count titres issus de $albumCount albums'; } @override - String get discographyAlbumsOnly => 'Albums Only'; + String get discographyAlbumsOnly => 'Albums uniquement'; @override String discographyAlbumsOnlySubtitle(int count, int albumCount) { - return '$count tracks from $albumCount albums'; + return '$count titres issus de $albumCount albums'; } @override - String get discographySinglesOnly => 'Singles & EPs Only'; + String get discographySinglesOnly => 'Uniquement les singles et les EP'; @override String discographySinglesOnlySubtitle(int count, int albumCount) { - return '$count tracks from $albumCount singles'; + return '$count titres issus de $albumCount singles'; } @override - String get discographySelectAlbums => 'Select Albums...'; + String get discographySelectAlbums => 'Sélectionner des albums...'; @override String get discographySelectAlbumsSubtitle => - 'Choose specific albums or singles'; + 'Choisissez des albums ou des titres spécifiques'; @override - String get discographyFetchingTracks => 'Fetching tracks...'; + String get discographyFetchingTracks => 'Chargement des pistes...'; @override String discographyFetchingAlbum(int current, int total) { - return 'Fetching $current of $total...'; + return 'Récupération de $current sur $total...'; } @override String discographySelectedCount(int count) { - return '$count selected'; + return '$count sélectionnés'; } @override - String get discographyDownloadSelected => 'Download Selected'; + String get discographyDownloadSelected => 'Télécharger la sélection'; @override String discographyAddedToQueue(int count) { - return 'Added $count tracks to queue'; + return '$count titres ont été ajoutés à la file d\'attente'; } @override String discographySkippedDownloaded(int added, int skipped) { - return '$added added, $skipped already downloaded'; + return '$added ajouté, $skipped déjà téléchargé'; } @override - String get discographyNoAlbums => 'No albums available'; + String get discographyNoAlbums => 'Aucun album disponible'; @override - String get discographyFailedToFetch => 'Failed to fetch some albums'; + String get discographyFailedToFetch => + 'Impossible de récupérer certains albums'; @override - String get sectionStorageAccess => 'Storage Access'; + String get sectionStorageAccess => 'Accès au stockage'; @override - String get allFilesAccess => 'All Files Access'; + String get allFilesAccess => 'Accès à tous les fichiers'; @override - String get allFilesAccessEnabledSubtitle => 'Can write to any folder'; + String get allFilesAccessEnabledSubtitle => + 'Peut écrire dans n\'importe quel dossier'; @override - String get allFilesAccessDisabledSubtitle => 'Limited to media folders only'; + String get allFilesAccessDisabledSubtitle => + 'Réservé aux dossiers multimédias uniquement'; @override String get allFilesAccessDescription => - 'Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.'; + 'Activez cette option si vous rencontrez des erreurs d\'écriture lors de l\'enregistrement dans des dossiers personnalisés. À partir d\'Android 13, l\'accès à certains répertoires est restreint par défaut.'; @override String get allFilesAccessDeniedMessage => - 'Permission was denied. Please enable \'All files access\' manually in system settings.'; + 'L\'autorisation a été refusée. Veuillez activer manuellement l\'option « Accès à tous les fichiers » dans les paramètres système.'; @override String get allFilesAccessDisabledMessage => - 'All Files Access disabled. The app will use limited storage access.'; + 'L\'accès à tous les fichiers est désactivé. L\'application disposera d\'un accès limité au stockage.'; @override - String get settingsLocalLibrary => 'Local Library'; + String get settingsLocalLibrary => 'Bibliothèque locale'; @override - String get settingsLocalLibrarySubtitle => 'Scan music & detect duplicates'; + String get settingsLocalLibrarySubtitle => + 'Analysez la musique et détectez les doublons'; @override - String get settingsCache => 'Storage & Cache'; + String get settingsCache => 'Stockage & Cache'; @override - String get settingsCacheSubtitle => 'View size and clear cached data'; + String get settingsCacheSubtitle => 'Afficher la taille et vider le cache'; @override - String get libraryTitle => 'Local Library'; + String get libraryTitle => 'Bibliothèque locale'; @override - String get libraryScanSettings => 'Scan Settings'; + String get libraryScanSettings => 'Paramètres de numérisation'; @override - String get libraryEnableLocalLibrary => 'Enable Local Library'; + String get libraryEnableLocalLibrary => 'Activer la bibliothèque locale'; @override String get libraryEnableLocalLibrarySubtitle => - 'Scan and track your existing music'; + 'Analysez et gérez votre bibliothèque musicale'; @override - String get libraryFolder => 'Library Folder'; + String get libraryFolder => 'Dossier de bibliothèque'; @override - String get libraryFolderHint => 'Tap to select folder'; + String get libraryFolderHint => 'Appuyez pour sélectionner un dossier'; @override - String get libraryShowDuplicateIndicator => 'Show Duplicate Indicator'; + String get libraryShowDuplicateIndicator => + 'Afficher l\'indicateur de doublons'; @override String get libraryShowDuplicateIndicatorSubtitle => - 'Show when searching for existing tracks'; + 'Afficher lors de la recherche de pistes existantes'; @override - String get libraryAutoScan => 'Auto Scan'; + String get libraryAutoScan => 'Analyse automatique'; @override String get libraryAutoScanSubtitle => - 'Automatically scan your library for new files'; + 'Analysez automatiquement votre bibliothèque à la recherche de nouveaux fichiers'; @override - String get libraryAutoScanOff => 'Off'; + String get libraryAutoScanOff => 'Désactivée'; @override - String get libraryAutoScanOnOpen => 'Every app open'; + String get libraryAutoScanOnOpen => 'À chaque ouverture de l\'application'; @override - String get libraryAutoScanDaily => 'Daily'; + String get libraryAutoScanDaily => 'Tous les jours'; @override - String get libraryAutoScanWeekly => 'Weekly'; + String get libraryAutoScanWeekly => 'Hebdomadaire'; @override String get libraryActions => 'Actions'; @override - String get libraryScan => 'Scan Library'; + String get libraryScan => 'Analyse de la bibliothèque'; @override - String get libraryScanSubtitle => 'Scan for audio files'; + String get libraryScanSubtitle => 'Recherchez des fichiers audio'; @override - String get libraryScanSelectFolderFirst => 'Select a folder first'; + String get libraryScanSelectFolderFirst => 'Sélectionnez d\'abord un dossier'; @override - String get libraryCleanupMissingFiles => 'Cleanup Missing Files'; + String get libraryCleanupMissingFiles => 'Nettoyage des fichiers manquants'; @override String get libraryCleanupMissingFilesSubtitle => - 'Remove entries for files that no longer exist'; + 'Supprimez les entrées correspondant aux fichiers qui n\'existent plus'; @override - String get libraryClear => 'Clear Library'; + String get libraryClear => 'Vider la bibliothèque'; @override - String get libraryClearSubtitle => 'Remove all scanned tracks'; + String get libraryClearSubtitle => 'Supprimez tous les titres numérisés'; @override - String get libraryClearConfirmTitle => 'Clear Library'; + String get libraryClearConfirmTitle => 'Vider la bibliothèque'; @override String get libraryClearConfirmMessage => - 'This will remove all scanned tracks from your library. Your actual music files will not be deleted.'; + 'Cette opération supprimera toutes les pistes numérisées de votre bibliothèque. Vos fichiers musicaux ne seront pas supprimés.'; @override - String get libraryAbout => 'About Local Library'; + String get libraryAbout => 'À propos de la bibliothèque locale'; @override String get libraryAboutDescription => - 'Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.'; + 'Analyse votre bibliothèque musicale existante pour détecter les doublons lors du téléchargement. Prend en charge les formats FLAC, M4A, MP3, Opus et OGG. Les métadonnées sont extraites des balises des fichiers lorsqu\'elles sont disponibles.'; @override String libraryTracksUnit(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'pistes', + one: 'piste', ); return '$_temp0'; } @@ -1931,120 +1987,121 @@ class AppLocalizationsFr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'files', - one: 'file', + other: 'fichiers', + one: 'fichier', ); return '$_temp0'; } @override String libraryLastScanned(String time) { - return 'Last scanned: $time'; + return 'Dernière analyse : $time'; } @override - String get libraryLastScannedNever => 'Never'; + String get libraryLastScannedNever => 'Jamais'; @override - String get libraryScanning => 'Scanning...'; + String get libraryScanning => 'En cours d\'analyse...'; @override - String get libraryScanFinalizing => 'Finalizing library...'; + String get libraryScanFinalizing => 'Finalisation de la bibliothèque...'; @override String libraryScanProgress(String progress, int total) { - return '$progress% of $total files'; + return '$progress % des $total fichiers'; } @override - String get libraryInLibrary => 'In Library'; + String get libraryInLibrary => 'Dans la bibliothèque'; @override String libraryRemovedMissingFiles(int count) { - return 'Removed $count missing files from library'; + return '$count fichiers manquants ont été supprimés de la bibliothèque'; } @override - String get libraryCleared => 'Library cleared'; + String get libraryCleared => 'Bibliothèque vidée'; @override - String get libraryStorageAccessRequired => 'Storage Access Required'; + String get libraryStorageAccessRequired => 'Accès au stockage requis'; @override String get libraryStorageAccessMessage => - 'SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.'; + 'SpotiFLAC a besoin d\'un accès au stockage pour analyser votre bibliothèque musicale. Veuillez lui accorder l\'autorisation dans les paramètres.'; @override - String get libraryFolderNotExist => 'Selected folder does not exist'; + String get libraryFolderNotExist => 'Le dossier sélectionné n\'existe pas'; @override - String get librarySourceDownloaded => 'Downloaded'; + String get librarySourceDownloaded => 'Téléchargé'; @override - String get librarySourceLocal => 'Local'; + String get librarySourceLocal => 'Locale'; @override - String get libraryFilterAll => 'All'; + String get libraryFilterAll => 'Tout'; @override - String get libraryFilterDownloaded => 'Downloaded'; + String get libraryFilterDownloaded => 'Téléchargé'; @override - String get libraryFilterLocal => 'Local'; + String get libraryFilterLocal => 'Locale'; @override - String get libraryFilterTitle => 'Filters'; + String get libraryFilterTitle => 'Filtres'; @override - String get libraryFilterReset => 'Reset'; + String get libraryFilterReset => 'Réinitialiser'; @override - String get libraryFilterApply => 'Apply'; + String get libraryFilterApply => 'Appliquer'; @override String get libraryFilterSource => 'Source'; @override - String get libraryFilterQuality => 'Quality'; + String get libraryFilterQuality => 'Qualité'; @override - String get libraryFilterQualityHiRes => 'Hi-Res (24bit)'; + String get libraryFilterQualityHiRes => 'Haute résolution (24 bits)'; @override - String get libraryFilterQualityCD => 'CD (16bit)'; + String get libraryFilterQualityCD => 'CD (16 bits)'; @override - String get libraryFilterQualityLossy => 'Lossy'; + String get libraryFilterQualityLossy => 'Avec perte'; @override String get libraryFilterFormat => 'Format'; @override - String get libraryFilterMetadata => 'Metadata'; + String get libraryFilterMetadata => 'Métadonnées'; @override - String get libraryFilterMetadataComplete => 'Complete metadata'; + String get libraryFilterMetadataComplete => 'Métadonnées complètes'; @override - String get libraryFilterMetadataMissingAny => 'Missing any metadata'; + String get libraryFilterMetadataMissingAny => 'Métadonnées manquantes'; @override - String get libraryFilterMetadataMissingYear => 'Missing year'; + String get libraryFilterMetadataMissingYear => 'Année manquante'; @override - String get libraryFilterMetadataMissingGenre => 'Missing genre'; + String get libraryFilterMetadataMissingGenre => 'Genre manquant'; @override - String get libraryFilterMetadataMissingAlbumArtist => 'Missing album artist'; + String get libraryFilterMetadataMissingAlbumArtist => + 'Artiste d\'album manquant'; @override - String get libraryFilterSort => 'Sort'; + String get libraryFilterSort => 'Trier'; @override - String get libraryFilterSortLatest => 'Latest'; + String get libraryFilterSortLatest => 'Le plus récent'; @override - String get libraryFilterSortOldest => 'Oldest'; + String get libraryFilterSortOldest => 'Le plus ancien'; @override String get libraryFilterSortAlbumAsc => 'Album (A-Z)'; @@ -2059,15 +2116,15 @@ class AppLocalizationsFr extends AppLocalizations { String get libraryFilterSortGenreDesc => 'Genre (Z-A)'; @override - String get timeJustNow => 'Just now'; + String get timeJustNow => 'Il y a quelques instants'; @override String timeMinutesAgo(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count minutes ago', - one: '1 minute ago', + other: 'il y a $count minutes', + one: 'il y a 1 minute', ); return '$_temp0'; } @@ -2077,199 +2134,203 @@ class AppLocalizationsFr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count hours ago', - one: '1 hour ago', + other: 'il y a $count heures', + one: 'il y a 1 heure', ); return '$_temp0'; } @override - String get tutorialWelcomeTitle => 'Welcome to SpotiFLAC!'; + String get tutorialWelcomeTitle => 'Bienvenue sur SpotiFLAC !'; @override String get tutorialWelcomeDesc => - 'Let\'s learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.'; + 'Apprenons comment télécharger votre musique préférée en qualité sans perte. Ce petit tutoriel vous présentera les bases.'; @override String get tutorialWelcomeTip1 => - 'Download music from Spotify, Deezer, or paste any supported URL'; + 'Téléchargez de la musique depuis Spotify ou Deezer, ou collez n\'importe quelle URL prise en charge'; @override String get tutorialWelcomeTip2 => - 'Get FLAC quality audio from Tidal, Qobuz, or Deezer'; + 'Profitez d\'un son de qualité FLAC sur Tidal, Qobuz ou Deezer'; @override String get tutorialWelcomeTip3 => - 'Automatic metadata, cover art, and lyrics embedding'; + 'Intégration automatique des métadonnées, des pochettes d\'album et des paroles'; @override - String get tutorialSearchTitle => 'Finding Music'; + String get tutorialSearchTitle => 'Trouver de la musique'; @override String get tutorialSearchDesc => - 'There are two easy ways to find music you want to download.'; + 'Il existe deux façons simples de trouver la musique que vous souhaitez télécharger.'; @override - String get tutorialDownloadTitle => 'Downloading Music'; + String get tutorialDownloadTitle => 'Télécharger de la musique'; @override String get tutorialDownloadDesc => - 'Downloading music is simple and fast. Here\'s how it works.'; + 'Télécharger de la musique, c\'est simple et rapide. Voici comment ça marche.'; @override - String get tutorialLibraryTitle => 'Your Library'; + String get tutorialLibraryTitle => 'Votre bibliothèque'; @override String get tutorialLibraryDesc => - 'All your downloaded music is organized in the Library tab.'; + 'Toute votre musique téléchargée est classée dans l\'onglet « Bibliothèque ».'; @override String get tutorialLibraryTip1 => - 'View download progress and queue in the Library tab'; + 'Afficher la progression du téléchargement et la file d\'attente dans l\'onglet « Bibliothèque »'; @override String get tutorialLibraryTip2 => - 'Tap any track to play it with your music player'; + 'Appuyez sur n\'importe quel morceau pour l\'écouter avec votre lecteur de musique'; @override String get tutorialLibraryTip3 => - 'Switch between list and grid view for better browsing'; + 'Passez de l\'affichage sous forme de liste à celui sous forme de grille pour faciliter la navigation'; @override String get tutorialExtensionsTitle => 'Extensions'; @override String get tutorialExtensionsDesc => - 'Extend the app\'s capabilities with community extensions.'; + 'Élargissez les fonctionnalités de l\'application grâce aux extensions de la communauté.'; @override String get tutorialExtensionsTip1 => - 'Browse the Repo tab to discover useful extensions'; + 'Consultez l\'onglet « Dépôt » pour découvrir des extensions utiles'; @override String get tutorialExtensionsTip2 => - 'Add new download providers or search sources'; + 'Ajouter de nouveaux fournisseurs de téléchargement ou de nouvelles sources de recherche'; @override String get tutorialExtensionsTip3 => - 'Get lyrics, enhanced metadata, and more features'; + 'Accédez aux paroles, à des métadonnées enrichies et à bien d\'autres fonctionnalités'; @override - String get tutorialSettingsTitle => 'Customize Your Experience'; + String get tutorialSettingsTitle => 'Personnalisez votre expérience'; @override String get tutorialSettingsDesc => - 'Personalize the app in Settings to match your preferences.'; + 'Personnalisez l\'application dans les Paramètres en fonction de vos préférences.'; @override String get tutorialSettingsTip1 => - 'Change download location and folder organization'; + 'Modifier l\'emplacement de téléchargement et l\'organisation des dossiers'; @override String get tutorialSettingsTip2 => - 'Set default audio quality and format preferences'; + 'Définir les préférences par défaut en matière de qualité et de format audio'; @override - String get tutorialSettingsTip3 => 'Customize app theme and appearance'; + String get tutorialSettingsTip3 => + 'Personnaliser le thème et l\'apparence de l\'application'; @override String get tutorialReadyMessage => - 'You\'re all set! Start downloading your favorite music now.'; + 'C\'est parti ! Commencez dès maintenant à télécharger votre musique préférée.'; @override - String get libraryForceFullScan => 'Force Full Scan'; + String get libraryForceFullScan => 'Lancer une analyse complète'; @override - String get libraryForceFullScanSubtitle => 'Rescan all files, ignoring cache'; + String get libraryForceFullScanSubtitle => + 'Réanalysez tous les fichiers en ignorant le cache'; @override - String get cleanupOrphanedDownloads => 'Cleanup Orphaned Downloads'; + String get cleanupOrphanedDownloads => + 'Nettoyage des téléchargements orphelins'; @override String get cleanupOrphanedDownloadsSubtitle => - 'Remove history entries for files that no longer exist'; + 'Supprimez les entrées de l\'historique correspondant aux fichiers qui n\'existent plus'; @override String cleanupOrphanedDownloadsResult(int count) { - return 'Removed $count orphaned entries from history'; + return '$count entrées orphelines ont été supprimées de l\'historique'; } @override - String get cleanupOrphanedDownloadsNone => 'No orphaned entries found'; + String get cleanupOrphanedDownloadsNone => + 'Aucune entrée orpheline n\'a été trouvée'; @override - String get cacheTitle => 'Storage & Cache'; + String get cacheTitle => 'Stockage & Cache'; @override - String get cacheSummaryTitle => 'Cache overview'; + String get cacheSummaryTitle => 'Présentation du cache'; @override String get cacheSummarySubtitle => - 'Clearing cache will not remove downloaded music files.'; + 'La suppression du cache n\'entraînera pas la suppression des fichiers musicaux téléchargés.'; @override String cacheEstimatedTotal(String size) { - return 'Estimated cache usage: $size'; + return 'Utilisation estimée du cache : $size'; } @override - String get cacheSectionStorage => 'Cached Data'; + String get cacheSectionStorage => 'Données mises en cache'; @override - String get cacheSectionMaintenance => 'Maintenance'; + String get cacheSectionMaintenance => 'Entretien'; @override - String get cacheAppDirectory => 'App cache directory'; + String get cacheAppDirectory => 'Répertoire de cache de l\'application'; @override String get cacheAppDirectoryDesc => - 'HTTP responses, WebView data, and other temporary app data.'; + 'Réponses HTTP, données WebView et autres données temporaires de l\'application.'; @override - String get cacheTempDirectory => 'Temporary directory'; + String get cacheTempDirectory => 'Répertoire temporaire'; @override String get cacheTempDirectoryDesc => - 'Temporary files from downloads and audio conversion.'; + 'Fichiers temporaires liés aux téléchargements et à la conversion audio.'; @override - String get cacheCoverImage => 'Cover image cache'; + String get cacheCoverImage => 'Cache des images de couverture'; @override String get cacheCoverImageDesc => - 'Downloaded album and track cover art. Will re-download when viewed.'; + 'J\'ai téléchargé les pochettes de l\'album et des titres. Je les téléchargerai à nouveau lors de leur consultation.'; @override - String get cacheLibraryCover => 'Library cover cache'; + String get cacheLibraryCover => 'Cache de couverture de bibliothèque'; @override String get cacheLibraryCoverDesc => - 'Cover art extracted from local music files. Will re-extract on next scan.'; + 'Pochettes extraites des fichiers musicaux locaux. Elles seront extraites à nouveau lors de la prochaine analyse.'; @override - String get cacheExploreFeed => 'Explore feed cache'; + String get cacheExploreFeed => 'Explorer le cache des flux'; @override String get cacheExploreFeedDesc => - 'Explore tab content (new releases, trending). Will refresh on next visit.'; + 'Contenu de l\'onglet « Explorer » (nouvelles sorties, tendances). Se mettra à jour lors de votre prochaine visite.'; @override - String get cacheTrackLookup => 'Track lookup cache'; + String get cacheTrackLookup => 'Cache de recherche de piste'; @override String get cacheTrackLookupDesc => - 'Spotify/Deezer track ID lookups. Clearing may slow next few searches.'; + 'Recherche d\'identifiant de titre sur Spotify/Deezer. La suppression des données peut ralentir les prochaines recherches.'; @override String get cacheCleanupUnusedDesc => - 'Remove orphaned download history and library entries for missing files.'; + 'Supprimer les entrées orphelines de l\'historique des téléchargements et de la bibliothèque pour les fichiers manquants.'; @override - String get cacheNoData => 'No cached data'; + String get cacheNoData => 'Aucune donnée mise en cache'; @override String cacheSizeWithFiles(String size, int count) { - return '$size in $count files'; + return '$size dans $count fichiers'; } @override @@ -2279,166 +2340,170 @@ class AppLocalizationsFr extends AppLocalizations { @override String cacheEntries(int count) { - return '$count entries'; + return '$count entrées'; } @override String cacheClearSuccess(String target) { - return 'Cleared: $target'; + return 'Effacé : $target'; } @override - String get cacheClearConfirmTitle => 'Clear cache?'; + String get cacheClearConfirmTitle => 'Vider le cache ?'; @override String cacheClearConfirmMessage(String target) { - return 'This will clear cached data for $target. Downloaded music files will not be deleted.'; + return 'Cette opération effacera les données mises en cache pour $target. Les fichiers musicaux téléchargés ne seront pas supprimés.'; } @override - String get cacheClearAllConfirmTitle => 'Clear all cache?'; + String get cacheClearAllConfirmTitle => 'Vider tout le cache ?'; @override String get cacheClearAllConfirmMessage => - 'This will clear all cache categories on this page. Downloaded music files will not be deleted.'; + 'Cette opération effacera toutes les catégories mises en cache sur cette page. Les fichiers musicaux téléchargés ne seront pas supprimés.'; @override - String get cacheClearAll => 'Clear all cache'; + String get cacheClearAll => 'Vider tout le cache'; @override - String get cacheCleanupUnused => 'Cleanup unused data'; + String get cacheCleanupUnused => 'Nettoyer les données inutilisées'; @override String get cacheCleanupUnusedSubtitle => - 'Remove orphaned download history and missing library entries'; + 'Supprimer l\'historique des téléchargements orphelins et les entrées manquantes dans la bibliothèque'; @override String cacheCleanupResult(int downloadCount, int libraryCount) { - return 'Cleanup completed: $downloadCount orphaned downloads, $libraryCount missing library entries'; + return 'Nettoyage terminé : $downloadCount téléchargements orphelins, $libraryCount entrées de bibliothèque manquantes'; } @override - String get cacheRefreshStats => 'Refresh stats'; + String get cacheRefreshStats => 'Actualiser les statistiques'; @override - String get trackSaveCoverArt => 'Save Cover Art'; + String get trackSaveCoverArt => 'Enregistrer la pochette'; @override - String get trackSaveCoverArtSubtitle => 'Save album art as .jpg file'; + String get trackSaveCoverArtSubtitle => + 'Enregistrez la pochette de l\'album au format .jpg'; @override - String get trackSaveLyrics => 'Save Lyrics (.lrc)'; + String get trackSaveLyrics => 'Enregistrer les paroles (.lrc)'; @override - String get trackSaveLyricsSubtitle => 'Fetch and save lyrics as .lrc file'; + String get trackSaveLyricsSubtitle => + 'Récupérez et enregistrez les paroles sous forme de fichier .lrc'; @override - String get trackSaveLyricsProgress => 'Saving lyrics...'; + String get trackSaveLyricsProgress => 'Enregistrement des paroles...'; @override - String get trackReEnrich => 'Re-enrich'; + String get trackReEnrich => 'Réenrichir'; @override String get trackReEnrichOnlineSubtitle => - 'Search metadata online and embed into file'; + 'Rechercher des métadonnées en ligne et les intégrer dans un fichier'; @override - String get trackReEnrichFieldsTitle => 'Fields to update'; + String get trackReEnrichFieldsTitle => 'Champs à mettre à jour'; @override - String get trackReEnrichFieldCover => 'Cover Art'; + String get trackReEnrichFieldCover => 'Illustration de couverture'; @override - String get trackReEnrichFieldLyrics => 'Lyrics'; + String get trackReEnrichFieldLyrics => 'Paroles'; @override - String get trackReEnrichFieldBasicTags => 'Album, Album Artist'; + String get trackReEnrichFieldBasicTags => 'Album, Album Artiste'; @override - String get trackReEnrichFieldTrackInfo => 'Track & Disc Number'; + String get trackReEnrichFieldTrackInfo => 'Numéro de piste & de disque'; @override String get trackReEnrichFieldReleaseInfo => 'Date & ISRC'; @override - String get trackReEnrichFieldExtra => 'Genre, Label, Copyright'; + String get trackReEnrichFieldExtra => 'Genre, Label, Droits d\'auteur'; @override - String get trackReEnrichSelectAll => 'Select All'; + String get trackReEnrichSelectAll => 'Tout sélectionner'; @override - String get trackEditMetadata => 'Edit Metadata'; + String get trackEditMetadata => 'Modifier les métadonnées'; @override String trackCoverSaved(String fileName) { - return 'Cover art saved to $fileName'; + return 'La pochette a été enregistrée sous le nom $fileName'; } @override - String get trackCoverNoSource => 'No cover art source available'; + String get trackCoverNoSource => + 'Aucune source d\'illustration de couverture disponible'; @override String trackLyricsSaved(String fileName) { - return 'Lyrics saved to $fileName'; + return 'Paroles enregistrées dans $fileName'; } @override - String get trackReEnrichProgress => 'Re-enriching metadata...'; + String get trackReEnrichProgress => 'Réenrichissement des métadonnées...'; @override - String get trackReEnrichSearching => 'Searching metadata online...'; + String get trackReEnrichSearching => 'Recherche de métadonnées en ligne...'; @override - String get trackReEnrichSuccess => 'Metadata re-enriched successfully'; + String get trackReEnrichSuccess => 'Métadonnées réenrichies avec succès'; @override - String get trackReEnrichFfmpegFailed => 'FFmpeg metadata embed failed'; + String get trackReEnrichFfmpegFailed => + 'Échec de l\'intégration des métadonnées FFmpeg'; @override - String get queueFlacAction => 'Queue FLAC'; + String get queueFlacAction => 'File d\'attente FLAC'; @override String queueFlacConfirmMessage(int count) { - return 'Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n$count selected'; + return 'Recherchez en ligne les correspondances pour les morceaux sélectionnés et ajoutez les téléchargements FLAC à la file d\'attente.\n\nLes fichiers existants ne seront ni modifiés ni supprimés.\n\nSeules les correspondances hautement fiables sont automatiquement ajoutées à la file d\'attente.\n\n$count sélectionnés'; } @override String queueFlacFindingProgress(int current, int total) { - return 'Finding FLAC matches... ($current/$total)'; + return 'Recherche de fichiers FLAC... ($current/$total)'; } @override String get queueFlacNoReliableMatches => - 'No reliable online matches found for the selection'; + 'Aucun résultat pertinent n\'a été trouvé en ligne pour cette sélection'; @override String queueFlacQueuedWithSkipped(int addedCount, int skippedCount) { - return 'Added $addedCount tracks to queue, skipped $skippedCount'; + return '$addedCount titres ajoutés à la file d\'attente, $skippedCount titres ignorés'; } @override String trackSaveFailed(String error) { - return 'Failed: $error'; + return 'Échec : $error'; } @override - String get trackConvertFormat => 'Convert Format'; + String get trackConvertFormat => 'Convertir le format'; @override String get trackConvertFormatSubtitle => - 'Convert to MP3, Opus, ALAC, or FLAC'; + 'Convertir au format AAC/M4A, MP3, Opus, ALAC ou FLAC'; @override - String get trackConvertTitle => 'Convert Audio'; + String get trackConvertTitle => 'Convertir un fichier audio'; @override - String get trackConvertTargetFormat => 'Target Format'; + String get trackConvertTargetFormat => 'Format cible'; @override - String get trackConvertBitrate => 'Bitrate'; + String get trackConvertBitrate => 'Débit binaire'; @override - String get trackConvertConfirmTitle => 'Confirm Conversion'; + String get trackConvertConfirmTitle => 'Confirmer la conversion'; @override String trackConvertConfirmMessage( @@ -2446,7 +2511,7 @@ class AppLocalizationsFr extends AppLocalizations { String targetFormat, String bitrate, ) { - return 'Convert from $sourceFormat to $targetFormat at $bitrate?\n\nThe original file will be deleted after conversion.'; + return 'Convertir du format $sourceFormat au format $targetFormat avec un débit binaire de $bitrate ?\n\nLe fichier d\'origine sera supprimé après la conversion.'; } @override @@ -2454,86 +2519,88 @@ class AppLocalizationsFr extends AppLocalizations { String sourceFormat, String targetFormat, ) { - return 'Convert from $sourceFormat to $targetFormat? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.'; + return 'Convertir de $sourceFormat vers $targetFormat ? (Sans perte — aucune perte de qualité)\n\nLe fichier d\'origine sera supprimé après la conversion.'; } @override String get trackConvertLosslessHint => - 'Lossless conversion — no quality loss'; + 'Conversion sans perte — aucune perte de qualité'; @override - String get trackConvertConverting => 'Converting audio...'; + String get trackConvertConverting => 'Conversion audio en cours...'; @override String trackConvertSuccess(String format) { - return 'Converted to $format successfully'; + return 'Conversion vers $format réussie'; } @override - String get trackConvertFailed => 'Conversion failed'; + String get trackConvertFailed => 'Échec de la conversion'; @override - String get cueSplitTitle => 'Split CUE Sheet'; + String get cueSplitTitle => 'Fiche CUE fractionnée'; @override - String get cueSplitSubtitle => 'Split CUE+FLAC into individual tracks'; + String get cueSplitSubtitle => + 'Diviser un fichier CUE+FLAC en pistes individuelles'; @override String cueSplitAlbum(String album) { - return 'Album: $album'; + return 'Album : $album'; } @override String cueSplitArtist(String artist) { - return 'Artist: $artist'; + return 'Artiste : $artist'; } @override String cueSplitTrackCount(int count) { - return '$count tracks'; + return '$count titres'; } @override - String get cueSplitConfirmTitle => 'Split CUE Album'; + String get cueSplitConfirmTitle => 'Album CUE fractionné'; @override String cueSplitConfirmMessage(String album, int count) { - return 'Split \"$album\" into $count individual FLAC files?\n\nFiles will be saved to the same directory.'; + return 'Diviser « $album » en $count fichiers FLAC individuels ?\n\nLes fichiers seront enregistrés dans le même répertoire.'; } @override String cueSplitSplitting(int current, int total) { - return 'Splitting CUE sheet... ($current/$total)'; + return 'Fractionnement de la liste CUE... ($current/$total)'; } @override String cueSplitSuccess(int count) { - return 'Split into $count tracks successfully'; + return 'Le fichier a été divisé en $count pistes avec succès'; } @override - String get cueSplitFailed => 'CUE split failed'; + String get cueSplitFailed => 'Échec de la division CUE'; @override - String get cueSplitNoAudioFile => 'Audio file not found for this CUE sheet'; + String get cueSplitNoAudioFile => + 'Fichier audio introuvable pour cette liste CUE'; @override - String get cueSplitButton => 'Split into Tracks'; + String get cueSplitButton => 'Diviser en pistes'; @override - String get actionCreate => 'Create'; + String get actionCreate => 'Créer'; @override - String get collectionFoldersTitle => 'My folders'; + String get collectionFoldersTitle => 'Mes dossiers'; @override - String get collectionWishlist => 'Wishlist'; + String get collectionWishlist => 'Liste de souhaits'; @override - String get collectionLoved => 'Loved'; + String get collectionLoved => 'Favoris'; @override - String get collectionFavoriteArtists => 'Favorite Artists'; + String get collectionFavoriteArtists => 'Artistes Favoris'; @override String get collectionPlaylists => 'Playlists'; @@ -2542,25 +2609,25 @@ class AppLocalizationsFr extends AppLocalizations { String get collectionPlaylist => 'Playlist'; @override - String get collectionAddToPlaylist => 'Add to playlist'; + String get collectionAddToPlaylist => 'Ajouter à la playlist'; @override - String get collectionCreatePlaylist => 'Create playlist'; + String get collectionCreatePlaylist => 'Créer une playlist'; @override - String get collectionNoPlaylistsYet => 'No playlists yet'; + String get collectionNoPlaylistsYet => 'Aucune playlist pour le moment'; @override String get collectionNoPlaylistsSubtitle => - 'Create a playlist to start categorizing tracks'; + 'Créez une playlist pour commencer à classer vos morceaux'; @override String collectionPlaylistTracks(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count tracks', - one: '1 track', + other: '$count titres', + one: '1 titre', ); return '$_temp0'; } @@ -2570,171 +2637,178 @@ class AppLocalizationsFr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count artists', - one: '1 artist', + other: '$count artistes', + one: '1 artiste', ); return '$_temp0'; } @override String collectionAddedToPlaylist(String playlistName) { - return 'Added to \"$playlistName\"'; + return 'Ajouté à « $playlistName »'; } @override String collectionAlreadyInPlaylist(String playlistName) { - return 'Already in \"$playlistName\"'; + return 'Déjà présent dans « $playlistName »'; } @override - String get collectionPlaylistCreated => 'Playlist created'; + String get collectionPlaylistCreated => 'Playlist créée'; @override - String get collectionPlaylistNameHint => 'Playlist name'; + String get collectionPlaylistNameHint => 'Nom de la playlist'; @override - String get collectionPlaylistNameRequired => 'Playlist name is required'; + String get collectionPlaylistNameRequired => + 'Le nom de la playlist est requis'; @override - String get collectionRenamePlaylist => 'Rename playlist'; + String get collectionRenamePlaylist => 'Renommer la playlist'; @override - String get collectionDeletePlaylist => 'Delete playlist'; + String get collectionDeletePlaylist => 'Supprimer la playlist'; @override String collectionDeletePlaylistMessage(String playlistName) { - return 'Delete \"$playlistName\" and all tracks inside it?'; + return 'Supprimer « $playlistName » et tous les morceaux qu\'elle contient ?'; } @override - String get collectionPlaylistDeleted => 'Playlist deleted'; + String get collectionPlaylistDeleted => 'Playlist supprimée'; @override - String get collectionPlaylistRenamed => 'Playlist renamed'; + String get collectionPlaylistRenamed => 'Playlist renommée'; @override - String get collectionWishlistEmptyTitle => 'Wishlist is empty'; + String get collectionWishlistEmptyTitle => 'La liste de souhaits est vide'; @override String get collectionWishlistEmptySubtitle => - 'Tap + on tracks to save what you want to download later'; + 'Appuyez sur le signe « + » à côté des morceaux pour enregistrer ceux que vous souhaitez télécharger plus tard'; @override - String get collectionLovedEmptyTitle => 'Loved folder is empty'; + String get collectionLovedEmptyTitle => 'Le dossier « Favoris » est vide'; @override String get collectionLovedEmptySubtitle => - 'Tap love on tracks to keep your favorites'; + 'Appuyez sur les morceaux que vous aimez pour les ajouter à vos favoris'; @override - String get collectionFavoriteArtistsEmptyTitle => 'No favorite artists yet'; + String get collectionFavoriteArtistsEmptyTitle => + 'Pas encore d\'artistes préférés'; @override String get collectionFavoriteArtistsEmptySubtitle => - 'Tap the heart on an artist page to keep them here'; + 'Appuyez sur le cœur sur la page d\'un artiste pour le garder ici'; @override - String get collectionPlaylistEmptyTitle => 'Playlist is empty'; + String get collectionPlaylistEmptyTitle => 'La playlist est vide'; @override String get collectionPlaylistEmptySubtitle => - 'Long-press + on any track to add it here'; + 'Appuyez longuement sur le bouton « + » sur n\'importe quel morceau pour l\'ajouter ici'; @override - String get collectionRemoveFromPlaylist => 'Remove from playlist'; + String get collectionRemoveFromPlaylist => 'Supprimer de la playlist'; @override - String get collectionRemoveFromFolder => 'Remove from folder'; + String get collectionRemoveFromFolder => 'Supprimer du dossier'; @override String collectionRemoved(String trackName) { - return '\"$trackName\" removed'; + return '« $trackName » supprimé'; } @override String collectionAddedToLoved(String trackName) { - return '\"$trackName\" added to Loved'; + return '\"$trackName\" ajouté aux Favoris'; } @override String collectionRemovedFromLoved(String trackName) { - return '\"$trackName\" removed from Loved'; + return '\"$trackName\" supprimé des Favoris'; } @override String collectionAddedToWishlist(String trackName) { - return '\"$trackName\" added to Wishlist'; + return '« $trackName » a été ajouté à la liste de souhaits'; } @override String collectionRemovedFromWishlist(String trackName) { - return '\"$trackName\" removed from Wishlist'; + return '« $trackName » a été supprimé de la liste de souhaits'; } @override String collectionAddedToFavoriteArtists(String artistName) { - return '\"$artistName\" added to Favorite Artists'; + return '« $artistName » a été ajouté à vos artistes préférés'; } @override String collectionRemovedFromFavoriteArtists(String artistName) { - return '\"$artistName\" removed from Favorite Artists'; + return '« $artistName » a été supprimé de vos artistes favoris'; } @override - String get trackOptionAddToLoved => 'Add to Loved'; + String get trackOptionAddToLoved => 'Ajouter aux Favoris'; @override - String get trackOptionRemoveFromLoved => 'Remove from Loved'; + String get trackOptionRemoveFromLoved => 'Supprimer des Favoris'; @override - String get trackOptionAddToWishlist => 'Add to Wishlist'; + String get trackOptionAddToWishlist => 'Ajouter à la liste de souhaits'; @override - String get trackOptionRemoveFromWishlist => 'Remove from Wishlist'; + String get trackOptionRemoveFromWishlist => + 'Supprimer de la liste de souhaits'; @override - String get artistOptionAddToFavorites => 'Add to Favorite Artists'; + String get artistOptionAddToFavorites => 'Ajouter aux Artistes Favoris'; @override - String get artistOptionRemoveFromFavorites => 'Remove from Favorite Artists'; + String get artistOptionRemoveFromFavorites => + 'Supprimer des Artistes Favoris'; @override - String get collectionPlaylistChangeCover => 'Change cover image'; + String get collectionPlaylistChangeCover => 'Changer l\'image de couverture'; @override - String get collectionPlaylistRemoveCover => 'Remove cover image'; + String get collectionPlaylistRemoveCover => + 'Supprimer l\'image de couverture'; @override String selectionShareCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'titres', + one: 'titre', ); - return 'Share $count $_temp0'; + return 'Partager $count $_temp0'; } @override - String get selectionShareNoFiles => 'No shareable files found'; + String get selectionShareNoFiles => + 'Aucun fichier partageable n\'a été trouvé'; @override String selectionConvertCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'titres', + one: 'titre', ); - return 'Convert $count $_temp0'; + return 'Convertir $count $_temp0'; } @override - String get selectionConvertNoConvertible => 'No convertible tracks selected'; + String get selectionConvertNoConvertible => + 'Aucune piste convertible sélectionnée'; @override - String get selectionBatchConvertConfirmTitle => 'Batch Convert'; + String get selectionBatchConvertConfirmTitle => 'Conversion par lots'; @override String selectionBatchConvertConfirmMessage( @@ -2745,10 +2819,10 @@ class AppLocalizationsFr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'titres', + one: 'titre', ); - return 'Convert $count $_temp0 to $format at $bitrate?\n\nOriginal files will be deleted after conversion.'; + return 'Convertir $count $_temp0 au format $format avec un débit binaire de $bitrate ?\n\nLes fichiers d\'origine seront supprimés après la conversion.'; } @override @@ -2756,181 +2830,191 @@ class AppLocalizationsFr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'titres', + one: 'titre', ); - return 'Convert $count $_temp0 to $format? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.'; + return 'Convertir $count $_temp0 au format $format ? (Sans perte — aucune perte de qualité)\n\nLes fichiers d\'origine seront supprimés après la conversion.'; } @override String selectionBatchConvertProgress(int current, int total) { - return 'Converting $current of $total...'; + return 'Conversion de $current sur $total...'; } @override String selectionBatchConvertSuccess(int success, int total, String format) { - return 'Converted $success of $total tracks to $format'; + return '$success pistes sur $total ont été converties au format $format'; } @override String downloadedAlbumDownloadedCount(int count) { - return '$count downloaded'; + return '$count téléchargements'; } @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Artist folders use Album Artist when available'; + 'Dossier nommé d\'après la balise « Artiste de l\'album »'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => - 'Artist folders use Track Artist only'; + 'Dossier nommé d\'après la balise « Artiste » de la piste'; @override - String get lyricsProvidersTitle => 'Lyrics Providers'; + String get lyricsProvidersTitle => 'Priorité au fournisseur de paroles'; @override String get lyricsProvidersDescription => - 'Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.'; + 'Activer, désactiver et réorganiser les sources de paroles. Les sources sont parcourues de haut en bas jusqu\'à ce que les paroles soient trouvées.'; @override String get lyricsProvidersInfoText => - 'Extension lyrics providers always run before built-in providers. At least one provider must remain enabled.'; + 'Les fournisseurs de paroles des extensions s\'exécutent toujours avant les fournisseurs intégrés. Au moins un fournisseur doit rester activé.'; @override String lyricsProvidersEnabledSection(int count) { - return 'Enabled ($count)'; + return 'Activé ($count)'; } @override String lyricsProvidersDisabledSection(int count) { - return 'Disabled ($count)'; + return 'Désactivés ($count)'; } @override String get lyricsProvidersAtLeastOne => - 'At least one provider must remain enabled'; + 'Au moins un fournisseur doit rester activé'; @override - String get lyricsProvidersSaved => 'Lyrics provider priority saved'; + String get lyricsProvidersSaved => + 'Priorité du fournisseur de paroles enregistrée'; @override String get lyricsProvidersDiscardContent => - 'You have unsaved changes that will be lost.'; + 'Vous avez des modifications non enregistrées qui seront perdues.'; @override - String get lyricsProviderLrclibDesc => 'Open-source synced lyrics database'; + String get lyricsProviderLrclibDesc => + 'Base de données open source de paroles synchronisées'; @override String get lyricsProviderNeteaseDesc => - 'NetEase Cloud Music (good for Asian songs)'; + 'NetEase Cloud Music (idéal pour les titres asiatiques)'; @override String get lyricsProviderMusixmatchDesc => - 'Largest lyrics database (multi-language)'; + 'La plus grande base de données de paroles (multilingue)'; @override String get lyricsProviderAppleMusicDesc => - 'Word-by-word synced lyrics (via proxy)'; + 'Paroles synchronisées mot à mot (via un proxy)'; @override String get lyricsProviderQqMusicDesc => - 'QQ Music (good for Chinese songs, via proxy)'; + 'QQ Music (idéal pour écouter des titres chinois, via un proxy)'; @override - String get lyricsProviderExtensionDesc => 'Extension provider'; + String get lyricsProviderExtensionDesc => 'Fournisseur d\'extensions'; @override - String get safMigrationTitle => 'Storage Update Required'; + String get safMigrationTitle => 'Mise à jour du stockage requise'; @override String get safMigrationMessage1 => - 'SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.'; + 'SpotiFLAC utilise désormais le framework d\'accès au stockage Android (SAF) pour les téléchargements. Cela permet de résoudre les erreurs « autorisation refusée » sur Android 10 et versions ultérieures.'; @override String get safMigrationMessage2 => - 'Please select your download folder again to switch to the new storage system.'; + 'Veuillez sélectionner à nouveau votre dossier de téléchargement pour passer au nouveau système de stockage.'; @override - String get safMigrationSuccess => 'Download folder updated to SAF mode'; + String get safMigrationSuccess => + 'Le dossier de téléchargement a été mis à jour en mode SAF'; @override - String get settingsDonate => 'Donate'; + String get settingsDonate => 'Soutien au développement'; @override - String get settingsDonateSubtitle => 'Support SpotiFLAC-Mobile development'; + String get settingsDonateSubtitle => 'Offrez un café au développeur'; @override - String get tooltipLoveAll => 'Love All'; + String get tooltipLoveAll => 'Tout aimer'; @override - String get tooltipAddToPlaylist => 'Add to Playlist'; + String get tooltipAddToPlaylist => 'Ajouter à la playlist'; @override String snackbarRemovedTracksFromLoved(int count) { - return 'Removed $count tracks from Loved'; + return '$count titres supprimés des Favoris'; } @override String snackbarAddedTracksToLoved(int count) { - return 'Added $count tracks to Loved'; + return '$count titres ajoutés aux Favoris'; } @override - String get dialogDownloadAllTitle => 'Download All'; + String get dialogDownloadAllTitle => 'Tout télécharger'; @override String dialogDownloadAllMessage(int count) { - return 'Download $count tracks?'; + return 'Télécharger $count titres ?'; } @override - String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; + String get homeSkipAlreadyDownloaded => + 'Ignorer les morceaux déjà téléchargés'; @override - String get homeGoToAlbum => 'Go to Album'; + String get homeGoToAlbum => 'Aller à l\'album'; @override - String get homeAlbumInfoUnavailable => 'Album info not available'; + String get homeAlbumInfoUnavailable => + 'Informations sur l\'album non disponibles'; @override - String get snackbarLoadingCueSheet => 'Loading CUE sheet...'; + String get snackbarLoadingCueSheet => 'Chargement de la liste CUE...'; @override - String get snackbarMetadataSaved => 'Metadata saved successfully'; + String get snackbarMetadataSaved => + 'Les métadonnées ont été enregistrées avec succès'; @override - String get snackbarFailedToEmbedLyrics => 'Failed to embed lyrics'; + String get snackbarFailedToEmbedLyrics => + 'Impossible d\'intégrer les paroles'; @override - String get snackbarFailedToWriteStorage => 'Failed to write back to storage'; + String get snackbarFailedToWriteStorage => + 'Échec de l\'écriture sur le support de stockage'; @override String snackbarError(String error) { - return 'Error: $error'; + return 'Erreur : $error'; } @override - String get snackbarNoActionDefined => 'No action defined for this button'; + String get snackbarNoActionDefined => + 'Aucune action n\'est associée à ce bouton'; @override - String get noTracksFoundForAlbum => 'No tracks found for this album'; + String get noTracksFoundForAlbum => 'Aucun morceau trouvé pour cet album'; @override String get downloadLocationSubtitle => - 'Choose storage mode for downloaded files.'; + 'Choisissez l\'emplacement où enregistrer vos morceaux téléchargés'; @override - String get storageModeAppFolder => 'App folder (non-SAF)'; + String get storageModeAppFolder => 'Dossier « Applications » (recommandé)'; @override - String get storageModeAppFolderSubtitle => 'Use default Music/SpotiFLAC path'; + String get storageModeAppFolderSubtitle => + 'Enregistrement par défaut dans le dossier « Musique/SpotiFLAC »'; @override - String get storageModeSaf => 'SAF folder'; + String get storageModeSaf => 'Dossier personnalisé (SAF)'; @override String get storageModeSafSubtitle => - 'Pick folder via Android Storage Access Framework'; + 'Choisissez n\'importe quel dossier, y compris la carte SD'; @override String downloadFilenameDescription( @@ -2942,166 +3026,172 @@ class AppLocalizationsFr extends AppLocalizations { Object track, Object year, ) { - return 'Customize how your files are named.'; + return 'Utilisez $artist, $title, $album, $track, $year, $date et $disc comme variables de remplacement.'; } @override - String get downloadFilenameInsertTag => 'Tap to insert tag:'; + String get downloadFilenameInsertTag => 'Appuyez pour insérer une balise :'; @override - String get downloadSeparateSinglesEnabled => 'Albums/ and Singles/ folders'; + String get downloadSeparateSinglesEnabled => + 'Les singles et les EP sont enregistrés dans un dossier séparé'; @override - String get downloadSeparateSinglesDisabled => 'All files in same structure'; + String get downloadSeparateSinglesDisabled => + 'Les singles et les albums sont enregistrés dans le même dossier'; @override - String get downloadArtistNameFilters => 'Artist Name Filters'; + String get downloadArtistNameFilters => 'Filtres par nom d\'artiste'; @override String get downloadCreatePlaylistSourceFolder => - 'Create playlist source folder'; + 'Dossier source de la playlist'; @override String get downloadCreatePlaylistSourceFolderEnabled => - 'Playlist downloads use Playlist/ plus your normal folder structure.'; + 'Un sous-dossier est créé pour chaque playlist'; @override String get downloadCreatePlaylistSourceFolderDisabled => - 'Playlist downloads use the normal folder structure only.'; + 'Tous les morceaux sont enregistrés directement dans le dossier de téléchargement'; @override String get downloadCreatePlaylistSourceFolderRedundant => - 'By Playlist already places downloads inside a playlist folder.'; + 'Géré par les paramètres d\'organisation des dossiers'; @override - String get downloadSongLinkRegion => 'SongLink Region'; + String get downloadSongLinkRegion => 'Région SongLink'; @override - String get downloadNetworkCompatibilityMode => 'Network compatibility mode'; + String get downloadNetworkCompatibilityMode => 'Mode de compatibilité réseau'; @override String get downloadNetworkCompatibilityModeEnabled => - 'Enabled: try HTTP + accept invalid TLS certificates (unsafe)'; + 'Utilisation des paramètres TLS hérités pour les réseaux plus anciens'; @override String get downloadNetworkCompatibilityModeDisabled => - 'Off: strict HTTPS certificate validation (recommended)'; + 'Utilisation des paramètres réseau par défaut'; @override String get downloadSelectServiceToEnable => - 'Select a built-in service to enable'; + 'Sélectionnez Tidal ou Qobuz pour activer cette option'; @override String get downloadSelectTidalQobuz => - 'Select Tidal or Qobuz above to configure quality'; + 'Sélectionnez Tidal ou Qobuz pour choisir la qualité audio'; @override String get downloadEmbedLyricsDisabled => - 'Disabled while Embed Metadata is turned off'; + 'Activez d\'abord l\'intégration des métadonnées'; @override String get downloadNeteaseIncludeTranslation => - 'Netease: Include Translation'; + 'Netease : inclure la traduction'; @override String get downloadNeteaseIncludeTranslationEnabled => - 'Append translated lyrics when available'; + 'Lignes de traduction en chinois incluses'; @override String get downloadNeteaseIncludeTranslationDisabled => - 'Use original lyrics only'; + 'Paroles originales uniquement'; @override String get downloadNeteaseIncludeRomanization => - 'Netease: Include Romanization'; + 'Netease : inclure la romanisation'; @override String get downloadNeteaseIncludeRomanizationEnabled => - 'Append romanized lyrics when available'; + 'Lignes de romanisation incluses'; @override - String get downloadNeteaseIncludeRomanizationDisabled => 'Disabled'; + String get downloadNeteaseIncludeRomanizationDisabled => + 'Pas de romanisation'; @override - String get downloadAppleQqMultiPerson => 'Apple/QQ Multi-Person Word-by-Word'; + String get downloadAppleQqMultiPerson => + 'Apple / QQ : Paroles pour plusieurs personnes'; @override String get downloadAppleQqMultiPersonEnabled => - 'Enable v1/v2 speaker and [bg:] tags'; + 'Étiquettes d\'intervenants incluses pour les duos et les morceaux en groupe'; @override String get downloadAppleQqMultiPersonDisabled => - 'Simplified word-by-word formatting'; + 'Paroles standard sans indication du haut-parleur'; @override - String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; + String get downloadAppleElrcWordSync => + 'Synchronisation des paroles Apple Music eLRC'; @override String get downloadAppleElrcWordSyncEnabled => - 'Raw word-by-word timestamps preserved'; + 'Conservation des horodatages bruts mot à mot'; @override String get downloadAppleElrcWordSyncDisabled => - 'Safer line-by-line Apple Music lyrics'; + 'Paroles d\'Apple Music, ligne par ligne, en toute sécurité'; @override - String get downloadMusixmatchLanguage => 'Musixmatch Language'; + String get downloadMusixmatchLanguage => 'Langue Musixmatch'; @override - String get downloadMusixmatchLanguageAuto => 'Auto (original)'; + String get downloadMusixmatchLanguageAuto => 'Auto (langue d\'origine)'; @override - String get downloadFilterContributing => - 'Filter contributing artists in Album Artist'; + String get downloadFilterContributing => 'Filtrer les artistes participants'; @override String get downloadFilterContributingEnabled => - 'Album Artist metadata uses primary artist only'; + 'Les artistes ayant contribué à l\'album ont été supprimés du nom du dossier « Artiste de l\'album »'; @override String get downloadFilterContributingDisabled => - 'Keep full Album Artist metadata value'; + 'Chaîne « Artiste » de l\'album complet utilisée'; @override - String get downloadProvidersNoneEnabled => 'None enabled'; + String get downloadProvidersNoneEnabled => 'Aucun fournisseur n\'est activé'; @override - String get downloadMusixmatchLanguageCode => 'Language code'; + String get downloadMusixmatchLanguageCode => 'Code de langue'; @override - String get downloadMusixmatchLanguageHint => 'auto / en / es / ja'; + String get downloadMusixmatchLanguageHint => 'par exemple : en, de, ja'; @override String get downloadMusixmatchLanguageDesc => - 'Set preferred language code (example: en, es, ja). Leave empty for auto.'; + 'Saisissez un code de langue BCP-47 (par exemple : en, de, ja) pour demander les paroles traduites à Musixmatch.'; @override String get downloadMusixmatchAuto => 'Auto'; @override - String get downloadNetworkAnySubtitle => 'WiFi + Mobile Data'; + String get downloadNetworkAnySubtitle => + 'Utilisez le Wi-Fi ou les données mobiles'; @override String get downloadNetworkWifiOnlySubtitle => - 'Pause downloads on mobile data'; + 'Les téléchargements sont mis en pause lors de l\'utilisation des données mobiles'; @override String get downloadSongLinkRegionDesc => - 'Used as userCountry for SongLink API lookup.'; + 'Région utilisée lors de la résolution des liens vers les morceaux via SongLink. Sélectionnez le pays dans lequel vos services de streaming sont disponibles.'; @override - String get snackbarUnsupportedAudioFormat => 'Unsupported audio format'; + String get snackbarUnsupportedAudioFormat => + 'Format audio non pris en charge'; @override - String get cacheRefresh => 'Refresh'; + String get cacheRefresh => 'Actualiser'; @override String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { String _temp0 = intl.Intl.pluralLogic( trackCount, locale: localeName, - other: 'tracks', - one: 'track', + other: 'titres', + one: 'titre', ); String _temp1 = intl.Intl.pluralLogic( playlistCount, @@ -3109,7 +3199,7 @@ class AppLocalizationsFr extends AppLocalizations { other: 'playlists', one: 'playlist', ); - return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + return 'Télécharger $trackCount $_temp0 depuis $playlistCount $_temp1 ?'; } @override @@ -3120,15 +3210,16 @@ class AppLocalizationsFr extends AppLocalizations { other: 'playlists', one: 'playlist', ); - return 'Download $count $_temp0'; + return 'Télécharger $count $_temp0'; } @override - String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + String get bulkDownloadSelectPlaylists => + 'Sélectionnez les playlists à télécharger'; @override String get snackbarSelectedPlaylistsEmpty => - 'Selected playlists have no tracks'; + 'Les playlists sélectionnées ne contiennent aucun morceau'; @override String playlistsCount(int count) { @@ -3142,57 +3233,57 @@ class AppLocalizationsFr extends AppLocalizations { } @override - String get editMetadataAutoFill => 'Auto-fill from online'; + String get editMetadataAutoFill => 'Remplissage automatique en ligne'; @override String get editMetadataAutoFillDesc => - 'Select fields to fill automatically from online metadata'; + 'Sélectionnez les champs à remplir automatiquement à partir des métadonnées en ligne'; @override - String get editMetadataAutoFillFetch => 'Fetch & Fill'; + String get editMetadataAutoFillFetch => 'Récupérer & remplir'; @override - String get editMetadataAutoFillSearching => 'Searching online...'; + String get editMetadataAutoFillSearching => 'Recherche en ligne...'; @override String get editMetadataAutoFillNoResults => - 'No matching metadata found online'; + 'Aucune métadonnée correspondante n\'a été trouvée en ligne'; @override String editMetadataAutoFillDone(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'fields', - one: 'field', + other: 'champs', + one: 'champ', ); - return 'Filled $count $_temp0 from online metadata'; + return '$count $_temp0 renseignés à partir des métadonnées en ligne'; } @override String get editMetadataAutoFillNoneSelected => - 'Select at least one field to auto-fill'; + 'Sélectionnez au moins un champ pour le remplir automatiquement'; @override - String get editMetadataFieldTitle => 'Title'; + String get editMetadataFieldTitle => 'Titre'; @override - String get editMetadataFieldArtist => 'Artist'; + String get editMetadataFieldArtist => 'Artiste'; @override String get editMetadataFieldAlbum => 'Album'; @override - String get editMetadataFieldAlbumArtist => 'Album Artist'; + String get editMetadataFieldAlbumArtist => 'Artiste de l\'album'; @override String get editMetadataFieldDate => 'Date'; @override - String get editMetadataFieldTrackNum => 'Track #'; + String get editMetadataFieldTrackNum => 'Piste n°'; @override - String get editMetadataFieldDiscNum => 'Disc #'; + String get editMetadataFieldDiscNum => 'Disque n°'; @override String get editMetadataFieldGenre => 'Genre'; @@ -3204,35 +3295,35 @@ class AppLocalizationsFr extends AppLocalizations { String get editMetadataFieldLabel => 'Label'; @override - String get editMetadataFieldCopyright => 'Copyright'; + String get editMetadataFieldCopyright => 'Droits d\'auteur'; @override - String get editMetadataFieldCover => 'Cover Art'; + String get editMetadataFieldCover => 'Illustration de couverture'; @override - String get editMetadataSelectAll => 'All'; + String get editMetadataSelectAll => 'Tout'; @override - String get editMetadataSelectEmpty => 'Empty only'; + String get editMetadataSelectEmpty => 'Vide uniquement'; @override String queueDownloadingCount(int count) { - return 'Downloading ($count)'; + return 'Téléchargement ($count)'; } @override - String get queueDownloadedHeader => 'Downloaded'; + String get queueDownloadedHeader => 'Téléchargé'; @override - String get queueFilteringIndicator => 'Filtering...'; + String get queueFilteringIndicator => 'Filtrage...'; @override String queueTrackCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count tracks', - one: '1 track', + other: '$count titres', + one: '1 titre', ); return '$_temp0'; } @@ -3249,76 +3340,80 @@ class AppLocalizationsFr extends AppLocalizations { } @override - String get queueEmptyAlbums => 'No album downloads'; + String get queueEmptyAlbums => 'Aucun album téléchargé'; @override String get queueEmptyAlbumsSubtitle => - 'Download multiple tracks from an album to see them here'; + 'Téléchargez plusieurs titres d\'un album pour les écouter ici'; @override - String get queueEmptySingles => 'No single downloads'; + String get queueEmptySingles => 'Pas de téléchargement individuel'; @override String get queueEmptySinglesSubtitle => - 'Single track downloads will appear here'; + 'Les téléchargements de titres individuels apparaîtront ici'; @override - String get queueEmptyHistory => 'No download history'; + String get queueEmptyHistory => 'Aucun historique de téléchargement'; @override - String get queueEmptyHistorySubtitle => 'Downloaded tracks will appear here'; + String get queueEmptyHistorySubtitle => + 'Les morceaux téléchargés apparaîtront ici'; @override - String get selectionAllPlaylistsSelected => 'All playlists selected'; + String get selectionAllPlaylistsSelected => + 'Toutes les playlists sélectionnées'; @override - String get selectionTapPlaylistsToSelect => 'Tap playlists to select'; + String get selectionTapPlaylistsToSelect => + 'Appuyez sur les playlists pour les sélectionner'; @override - String get selectionSelectPlaylistsToDelete => 'Select playlists to delete'; + String get selectionSelectPlaylistsToDelete => + 'Sélectionnez les playlists à supprimer'; @override - String get audioAnalysisTitle => 'Audio Quality Analysis'; + String get audioAnalysisTitle => 'Analyse de la qualité audio'; @override String get audioAnalysisDescription => - 'Verify lossless quality with spectrum analysis'; + 'Vérifier la qualité sans perte à l\'aide d\'une analyse spectrale'; @override - String get audioAnalysisAnalyzing => 'Analyzing audio...'; + String get audioAnalysisAnalyzing => 'Analyse audio en cours...'; @override - String get audioAnalysisSampleRate => 'Sample Rate'; + String get audioAnalysisSampleRate => 'Fréquence d\'échantillonnage'; @override String get audioAnalysisCodec => 'Codec'; @override - String get audioAnalysisContainer => 'Container'; + String get audioAnalysisContainer => 'Conteneur'; @override - String get audioAnalysisDecodedFormat => 'Decoded Format'; + String get audioAnalysisDecodedFormat => 'Format décodé'; @override - String get audioAnalysisBitDepth => 'Bit Depth'; + String get audioAnalysisBitDepth => 'Nombre de bits'; @override - String get audioAnalysisChannels => 'Channels'; + String get audioAnalysisChannels => 'Chaînes'; @override - String get audioAnalysisDuration => 'Duration'; + String get audioAnalysisDuration => 'Durée'; @override String get audioAnalysisNyquist => 'Nyquist'; @override - String get audioAnalysisFileSize => 'Size'; + String get audioAnalysisFileSize => 'Taille'; @override - String get audioAnalysisDynamicRange => 'Dynamic Range'; + String get audioAnalysisDynamicRange => 'Plage dynamique'; @override - String get audioAnalysisPeak => 'Peak'; + String get audioAnalysisPeak => 'Pic'; @override String get audioAnalysisRms => 'RMS'; @@ -3330,59 +3425,60 @@ class AppLocalizationsFr extends AppLocalizations { String get audioAnalysisTruePeak => 'True Peak'; @override - String get audioAnalysisClipping => 'Clipping'; + String get audioAnalysisClipping => 'Coupure'; @override - String get audioAnalysisNoClipping => 'No clipping'; + String get audioAnalysisNoClipping => 'Pas de coupure'; @override - String get audioAnalysisSpectralCutoff => 'Spectral Cutoff'; + String get audioAnalysisSpectralCutoff => 'Limite spectrale'; @override - String get audioAnalysisChannelStats => 'Per-channel Stats'; + String get audioAnalysisChannelStats => 'Statistiques par chaîne'; @override - String get audioAnalysisSamples => 'Samples'; + String get audioAnalysisSamples => 'Échantillons'; @override - String get audioAnalysisRescan => 'Re-analyze'; + String get audioAnalysisRescan => 'Réanalyser'; @override - String get audioAnalysisRescanning => 'Re-analyzing audio...'; + String get audioAnalysisRescanning => 'Réanalyse du fichier audio...'; @override String extensionsSearchWith(String providerName) { - return 'Search with $providerName'; + return 'Rechercher avec $providerName'; } @override - String get extensionsHomeFeedProvider => 'Home Feed Provider'; + String get extensionsHomeFeedProvider => 'Fournisseur de flux RSS'; @override String get extensionsHomeFeedDescription => - 'Choose which extension provides the home feed on the main screen'; + 'Choisissez l\'extension qui affiche le fil d\'actualité sur l\'écran principal'; @override String get extensionsHomeFeedAuto => 'Auto'; @override String get extensionsHomeFeedAutoSubtitle => - 'Automatically select the best available'; + 'Sélectionnez automatiquement la meilleure option disponible'; @override String get extensionsHomeFeedOff => 'Off'; @override String get extensionsHomeFeedOffSubtitle => - 'Do not show the home feed on the main screen'; + 'Ne pas afficher le fil d\'actualité sur l\'écran principal'; @override String extensionsHomeFeedUse(String extensionName) { - return 'Use $extensionName home feed'; + return 'Utiliser le fil d\'actualité de $extensionName'; } @override - String get extensionsNoHomeFeedExtensions => 'No extensions with home feed'; + String get extensionsNoHomeFeedExtensions => + 'Aucune extension avec le flux principal'; @override String get sortAlphaAsc => 'A-Z'; @@ -3391,89 +3487,99 @@ class AppLocalizationsFr extends AppLocalizations { String get sortAlphaDesc => 'Z-A'; @override - String get cancelDownloadTitle => 'Cancel download?'; + String get cancelDownloadTitle => 'Annuler le téléchargement ?'; @override String cancelDownloadContent(String trackName) { - return 'This will cancel the active download for \"$trackName\".'; + return 'Cela annulera le téléchargement en cours de « $trackName ».'; } @override - String get cancelDownloadKeep => 'Keep'; + String get cancelDownloadKeep => 'Conserver'; @override - String get metadataSaveFailedFfmpeg => 'Failed to save metadata via FFmpeg'; + String get metadataSaveFailedFfmpeg => + 'Échec de l\'enregistrement des métadonnées via FFmpeg'; @override String get metadataSaveFailedStorage => - 'Failed to write metadata back to storage'; + 'Échec de la réécriture des métadonnées sur le support de stockage'; @override String snackbarFolderPickerFailed(String error) { - return 'Failed to open folder picker: $error'; + return 'Impossible d\'ouvrir le sélecteur de dossiers : $error'; } @override - String get errorLoadAlbum => 'Failed to load album'; + String get errorLoadAlbum => 'Impossible de charger l\'album'; @override - String get errorLoadPlaylist => 'Failed to load playlist'; + String get errorLoadPlaylist => 'Impossible de charger la playlist'; @override - String get errorLoadArtist => 'Failed to load artist'; + String get errorLoadArtist => 'Impossible de charger l\'artiste'; @override - String get notifChannelDownloadName => 'Download Progress'; + String get notifChannelDownloadName => 'Progression du téléchargement'; @override - String get notifChannelDownloadDesc => 'Shows download progress for tracks'; + String get notifChannelDownloadDesc => + 'Affiche la progression du téléchargement des morceaux'; @override - String get notifChannelLibraryScanName => 'Library Scan'; + String get notifChannelLibraryScanName => 'Analyse de la bibliothèque'; @override - String get notifChannelLibraryScanDesc => 'Shows local library scan progress'; + String get notifChannelLibraryScanDesc => + 'Affiche la progression de la numérisation dans la bibliothèque locale'; @override String notifDownloadingTrack(String trackName) { - return 'Downloading $trackName'; + return 'Téléchargement de $trackName'; } @override String notifFinalizingTrack(String trackName) { - return 'Finalizing $trackName'; + return 'Finalisation de $trackName'; } @override - String get notifEmbeddingMetadata => 'Embedding metadata...'; + String get notifEmbeddingMetadata => 'Intégration des métadonnées...'; @override String notifAlreadyInLibraryCount(int completed, int total) { - return 'Already in Library ($completed/$total)'; + return 'Déjà dans la bibliothèque ($completed/$total)'; } @override - String get notifAlreadyInLibrary => 'Already in Library'; + String get notifAlreadyInLibrary => 'Déjà dans la bibliothèque'; @override String notifDownloadCompleteCount(int completed, int total) { - return 'Download Complete ($completed/$total)'; + return 'Téléchargement terminé ($completed/$total)'; } @override - String get notifDownloadComplete => 'Download Complete'; + String get notifDownloadComplete => 'Télécharger l\'intégralité'; @override String notifDownloadsFinished(int completed, int failed) { - return 'Downloads Finished ($completed done, $failed failed)'; + return 'Téléchargements terminés ($completed terminé, $failed en échec)'; } @override - String get notifAllDownloadsComplete => 'All Downloads Complete'; + String get notifAllDownloadsComplete => + 'Tous les téléchargements sont terminés'; @override String notifTracksDownloadedSuccess(int count) { - return '$count tracks downloaded successfully'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count pistes téléchargées avec succès', + one: '1 piste téléchargée avec succès', + ); + return '$_temp0'; } @override @@ -3481,34 +3587,34 @@ class AppLocalizationsFr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( completed, locale: localeName, - other: '$completed tracks downloaded', - one: '1 track downloaded', + other: '$completed titres téléchargés', + one: '1 titre téléchargé', ); String _temp1 = intl.Intl.pluralLogic( failed, locale: localeName, - other: '$failed failed', - one: '1 failed', + other: '$failed échecs', + one: '1 échec', ); return '$_temp0, $_temp1'; } @override - String get notifDownloadsCanceledTitle => 'Downloads canceled'; + String get notifDownloadsCanceledTitle => 'Téléchargements annulés'; @override String notifDownloadsCanceledBody(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count downloads canceled by user', - one: '1 download canceled by user', + other: '$count téléchargements annulés par l\'utilisateur', + one: '1 téléchargement annulé par l\'utilisateur', ); return '$_temp0'; } @override - String get notifScanningLibrary => 'Scanning local library'; + String get notifScanningLibrary => 'Numérisation de la bibliothèque locale'; @override String notifLibraryScanProgressWithTotal( @@ -3516,118 +3622,122 @@ class AppLocalizationsFr extends AppLocalizations { int total, int percentage, ) { - return '$scanned/$total files • $percentage%'; + return '$scanned/$total fichiers • $percentage %'; } @override String notifLibraryScanProgressNoTotal(int scanned, int percentage) { - return '$scanned files scanned • $percentage%'; + return '$scanned fichiers analysés • $percentage %'; } @override - String get notifLibraryScanComplete => 'Library scan complete'; + String get notifLibraryScanComplete => 'Analyse de la bibliothèque terminée'; @override String notifLibraryScanCompleteBody(int count) { - return '$count tracks indexed'; + return '$count titres indexés'; } @override String notifLibraryScanExcluded(int count) { - return '$count excluded'; + return '$count exclus'; } @override String notifLibraryScanErrors(int count) { - return '$count errors'; + return '$count erreurs'; } @override - String get notifLibraryScanFailed => 'Library scan failed'; + String get notifLibraryScanFailed => 'Échec de l\'analyse de la bibliothèque'; @override - String get notifLibraryScanCancelled => 'Library scan cancelled'; + String get notifLibraryScanCancelled => + 'Annulation de la numérisation de la bibliothèque'; @override - String get notifLibraryScanStopped => 'Scan stopped before completion.'; + String get notifLibraryScanStopped => + 'L\'analyse a été interrompue avant d\'être terminée.'; @override String notifDownloadingUpdate(String version) { - return 'Downloading SpotiFLAC Mobile v$version'; + return 'Télécharger SpotiFLAC v$version'; } @override String notifUpdateProgress(String received, String total, int percentage) { - return '$received / $total MB • $percentage%'; + return '$received / $total Mo • $percentage%'; } @override - String get notifUpdateReady => 'Update Ready'; + String get notifUpdateReady => 'Prêt pour la mise à jour'; @override String notifUpdateReadyBody(String version) { - return 'SpotiFLAC Mobile v$version downloaded. Tap to install.'; + return 'SpotiFLAC v$version a été téléchargé. Appuyez pour l\'installer.'; } @override - String get notifUpdateFailed => 'Update Failed'; + String get notifUpdateFailed => 'Échec de la mise à jour'; @override String get notifUpdateFailedBody => - 'Could not download update. Try again later.'; + 'Impossible de télécharger la mise à jour. Veuillez réessayer plus tard.'; @override - String get searchTracks => 'Tracks'; + String get searchTracks => 'Titres'; @override - String get homeSearchHintDefault => 'Paste supported URL or search...'; + String get homeSearchHintDefault => + 'Collez une URL valide ou effectuez une recherche...'; @override String homeSearchHintProvider(String providerName) { - return 'Search with $providerName...'; + return 'Rechercher avec $providerName...'; } @override - String get homeImportCsvTooltip => 'Import CSV'; + String get homeImportCsvTooltip => 'Importer un fichier CSV'; @override - String get homeChangeSearchProviderTooltip => 'Change search provider'; + String get homeChangeSearchProviderTooltip => + 'Changer de moteur de recherche'; @override - String get actionPaste => 'Paste'; + String get actionPaste => 'Coller'; @override - String get searchTracksHint => 'Search tracks...'; + String get searchTracksHint => 'Rechercher des morceaux...'; @override - String get searchTracksEmptyPrompt => 'Search for tracks'; + String get searchTracksEmptyPrompt => 'Rechercher des morceaux'; @override - String get tutorialSearchHint => 'Paste or search...'; + String get tutorialSearchHint => 'Collez ou effectuez une recherche...'; @override - String get tutorialDownloadCompletedSemantics => 'Download completed'; + String get tutorialDownloadCompletedSemantics => 'Téléchargement terminé'; @override - String get tutorialDownloadInProgressSemantics => 'Download in progress'; + String get tutorialDownloadInProgressSemantics => 'Téléchargement en cours'; @override - String get tutorialStartDownloadSemantics => 'Start download'; + String get tutorialStartDownloadSemantics => 'Lancer le téléchargement'; @override - String get optionsEmbedMetadata => 'Embed Metadata'; + String get optionsEmbedMetadata => 'Intégrer des métadonnées'; @override String get optionsEmbedMetadataSubtitleOn => - 'Write metadata, cover art, and embedded lyrics to files'; + 'Ajouter des métadonnées, des pochettes et des paroles intégrées aux fichiers'; @override String get optionsEmbedMetadataSubtitleOff => - 'Disabled (advanced): skip all metadata embedding'; + 'Désactivé (avancé) : ignorer l\'intégration de toutes les métadonnées'; @override String get optionsMaxQualityCoverSubtitleDisabled => - 'Disabled when metadata embedding is off'; + 'Désactivé lorsque l\'intégration des métadonnées est désactivée'; @override String downloadFilenameHintExample(Object artist, Object title) { @@ -3635,136 +3745,139 @@ class AppLocalizationsFr extends AppLocalizations { } @override - String get trackCoverNoEmbeddedArt => 'No embedded album art found'; + String get trackCoverNoEmbeddedArt => + 'Aucune pochette d\'album n\'a été trouvée'; @override - String get trackCoverReplace => 'Replace Cover'; + String get trackCoverReplace => 'Remplacer la pochette'; @override - String get trackCoverPick => 'Pick Cover'; + String get trackCoverPick => 'Choisir une pochette'; @override - String get trackCoverClearSelected => 'Clear selected cover'; + String get trackCoverClearSelected => 'Supprimer la pochette sélectionnée'; @override - String get trackCoverCurrent => 'Current cover'; + String get trackCoverCurrent => 'Pochette actuelle'; @override - String get trackCoverSelected => 'Selected cover'; + String get trackCoverSelected => 'Pochette choisie'; @override String get trackCoverReplaceNotice => - 'The selected cover will replace the current embedded cover when you tap Save.'; + 'La pochette sélectionnée remplacera la pochette actuellement intégrée lorsque vous appuierez sur « Enregistrer ».'; @override - String get actionStop => 'Stop'; + String get actionStop => 'Arrêter'; @override - String get queueFinalizingDownload => 'Finalizing download'; + String get queueFinalizingDownload => 'Téléchargement en cours'; @override - String get queueDownloadedFileMissing => 'Downloaded file missing'; + String get queueDownloadedFileMissing => 'Fichier téléchargé manquant'; @override - String get queueDownloadCompleted => 'Download completed'; + String get queueDownloadCompleted => 'Téléchargement terminé'; @override - String get queueRateLimitTitle => 'Service rate limited'; + String get queueRateLimitTitle => 'Débit limité'; @override String get queueRateLimitMessage => - 'This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.'; + 'Ce titre est peut-être encore disponible. Patientez quelques minutes, réduisez le nombre de téléchargements simultanés, puis réessayez.'; @override String appearanceSelectAccentColor(String hex) { - return 'Select accent color $hex'; + return 'Sélectionnez une couleur d\'accentuation $hex'; } @override - String get logAutoScrollOn => 'Auto-scroll ON'; + String get logAutoScrollOn => 'Défilement automatique activé'; @override - String get logAutoScrollOff => 'Auto-scroll OFF'; + String get logAutoScrollOff => 'Défilement automatique désactivé'; @override - String get logCopyLogs => 'Copy logs'; + String get logCopyLogs => 'Copier les journaux'; @override - String get logClearSearch => 'Clear search'; + String get logClearSearch => 'Effacer la recherche'; @override - String get logIssueIspBlockingLabel => 'ISP BLOCKING DETECTED'; + String get logIssueIspBlockingLabel => 'BLOCAGE PAR LE FAI DÉTECTÉ'; @override String get logIssueIspBlockingDescription => - 'Your ISP may be blocking access to download services'; + 'Il se peut que votre fournisseur d\'accès Internet bloque l\'accès aux services de téléchargement'; @override String get logIssueIspBlockingSuggestion => - 'Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8'; + 'Essayez d\'utiliser un VPN ou de modifier vos paramètres DNS pour les remplacer par 1.1.1.1 ou 8.8.8.8'; @override - String get logIssueRateLimitedLabel => 'RATE LIMITED'; + String get logIssueRateLimitedLabel => 'NOMBRE LIMITÉ'; @override String get logIssueRateLimitedDescription => - 'Too many requests to the service'; + 'Trop de requêtes adressées au service'; @override String get logIssueRateLimitedSuggestion => - 'Wait a few minutes before trying again'; + 'Attendez quelques minutes avant de réessayer'; @override - String get logIssueNetworkErrorLabel => 'NETWORK ERROR'; + String get logIssueNetworkErrorLabel => 'ERREUR DE RÉSEAU'; @override - String get logIssueNetworkErrorDescription => 'Connection issues detected'; + String get logIssueNetworkErrorDescription => + 'Problèmes de connexion détectés'; @override - String get logIssueNetworkErrorSuggestion => 'Check your internet connection'; + String get logIssueNetworkErrorSuggestion => + 'Vérifiez votre connexion Internet'; @override - String get logIssueTrackNotFoundLabel => 'TRACK NOT FOUND'; + String get logIssueTrackNotFoundLabel => 'PISTE INTROUVABLE'; @override String get logIssueTrackNotFoundDescription => - 'Some tracks could not be found on download services'; + 'Certains titres n\'ont pas pu être trouvés sur les plateformes de téléchargement'; @override String get logIssueTrackNotFoundSuggestion => - 'The track may not be available in lossless quality'; + 'Il se peut que ce morceau ne soit pas disponible en qualité sans perte'; @override - String get clickableLookingUpArtist => 'Looking up artist...'; + String get clickableLookingUpArtist => 'Recherche d\'artiste...'; @override String clickableInformationUnavailable(String type) { - return '$type information not available'; + return 'Informations sur $type non disponibles'; } @override - String get extensionDetailsTags => 'Tags'; + String get extensionDetailsTags => 'Balises'; @override String get extensionDetailsInformation => 'Information'; @override - String get extensionUtilityFunctions => 'Utility Functions'; + String get extensionUtilityFunctions => 'Fonctions utilitaires'; @override - String get actionDismiss => 'Dismiss'; + String get actionDismiss => 'Ignorer'; @override - String get setupChangeFolderTooltip => 'Change folder'; + String get setupChangeFolderTooltip => 'Changer de dossier'; @override String a11yOpenTrackByArtist(String trackName, String artistName) { - return 'Open track $trackName by $artistName'; + return 'Écouter le morceau $trackName de $artistName'; } @override String a11yOpenItem(String itemType, String name) { - return 'Open $itemType $name'; + return 'Ouvrir $itemType $name'; } @override @@ -3772,10 +3885,10 @@ class AppLocalizationsFr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'items', + other: 'éléments', one: 'item', ); - return 'Open $title, $count $_temp0'; + return 'Ouvrir $title, $count $_temp0'; } @override @@ -3784,124 +3897,128 @@ class AppLocalizationsFr extends AppLocalizations { String artistName, int trackCount, ) { - return 'Open album $albumName by $artistName, $trackCount tracks'; + return 'Ouvrir l\'album $albumName de $artistName, $trackCount titres'; } @override String a11yTrackByArtist(String trackName, String artistName) { - return '$trackName by $artistName'; + return '$trackName de $artistName'; } @override String a11ySelectAlbum(String albumName) { - return 'Select album $albumName'; + return 'Sélectionnez l\'album $albumName'; } @override String a11yOpenAlbum(String albumName) { - return 'Open album $albumName'; + return 'Ouvrir l\'album $albumName'; } @override String get optionsDefaultSearchTabAlbums => 'Albums'; @override - String get optionsDefaultSearchTabTracks => 'Tracks'; + String get optionsDefaultSearchTabTracks => 'Titres'; @override - String get settingsFiles => 'Files & Folders'; + String get settingsFiles => 'Fichiers & Dossiers'; @override String get settingsFilesSubtitle => - 'Download location, filename, folder structure'; + 'Emplacement de téléchargement, nom de fichier, structure des dossiers'; @override - String get settingsMetadata => 'Metadata'; + String get settingsMetadata => 'Métadonnées'; @override String get settingsMetadataSubtitle => - 'Cover art, tags, ReplayGain, providers'; + 'Pochettes, balises, ReplayGain, fournisseurs'; @override - String get settingsLyrics => 'Lyrics'; + String get settingsLyrics => 'Paroles'; @override String get settingsLyricsSubtitle => - 'Embed, mode, providers, language options'; + 'Intégration, mode, fournisseurs, options linguistiques'; @override - String get settingsApp => 'App'; + String get settingsApp => 'Application'; @override - String get settingsAppSubtitle => 'Updates, data, extension repo, debug'; + String get settingsAppSubtitle => + 'Mises à jour, données, dépôt d\'extension, débogage'; @override - String get sectionMetadataProviders => 'Providers'; + String get sectionMetadataProviders => 'Fournisseurs'; @override - String get sectionDuplicates => 'Duplicates'; + String get sectionDuplicates => 'Doublons'; @override - String get sectionLyricsProviderOptions => 'Provider Options'; + String get sectionLyricsProviderOptions => 'Options du fournisseur'; @override - String get metadataProvidersTitle => 'Metadata Provider Priority'; + String get metadataProvidersTitle => + 'Priorité des fournisseurs de métadonnées'; @override String get metadataProvidersSubtitle => - 'Drag to set search and metadata source order'; + 'Faites glisser pour définir l\'ordre des sources de recherche et de métadonnées'; @override - String get downloadDeduplication => 'Skip Duplicate Downloads'; + String get downloadDeduplication => 'Éviter les téléchargements en double'; @override String get downloadDeduplicationEnabled => - 'Already-downloaded tracks will be skipped'; + 'Les morceaux déjà téléchargés seront ignorés'; @override String get downloadDeduplicationDisabled => - 'All tracks will be downloaded regardless of history'; + 'Tous les morceaux seront téléchargés, quel que soit l\'historique'; @override - String get downloadFallbackExtensions => 'Fallback Extensions'; + String get downloadFallbackExtensions => 'Extensions de secours'; @override String get downloadFallbackExtensionsSubtitle => - 'Choose which extensions can be used as fallback'; + 'Choisissez les extensions pouvant servir de solution de secours'; @override - String get editMetadataFieldDateHint => 'YYYY-MM-DD or YYYY'; + String get editMetadataFieldDateHint => 'AAAA-MM-JJ ou AAAA'; @override - String get editMetadataFieldTrackTotal => 'Track Total'; + String get editMetadataFieldTrackTotal => 'Total des pistes'; @override - String get editMetadataFieldDiscTotal => 'Disc Total'; + String get editMetadataFieldDiscTotal => 'Total des disques'; @override - String get editMetadataFieldComposer => 'Composer'; + String get editMetadataFieldComposer => 'Compositeur'; @override - String get editMetadataFieldComment => 'Comment'; + String get editMetadataFieldComment => 'Commentaire'; @override - String get editMetadataAdvanced => 'Advanced'; + String get editMetadataAdvanced => 'Avancé'; @override - String get libraryFilterMetadataMissingTrackNumber => 'Missing track number'; + String get libraryFilterMetadataMissingTrackNumber => + 'Numéro de piste manquant'; @override - String get libraryFilterMetadataMissingDiscNumber => 'Missing disc number'; + String get libraryFilterMetadataMissingDiscNumber => + 'Numéro de disque manquant'; @override - String get libraryFilterMetadataMissingArtist => 'Missing artist'; + String get libraryFilterMetadataMissingArtist => 'Artiste manquant'; @override String get libraryFilterMetadataIncorrectIsrcFormat => - 'Incorrect ISRC format'; + 'Format ISRC incorrect'; @override - String get libraryFilterMetadataMissingLabel => 'Missing label'; + String get libraryFilterMetadataMissingLabel => 'Label manquant'; @override String collectionDeletePlaylistsMessage(int count) { @@ -3911,7 +4028,7 @@ class AppLocalizationsFr extends AppLocalizations { other: 'playlists', one: 'playlist', ); - return 'Delete $count $_temp0?'; + return 'Supprimer $count $_temp0?'; } @override @@ -3922,7 +4039,7 @@ class AppLocalizationsFr extends AppLocalizations { other: 'playlists', one: 'playlist', ); - return '$count $_temp0 deleted'; + return '$count $_temp0 supprimées'; } @override @@ -3930,10 +4047,10 @@ class AppLocalizationsFr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'titres', + one: 'titre', ); - return 'Added $count $_temp0 to $playlistName'; + return 'Ajout de $count $_temp0 à $playlistName'; } @override @@ -3945,10 +4062,10 @@ class AppLocalizationsFr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'titres', + one: 'titre', ); - return 'Added $count $_temp0 to $playlistName ($alreadyCount already in playlist)'; + return 'Ajout de $count $_temp0 à $playlistName ($alreadyCount titres déjà présents dans la playlist)'; } @override @@ -3956,8 +4073,8 @@ class AppLocalizationsFr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'items', - one: 'item', + other: 'éléments', + one: 'élément', ); return '$count $_temp0'; } @@ -3968,7 +4085,7 @@ class AppLocalizationsFr extends AppLocalizations { int total, int failedCount, ) { - return 'Metadata re-enriched successfully ($successCount/$total) - Failed: $failedCount'; + return 'Les métadonnées ont été réenrichies avec succès ($successCount/$total) - Échec : $failedCount'; } @override @@ -3976,29 +4093,29 @@ class AppLocalizationsFr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'titres', + one: 'titre', ); - return 'Delete $count $_temp0'; + return 'Supprimer $count $_temp0'; } @override String queueDownloadSpeedStatus(String speed) { - return 'Downloading - $speed MB/s'; + return 'Téléchargement - $speed Mo/s'; } @override - String get queueDownloadStarting => 'Starting...'; + String get queueDownloadStarting => 'C\'est parti...'; @override - String get a11ySelectTrack => 'Select track'; + String get a11ySelectTrack => 'Sélectionner une piste'; @override - String get a11yDeselectTrack => 'Deselect track'; + String get a11yDeselectTrack => 'Désélectionner la piste'; @override String a11yPlayTrackByArtist(String trackName, String artistName) { - return 'Play $trackName by $artistName'; + return 'Écouter $trackName de $artistName'; } @override @@ -4014,233 +4131,235 @@ class AppLocalizationsFr extends AppLocalizations { @override String storeRequiresVersion(String version) { - return 'Requires v$version+'; + return 'Nécessite la version v$version+'; } @override - String get actionGo => 'Go'; + String get actionGo => 'Aller'; @override - String get logIssueSummary => 'Issue Summary'; + String get logIssueSummary => 'Résumé du problème'; @override String logTotalErrors(int count) { - return 'Total errors: $count'; + return 'Nombre total d\'erreurs : $count'; } @override String logAffectedDomains(String domains) { - return 'Affected: $domains'; + return 'Concerne : $domains'; } @override - String get libraryScanCancelled => 'Scan cancelled'; + String get libraryScanCancelled => 'Analyse annulée'; @override String get libraryScanCancelledSubtitle => - 'You can retry the scan when ready.'; + 'Vous pouvez relancer l\'analyse dès que vous êtes prêt.'; @override String libraryDownloadsHistoryExcluded(int count) { - return '$count from Downloads history (excluded from list)'; + return '$count dans l\'historique des téléchargements (exclu de la liste)'; } @override - String get downloadNativeWorker => 'Native download worker'; + String get downloadNativeWorker => 'Tâche de téléchargement native'; @override String get downloadNativeWorkerSubtitle => - 'Beta Android service worker for extension downloads'; + 'Service worker Android en version bêta pour le téléchargement d\'extensions'; @override - String get badgeBeta => 'BETA'; + String get badgeBeta => 'BÊTA'; @override - String get extensionServiceStatus => 'Service Status'; + String get extensionServiceStatus => 'État du service'; @override - String get extensionServiceHealth => 'Service health'; + String get extensionServiceHealth => 'Santé du service'; @override String extensionHealthChecksConfigured(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'checks', - one: 'check', + other: 'vérifications', + one: 'vérification', ); - return '$count $_temp0 configured'; + return '$count $_temp0 configurées'; } @override String get extensionOauthConnectHint => - 'Tap Connect to Spotify to fill this field.'; + 'Appuyez sur « Se connecter à Spotify » pour remplir ce champ.'; @override String extensionLastChecked(String time) { - return 'Last checked $time'; + return 'Dernière vérification à $time'; } @override - String get extensionRefreshStatus => 'Refresh status'; + String get extensionRefreshStatus => 'Actualiser l\'état'; @override - String get extensionCustomUrlHandling => 'Custom URL Handling'; + String get extensionCustomUrlHandling => 'Gestion des URL personnalisées'; @override String get extensionCustomUrlHandlingSubtitle => - 'This extension can handle links from these sites'; + 'Cette extension prend en charge les liens provenant de ces sites'; @override String get extensionCustomUrlHandlingShareHint => - 'Share links from these sites to SpotiFLAC Mobile and this extension will handle them.'; + 'Partagez des liens provenant de ces sites vers SpotiFLAC Mobile et cette extension s\'en chargera.'; @override String extensionSettingsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'settings', - one: 'setting', + other: 'paramètres', + one: 'paramètre', ); return '$count $_temp0'; } @override - String get extensionHealthOnline => 'Online'; + String get extensionHealthOnline => 'En ligne'; @override - String get extensionHealthDegraded => 'Degraded'; + String get extensionHealthDegraded => 'Dégradé'; @override - String get extensionHealthOffline => 'Offline'; + String get extensionHealthOffline => 'Hors ligne'; @override - String get extensionHealthNotConfigured => 'Not configured'; + String get extensionHealthNotConfigured => 'Non configuré'; @override - String get extensionHealthUnknown => 'Unknown'; + String get extensionHealthUnknown => 'Inconnu'; @override - String get extensionHealthRequired => 'required'; + String get extensionHealthRequired => 'requis'; @override - String get extensionSettingNotSet => 'Not set'; + String get extensionSettingNotSet => 'Non défini'; @override - String get extensionActionFailed => 'Action failed'; + String get extensionActionFailed => 'L\'action a échoué'; @override - String get extensionEnterValue => 'Enter value'; + String get extensionEnterValue => 'Saisir une valeur'; @override - String get extensionHealthServiceOnline => 'Service online'; + String get extensionHealthServiceOnline => 'Service en ligne'; @override - String get extensionHealthServiceDegraded => 'Service degraded'; + String get extensionHealthServiceDegraded => 'Service perturbé'; @override - String get extensionHealthServiceOffline => 'Service offline'; + String get extensionHealthServiceOffline => 'Service hors ligne'; @override - String get extensionHealthServiceUnknown => 'Service status unknown'; + String get extensionHealthServiceUnknown => 'État du service inconnu'; @override - String get audioAnalysisStereo => 'Stereo'; + String get audioAnalysisStereo => 'Stéréo'; @override String get audioAnalysisMono => 'Mono'; @override String trackOpenInService(String serviceName) { - return 'Open in $serviceName'; + return 'Ouvrir dans $serviceName'; } @override - String get trackLyricsEmbeddedSource => 'Embedded'; + String get trackLyricsEmbeddedSource => 'Intégré'; @override - String get unknownAlbum => 'Unknown Album'; + String get unknownAlbum => 'Album inconnu'; @override - String get unknownArtist => 'Unknown Artist'; + String get unknownArtist => 'Artiste inconnu'; @override String get permissionAudio => 'Audio'; @override - String get permissionStorage => 'Storage'; + String get permissionStorage => 'Stockage'; @override String get permissionNotification => 'Notification'; @override - String get errorInvalidFolderSelected => 'Invalid folder selected'; + String get errorInvalidFolderSelected => 'Dossier non valide sélectionné'; @override String get errorCouldNotKeepFolderAccess => - 'Could not keep access to the selected folder'; + 'Impossible de conserver l\'accès au dossier sélectionné'; @override - String get storeAnyVersion => 'Any'; + String get storeAnyVersion => 'N\'importe lequel'; @override - String get storeCategoryMetadata => 'Metadata'; + String get storeCategoryMetadata => 'Métadonnées'; @override - String get storeCategoryDownload => 'Download'; + String get storeCategoryDownload => 'Télécharger'; @override - String get storeCategoryUtility => 'Utility'; + String get storeCategoryUtility => 'Utilitaire'; @override - String get storeCategoryLyrics => 'Lyrics'; + String get storeCategoryLyrics => 'Paroles'; @override - String get storeCategoryIntegration => 'Integration'; + String get storeCategoryIntegration => 'Intégration'; @override - String get artistReleases => 'Releases'; + String get artistReleases => 'Sorties'; @override - String get editMetadataSelectNone => 'None'; + String get editMetadataSelectNone => 'Aucun'; @override String queueRetryAllFailed(int count) { - return 'Retry $count failed'; + return '$count tentatives ont échoué'; } @override - String get settingsSaveDownloadHistory => 'Save download history'; + String get settingsSaveDownloadHistory => + 'Enregistrer l\'historique des téléchargements'; @override String get settingsSaveDownloadHistorySubtitle => - 'Keep completed downloads in history and library views'; + 'Conserver les téléchargements terminés dans l\'historique et la bibliothèque'; @override - String get dialogDisableHistoryTitle => 'Turn off download history?'; + String get dialogDisableHistoryTitle => + 'Désactiver l\'historique des téléchargements ?'; @override String get dialogDisableHistoryMessage => - 'Existing history will be cleared. Downloaded files will not be deleted.'; + 'L\'historique actuel sera effacé. Les fichiers téléchargés ne seront pas supprimés.'; @override - String get dialogDisableAndClear => 'Turn off and clear'; + String get dialogDisableAndClear => 'Désactiver et effacer'; @override - String get openInOtherServices => 'Open in Other Services'; + String get openInOtherServices => 'Ouvrir dans d\'autres services'; @override - String get shareSheetNoExtensions => 'No other compatible services'; + String get shareSheetNoExtensions => 'Aucun autre service compatible'; @override - String get shareSheetNotFound => 'Not found'; + String get shareSheetNotFound => 'Introuvable'; @override - String get shareSheetCopyLink => 'Copy Link'; + String get shareSheetCopyLink => 'Copier le lien'; @override String shareSheetLinkCopied(Object service) { - return '$service link copied'; + return 'Lien $service copié'; } } diff --git a/lib/l10n/app_localizations_hi.dart b/lib/l10n/app_localizations_hi.dart index 52243030..2817a9f8 100644 --- a/lib/l10n/app_localizations_hi.dart +++ b/lib/l10n/app_localizations_hi.dart @@ -126,7 +126,7 @@ class AppLocalizationsHi extends AppLocalizations { @override String get optionsPrimaryProviderSubtitle => - 'Service used when searching by track name.'; + 'Service used for searching by track or album name'; @override String optionsUsingExtension(String extensionName) { @@ -165,7 +165,7 @@ class AppLocalizationsHi extends AppLocalizations { @override String get optionsEmbedLyricsSubtitle => - 'Embed synced lyrics into FLAC files'; + 'Save synced lyrics alongside your downloaded tracks'; @override String get optionsMaxQualityCover => 'Max Quality Cover'; @@ -1121,10 +1121,10 @@ class AppLocalizationsHi extends AppLocalizations { String get settingsAppearanceSubtitle => 'Theme, colors, display'; @override - String get settingsDownloadSubtitle => 'Service, quality, filename format'; + String get settingsDownloadSubtitle => 'Service, quality, fallback'; @override - String get settingsOptionsSubtitle => 'Fallback, lyrics, cover art, updates'; + String get settingsOptionsSubtitle => 'Fallback, metadata, lyrics, cover art'; @override String get settingsExtensionsSubtitle => 'Manage download providers'; @@ -2423,7 +2423,7 @@ class AppLocalizationsHi extends AppLocalizations { @override String get trackConvertFormatSubtitle => - 'Convert to MP3, Opus, ALAC, or FLAC'; + 'Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC'; @override String get trackConvertTitle => 'Convert Audio'; @@ -2776,14 +2776,14 @@ class AppLocalizationsHi extends AppLocalizations { @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Artist folders use Album Artist when available'; + 'Folder named after Album Artist tag'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => - 'Artist folders use Track Artist only'; + 'Folder named after Track Artist tag'; @override - String get lyricsProvidersTitle => 'Lyrics Providers'; + String get lyricsProvidersTitle => 'Lyrics Provider Priority'; @override String get lyricsProvidersDescription => @@ -2851,10 +2851,10 @@ class AppLocalizationsHi extends AppLocalizations { String get safMigrationSuccess => 'Download folder updated to SAF mode'; @override - String get settingsDonate => 'Donate'; + String get settingsDonate => 'Support Development'; @override - String get settingsDonateSubtitle => 'Support SpotiFLAC-Mobile development'; + String get settingsDonateSubtitle => 'Buy the developer a coffee'; @override String get tooltipLoveAll => 'Love All'; @@ -2914,20 +2914,20 @@ class AppLocalizationsHi extends AppLocalizations { @override String get downloadLocationSubtitle => - 'Choose storage mode for downloaded files.'; + 'Choose where to save your downloaded tracks'; @override - String get storageModeAppFolder => 'App folder (non-SAF)'; + String get storageModeAppFolder => 'App Folder (Recommended)'; @override - String get storageModeAppFolderSubtitle => 'Use default Music/SpotiFLAC path'; + String get storageModeAppFolderSubtitle => + 'Saves to Music/SpotiFLAC by default'; @override - String get storageModeSaf => 'SAF folder'; + String get storageModeSaf => 'Custom Folder (SAF)'; @override - String get storageModeSafSubtitle => - 'Pick folder via Android Storage Access Framework'; + String get storageModeSafSubtitle => 'Pick any folder, including SD card'; @override String downloadFilenameDescription( @@ -2939,62 +2939,62 @@ class AppLocalizationsHi extends AppLocalizations { Object track, Object year, ) { - return 'Customize how your files are named.'; + return 'Use $artist, $title, $album, $track, $year, $date, $disc as placeholders.'; } @override String get downloadFilenameInsertTag => 'Tap to insert tag:'; @override - String get downloadSeparateSinglesEnabled => 'Albums/ and Singles/ folders'; + String get downloadSeparateSinglesEnabled => + 'Singles and EPs saved in a separate folder'; @override - String get downloadSeparateSinglesDisabled => 'All files in same structure'; + String get downloadSeparateSinglesDisabled => + 'Singles and albums saved in the same folder'; @override String get downloadArtistNameFilters => 'Artist Name Filters'; @override - String get downloadCreatePlaylistSourceFolder => - 'Create playlist source folder'; + String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder'; @override String get downloadCreatePlaylistSourceFolderEnabled => - 'Playlist downloads use Playlist/ plus your normal folder structure.'; + 'A subfolder is created for each playlist'; @override String get downloadCreatePlaylistSourceFolderDisabled => - 'Playlist downloads use the normal folder structure only.'; + 'All tracks saved directly to download folder'; @override String get downloadCreatePlaylistSourceFolderRedundant => - 'By Playlist already places downloads inside a playlist folder.'; + 'Handled by folder organization setting'; @override String get downloadSongLinkRegion => 'SongLink Region'; @override - String get downloadNetworkCompatibilityMode => 'Network compatibility mode'; + String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode'; @override String get downloadNetworkCompatibilityModeEnabled => - 'Enabled: try HTTP + accept invalid TLS certificates (unsafe)'; + 'Using legacy TLS settings for older networks'; @override String get downloadNetworkCompatibilityModeDisabled => - 'Off: strict HTTPS certificate validation (recommended)'; + 'Using standard network settings'; @override String get downloadSelectServiceToEnable => - 'Select a built-in service to enable'; + 'Select Tidal or Qobuz to enable this option'; @override String get downloadSelectTidalQobuz => - 'Select Tidal or Qobuz above to configure quality'; + 'Select Tidal or Qobuz to choose audio quality'; @override - String get downloadEmbedLyricsDisabled => - 'Disabled while Embed Metadata is turned off'; + String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first'; @override String get downloadNeteaseIncludeTranslation => @@ -3002,11 +3002,11 @@ class AppLocalizationsHi extends AppLocalizations { @override String get downloadNeteaseIncludeTranslationEnabled => - 'Append translated lyrics when available'; + 'Chinese translation lines included'; @override String get downloadNeteaseIncludeTranslationDisabled => - 'Use original lyrics only'; + 'Original lyrics only'; @override String get downloadNeteaseIncludeRomanization => @@ -3014,21 +3014,21 @@ class AppLocalizationsHi extends AppLocalizations { @override String get downloadNeteaseIncludeRomanizationEnabled => - 'Append romanized lyrics when available'; + 'Romanization lines included'; @override - String get downloadNeteaseIncludeRomanizationDisabled => 'Disabled'; + String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization'; @override - String get downloadAppleQqMultiPerson => 'Apple/QQ Multi-Person Word-by-Word'; + String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics'; @override String get downloadAppleQqMultiPersonEnabled => - 'Enable v1/v2 speaker and [bg:] tags'; + 'Speaker labels included for duets and group tracks'; @override String get downloadAppleQqMultiPersonDisabled => - 'Simplified word-by-word formatting'; + 'Standard lyrics without speaker labels'; @override String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; @@ -3045,46 +3045,45 @@ class AppLocalizationsHi extends AppLocalizations { String get downloadMusixmatchLanguage => 'Musixmatch Language'; @override - String get downloadMusixmatchLanguageAuto => 'Auto (original)'; + String get downloadMusixmatchLanguageAuto => 'Auto (original language)'; @override - String get downloadFilterContributing => - 'Filter contributing artists in Album Artist'; + String get downloadFilterContributing => 'Filter Contributing Artists'; @override String get downloadFilterContributingEnabled => - 'Album Artist metadata uses primary artist only'; + 'Contributing artists removed from Album Artist folder name'; @override String get downloadFilterContributingDisabled => - 'Keep full Album Artist metadata value'; + 'Full Album Artist string used'; @override - String get downloadProvidersNoneEnabled => 'None enabled'; + String get downloadProvidersNoneEnabled => 'No providers enabled'; @override String get downloadMusixmatchLanguageCode => 'Language code'; @override - String get downloadMusixmatchLanguageHint => 'auto / en / es / ja'; + String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja'; @override String get downloadMusixmatchLanguageDesc => - 'Set preferred language code (example: en, es, ja). Leave empty for auto.'; + 'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.'; @override String get downloadMusixmatchAuto => 'Auto'; @override - String get downloadNetworkAnySubtitle => 'WiFi + Mobile Data'; + String get downloadNetworkAnySubtitle => 'Use WiFi or mobile data'; @override String get downloadNetworkWifiOnlySubtitle => - 'Pause downloads on mobile data'; + 'Downloads pause when on mobile data'; @override String get downloadSongLinkRegionDesc => - 'Used as userCountry for SongLink API lookup.'; + 'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.'; @override String get snackbarUnsupportedAudioFormat => 'Unsupported audio format'; @@ -3470,7 +3469,13 @@ class AppLocalizationsHi extends AppLocalizations { @override String notifTracksDownloadedSuccess(int count) { - return '$count tracks downloaded successfully'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks downloaded successfully', + one: '1 track downloaded successfully', + ); + return '$_temp0'; } @override diff --git a/lib/l10n/app_localizations_id.dart b/lib/l10n/app_localizations_id.dart index 21cedde3..5430cb86 100644 --- a/lib/l10n/app_localizations_id.dart +++ b/lib/l10n/app_localizations_id.dart @@ -21,7 +21,7 @@ class AppLocalizationsId extends AppLocalizations { String get navSettings => 'Pengaturan'; @override - String get navStore => 'Repo'; + String get navStore => 'Repositori'; @override String get homeTitle => 'Beranda'; @@ -30,10 +30,10 @@ class AppLocalizationsId extends AppLocalizations { String get homeSubtitle => 'Paste a supported URL or search by name'; @override - String get homeEmptyTitle => 'Belum ada provider pencarian'; + String get homeEmptyTitle => 'Belum ada penyedia pencarian'; @override - String get homeEmptySubtitle => 'Pasang ekstensi untuk melanjutkan.'; + String get homeEmptySubtitle => 'Instal ekstensi untuk melanjutkan.'; @override String get homeSupports => 'Mendukung: URL Track, Album, Playlist, Artis'; @@ -82,11 +82,11 @@ class AppLocalizationsId extends AppLocalizations { String get downloadFilenameFormat => 'Format Nama File'; @override - String get downloadSingleFilenameFormat => 'Single Filename Format'; + String get downloadSingleFilenameFormat => 'Format Nama Berkas Tunggal'; @override String get downloadSingleFilenameFormatDescription => - 'Filename pattern for singles and EPs. Uses the same tags as the album format.'; + 'Pola nama file untuk single dan EP. Menggunakan tag yang sama dengan format album.'; @override String get downloadFolderOrganization => 'Organisasi Folder'; @@ -127,7 +127,7 @@ class AppLocalizationsId extends AppLocalizations { @override String get optionsPrimaryProviderSubtitle => - 'Layanan yang digunakan saat mencari berdasarkan nama lagu.'; + 'Layanan yang digunakan untuk mencari berdasarkan nama lagu atau album'; @override String optionsUsingExtension(String extensionName) { @@ -139,7 +139,7 @@ class AppLocalizationsId extends AppLocalizations { @override String get optionsDefaultSearchTabSubtitle => - 'Choose which tab opens first for new search results.'; + 'Pilih tab mana yang terbuka terlebih dahulu untuk hasil pencarian baru.'; @override String get optionsSwitchBack => @@ -168,7 +168,7 @@ class AppLocalizationsId extends AppLocalizations { @override String get optionsEmbedLyricsSubtitle => - 'Sematkan lirik sinkron ke file FLAC'; + 'Simpan lirik yang disinkronkan bersama dengan lagu yang Anda unduh'; @override String get optionsMaxQualityCover => 'Cover Kualitas Maksimal'; @@ -182,32 +182,32 @@ class AppLocalizationsId extends AppLocalizations { @override String get optionsReplayGainSubtitleOn => - 'Scan loudness and embed ReplayGain tags (EBU R128)'; + 'Pindai kenyaringan dan sematkan tag ReplayGain (EBU R128)'; @override String get optionsReplayGainSubtitleOff => - 'Disabled: no loudness normalization tags'; + 'Dinonaktifkan: tidak ada tag normalisasi kenyaringan'; @override - String get optionsArtistTagMode => 'Artist Tag Mode'; + String get optionsArtistTagMode => 'Mode Tag Artis'; @override String get optionsArtistTagModeDescription => - 'Choose how multiple artists are written into embedded tags.'; + 'Pilih bagaimana beberapa artis dicantumkan dalam tag yang disematkan.'; @override - String get optionsArtistTagModeJoined => 'Single joined value'; + String get optionsArtistTagModeJoined => 'Nilai gabungan tunggal'; @override String get optionsArtistTagModeJoinedSubtitle => - 'Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.'; + 'Tuliskan satu nilai ARTIS seperti \"Artis A, Artis B\" untuk kompatibilitas pemain maksimal.'; @override - String get optionsArtistTagModeSplitVorbis => 'Split tags for FLAC/Opus'; + String get optionsArtistTagModeSplitVorbis => 'Tag terpisah untuk FLAC/Opus'; @override String get optionsArtistTagModeSplitVorbisSubtitle => - 'Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.'; + 'Tulis satu tag artis per artis untuk FLAC dan Opus; MP3 dan M4A tetap tergabung.'; @override String get optionsConcurrentDownloads => 'Unduhan Bersamaan'; @@ -746,7 +746,7 @@ class AppLocalizationsId extends AppLocalizations { String get errorNoTracksFound => 'Tidak ada lagu ditemukan'; @override - String get searchEmptyResultSubtitle => 'Coba kata kunci lain'; + String get searchEmptyResultSubtitle => 'Try another keyword'; @override String get errorUrlNotRecognized => 'Tautan tidak dikenali'; @@ -1127,10 +1127,10 @@ class AppLocalizationsId extends AppLocalizations { String get settingsAppearanceSubtitle => 'Tema, warna, tampilan'; @override - String get settingsDownloadSubtitle => 'Layanan, kualitas, format nama file'; + String get settingsDownloadSubtitle => 'Service, quality, fallback'; @override - String get settingsOptionsSubtitle => 'Fallback, lirik, cover art, pembaruan'; + String get settingsOptionsSubtitle => 'Fallback, metadata, lyrics, cover art'; @override String get settingsExtensionsSubtitle => 'Kelola provider unduhan'; @@ -2432,7 +2432,7 @@ class AppLocalizationsId extends AppLocalizations { @override String get trackConvertFormatSubtitle => - 'Convert to MP3, Opus, ALAC, or FLAC'; + 'Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC'; @override String get trackConvertTitle => 'Convert Audio'; @@ -2785,14 +2785,14 @@ class AppLocalizationsId extends AppLocalizations { @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Artist folders use Album Artist when available'; + 'Folder named after Album Artist tag'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => - 'Artist folders use Track Artist only'; + 'Folder named after Track Artist tag'; @override - String get lyricsProvidersTitle => 'Lyrics Providers'; + String get lyricsProvidersTitle => 'Lyrics Provider Priority'; @override String get lyricsProvidersDescription => @@ -2860,10 +2860,10 @@ class AppLocalizationsId extends AppLocalizations { String get safMigrationSuccess => 'Download folder updated to SAF mode'; @override - String get settingsDonate => 'Donate'; + String get settingsDonate => 'Support Development'; @override - String get settingsDonateSubtitle => 'Support SpotiFLAC-Mobile development'; + String get settingsDonateSubtitle => 'Buy the developer a coffee'; @override String get tooltipLoveAll => 'Love All'; @@ -2923,20 +2923,20 @@ class AppLocalizationsId extends AppLocalizations { @override String get downloadLocationSubtitle => - 'Choose storage mode for downloaded files.'; + 'Choose where to save your downloaded tracks'; @override - String get storageModeAppFolder => 'App folder (non-SAF)'; + String get storageModeAppFolder => 'App Folder (Recommended)'; @override - String get storageModeAppFolderSubtitle => 'Use default Music/SpotiFLAC path'; + String get storageModeAppFolderSubtitle => + 'Saves to Music/SpotiFLAC by default'; @override - String get storageModeSaf => 'SAF folder'; + String get storageModeSaf => 'Custom Folder (SAF)'; @override - String get storageModeSafSubtitle => - 'Pick folder via Android Storage Access Framework'; + String get storageModeSafSubtitle => 'Pick any folder, including SD card'; @override String downloadFilenameDescription( @@ -2948,62 +2948,62 @@ class AppLocalizationsId extends AppLocalizations { Object track, Object year, ) { - return 'Customize how your files are named.'; + return 'Use $artist, $title, $album, $track, $year, $date, $disc as placeholders.'; } @override String get downloadFilenameInsertTag => 'Tap to insert tag:'; @override - String get downloadSeparateSinglesEnabled => 'Albums/ and Singles/ folders'; + String get downloadSeparateSinglesEnabled => + 'Singles and EPs saved in a separate folder'; @override - String get downloadSeparateSinglesDisabled => 'All files in same structure'; + String get downloadSeparateSinglesDisabled => + 'Singles and albums saved in the same folder'; @override String get downloadArtistNameFilters => 'Artist Name Filters'; @override - String get downloadCreatePlaylistSourceFolder => - 'Create playlist source folder'; + String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder'; @override String get downloadCreatePlaylistSourceFolderEnabled => - 'Playlist downloads use Playlist/ plus your normal folder structure.'; + 'A subfolder is created for each playlist'; @override String get downloadCreatePlaylistSourceFolderDisabled => - 'Playlist downloads use the normal folder structure only.'; + 'All tracks saved directly to download folder'; @override String get downloadCreatePlaylistSourceFolderRedundant => - 'By Playlist already places downloads inside a playlist folder.'; + 'Handled by folder organization setting'; @override String get downloadSongLinkRegion => 'SongLink Region'; @override - String get downloadNetworkCompatibilityMode => 'Network compatibility mode'; + String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode'; @override String get downloadNetworkCompatibilityModeEnabled => - 'Enabled: try HTTP + accept invalid TLS certificates (unsafe)'; + 'Using legacy TLS settings for older networks'; @override String get downloadNetworkCompatibilityModeDisabled => - 'Off: strict HTTPS certificate validation (recommended)'; + 'Using standard network settings'; @override String get downloadSelectServiceToEnable => - 'Select a built-in service to enable'; + 'Select Tidal or Qobuz to enable this option'; @override String get downloadSelectTidalQobuz => - 'Select Tidal or Qobuz above to configure quality'; + 'Select Tidal or Qobuz to choose audio quality'; @override - String get downloadEmbedLyricsDisabled => - 'Disabled while Embed Metadata is turned off'; + String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first'; @override String get downloadNeteaseIncludeTranslation => @@ -3011,11 +3011,11 @@ class AppLocalizationsId extends AppLocalizations { @override String get downloadNeteaseIncludeTranslationEnabled => - 'Append translated lyrics when available'; + 'Chinese translation lines included'; @override String get downloadNeteaseIncludeTranslationDisabled => - 'Use original lyrics only'; + 'Original lyrics only'; @override String get downloadNeteaseIncludeRomanization => @@ -3023,21 +3023,21 @@ class AppLocalizationsId extends AppLocalizations { @override String get downloadNeteaseIncludeRomanizationEnabled => - 'Append romanized lyrics when available'; + 'Romanization lines included'; @override - String get downloadNeteaseIncludeRomanizationDisabled => 'Disabled'; + String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization'; @override - String get downloadAppleQqMultiPerson => 'Apple/QQ Multi-Person Word-by-Word'; + String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics'; @override String get downloadAppleQqMultiPersonEnabled => - 'Enable v1/v2 speaker and [bg:] tags'; + 'Speaker labels included for duets and group tracks'; @override String get downloadAppleQqMultiPersonDisabled => - 'Simplified word-by-word formatting'; + 'Standard lyrics without speaker labels'; @override String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; @@ -3054,46 +3054,45 @@ class AppLocalizationsId extends AppLocalizations { String get downloadMusixmatchLanguage => 'Musixmatch Language'; @override - String get downloadMusixmatchLanguageAuto => 'Auto (original)'; + String get downloadMusixmatchLanguageAuto => 'Auto (original language)'; @override - String get downloadFilterContributing => - 'Filter contributing artists in Album Artist'; + String get downloadFilterContributing => 'Filter Contributing Artists'; @override String get downloadFilterContributingEnabled => - 'Album Artist metadata uses primary artist only'; + 'Contributing artists removed from Album Artist folder name'; @override String get downloadFilterContributingDisabled => - 'Keep full Album Artist metadata value'; + 'Full Album Artist string used'; @override - String get downloadProvidersNoneEnabled => 'None enabled'; + String get downloadProvidersNoneEnabled => 'No providers enabled'; @override String get downloadMusixmatchLanguageCode => 'Language code'; @override - String get downloadMusixmatchLanguageHint => 'auto / en / es / ja'; + String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja'; @override String get downloadMusixmatchLanguageDesc => - 'Set preferred language code (example: en, es, ja). Leave empty for auto.'; + 'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.'; @override String get downloadMusixmatchAuto => 'Auto'; @override - String get downloadNetworkAnySubtitle => 'WiFi + Mobile Data'; + String get downloadNetworkAnySubtitle => 'Use WiFi or mobile data'; @override String get downloadNetworkWifiOnlySubtitle => - 'Pause downloads on mobile data'; + 'Downloads pause when on mobile data'; @override String get downloadSongLinkRegionDesc => - 'Used as userCountry for SongLink API lookup.'; + 'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.'; @override String get snackbarUnsupportedAudioFormat => 'Unsupported audio format'; @@ -3471,28 +3470,52 @@ class AppLocalizationsId extends AppLocalizations { @override String notifDownloadsFinished(int completed, int failed) { - return 'Unduhan Selesai ($completed selesai, $failed gagal)'; + return 'Downloads Finished ($completed done, $failed failed)'; } @override - String get notifAllDownloadsComplete => 'Semua Unduhan Selesai'; + String get notifAllDownloadsComplete => 'All Downloads Complete'; @override String notifTracksDownloadedSuccess(int count) { - return '$count lagu berhasil diunduh'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks downloaded successfully', + one: '1 track downloaded successfully', + ); + return '$_temp0'; } @override String notifDownloadsFinishedBody(int completed, int failed) { - return '$completed lagu diunduh, $failed gagal'; + String _temp0 = intl.Intl.pluralLogic( + completed, + locale: localeName, + other: '$completed tracks downloaded', + one: '1 track downloaded', + ); + String _temp1 = intl.Intl.pluralLogic( + failed, + locale: localeName, + other: '$failed failed', + one: '1 failed', + ); + return '$_temp0, $_temp1'; } @override - String get notifDownloadsCanceledTitle => 'Unduhan dibatalkan'; + String get notifDownloadsCanceledTitle => 'Downloads canceled'; @override String notifDownloadsCanceledBody(int count) { - return '$count unduhan dibatalkan oleh pengguna'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count downloads canceled by user', + one: '1 download canceled by user', + ); + return '$_temp0'; } @override @@ -3657,11 +3680,11 @@ class AppLocalizationsId extends AppLocalizations { String get queueDownloadCompleted => 'Download completed'; @override - String get queueRateLimitTitle => 'Layanan sedang membatasi permintaan'; + String get queueRateLimitTitle => 'Service rate limited'; @override String get queueRateLimitMessage => - 'Lagu ini mungkin masih tersedia. Tunggu beberapa menit, kurangi unduhan paralel, lalu coba lagi.'; + 'This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.'; @override String appearanceSelectAccentColor(String hex) { @@ -4191,44 +4214,44 @@ class AppLocalizationsId extends AppLocalizations { String get artistReleases => 'Releases'; @override - String get editMetadataSelectNone => 'Tidak ada'; + String get editMetadataSelectNone => 'None'; @override String queueRetryAllFailed(int count) { - return 'Coba ulang $count gagal'; + return 'Retry $count failed'; } @override - String get settingsSaveDownloadHistory => 'Simpan riwayat unduhan'; + String get settingsSaveDownloadHistory => 'Save download history'; @override String get settingsSaveDownloadHistorySubtitle => - 'Simpan unduhan selesai di riwayat dan tampilan pustaka'; + 'Keep completed downloads in history and library views'; @override - String get dialogDisableHistoryTitle => 'Matikan riwayat unduhan?'; + String get dialogDisableHistoryTitle => 'Turn off download history?'; @override String get dialogDisableHistoryMessage => - 'Riwayat yang ada akan dihapus. File unduhan tidak akan dihapus.'; + 'Existing history will be cleared. Downloaded files will not be deleted.'; @override - String get dialogDisableAndClear => 'Matikan dan hapus'; + String get dialogDisableAndClear => 'Turn off and clear'; @override - String get openInOtherServices => 'Buka di Layanan Lain'; + String get openInOtherServices => 'Open in Other Services'; @override - String get shareSheetNoExtensions => 'Tidak ada layanan lain yang kompatibel'; + String get shareSheetNoExtensions => 'No other compatible services'; @override - String get shareSheetNotFound => 'Tidak ditemukan'; + String get shareSheetNotFound => 'Not found'; @override - String get shareSheetCopyLink => 'Salin Tautan'; + String get shareSheetCopyLink => 'Copy Link'; @override String shareSheetLinkCopied(Object service) { - return 'Tautan $service disalin'; + return '$service link copied'; } } diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index 73ade9d5..c8743e11 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -126,7 +126,7 @@ class AppLocalizationsJa extends AppLocalizations { @override String get optionsPrimaryProviderSubtitle => - 'Service used when searching by track name.'; + 'Service used for searching by track or album name'; @override String optionsUsingExtension(String extensionName) { @@ -164,7 +164,8 @@ class AppLocalizationsJa extends AppLocalizations { String get optionsEmbedLyrics => '歌詞を埋め込む'; @override - String get optionsEmbedLyricsSubtitle => '同期する歌詞を FLAC ファイルに埋め込む'; + String get optionsEmbedLyricsSubtitle => + 'Save synced lyrics alongside your downloaded tracks'; @override String get optionsMaxQualityCover => '最大品質のカバー'; @@ -1115,10 +1116,10 @@ class AppLocalizationsJa extends AppLocalizations { String get settingsAppearanceSubtitle => 'テーマ、カラー、画面'; @override - String get settingsDownloadSubtitle => 'サービス、品質、ファイル名、形式'; + String get settingsDownloadSubtitle => 'Service, quality, fallback'; @override - String get settingsOptionsSubtitle => 'Fallback, lyrics, cover art, updates'; + String get settingsOptionsSubtitle => 'Fallback, metadata, lyrics, cover art'; @override String get settingsExtensionsSubtitle => 'ダウンロードプロバイダーを管理'; @@ -2410,7 +2411,7 @@ class AppLocalizationsJa extends AppLocalizations { @override String get trackConvertFormatSubtitle => - 'Convert to MP3, Opus, ALAC, or FLAC'; + 'Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC'; @override String get trackConvertTitle => 'オーディオを変換'; @@ -2763,14 +2764,14 @@ class AppLocalizationsJa extends AppLocalizations { @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Artist folders use Album Artist when available'; + 'Folder named after Album Artist tag'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => - 'Artist folders use Track Artist only'; + 'Folder named after Track Artist tag'; @override - String get lyricsProvidersTitle => 'Lyrics Providers'; + String get lyricsProvidersTitle => 'Lyrics Provider Priority'; @override String get lyricsProvidersDescription => @@ -2838,10 +2839,10 @@ class AppLocalizationsJa extends AppLocalizations { String get safMigrationSuccess => 'Download folder updated to SAF mode'; @override - String get settingsDonate => 'Donate'; + String get settingsDonate => 'Support Development'; @override - String get settingsDonateSubtitle => 'Support SpotiFLAC-Mobile development'; + String get settingsDonateSubtitle => 'Buy the developer a coffee'; @override String get tooltipLoveAll => 'Love All'; @@ -2901,20 +2902,20 @@ class AppLocalizationsJa extends AppLocalizations { @override String get downloadLocationSubtitle => - 'Choose storage mode for downloaded files.'; + 'Choose where to save your downloaded tracks'; @override - String get storageModeAppFolder => 'App folder (non-SAF)'; + String get storageModeAppFolder => 'App Folder (Recommended)'; @override - String get storageModeAppFolderSubtitle => 'Use default Music/SpotiFLAC path'; + String get storageModeAppFolderSubtitle => + 'Saves to Music/SpotiFLAC by default'; @override - String get storageModeSaf => 'SAF folder'; + String get storageModeSaf => 'Custom Folder (SAF)'; @override - String get storageModeSafSubtitle => - 'Pick folder via Android Storage Access Framework'; + String get storageModeSafSubtitle => 'Pick any folder, including SD card'; @override String downloadFilenameDescription( @@ -2926,62 +2927,62 @@ class AppLocalizationsJa extends AppLocalizations { Object track, Object year, ) { - return 'Customize how your files are named.'; + return 'Use $artist, $title, $album, $track, $year, $date, $disc as placeholders.'; } @override String get downloadFilenameInsertTag => 'Tap to insert tag:'; @override - String get downloadSeparateSinglesEnabled => 'Albums/ and Singles/ folders'; + String get downloadSeparateSinglesEnabled => + 'Singles and EPs saved in a separate folder'; @override - String get downloadSeparateSinglesDisabled => 'All files in same structure'; + String get downloadSeparateSinglesDisabled => + 'Singles and albums saved in the same folder'; @override String get downloadArtistNameFilters => 'Artist Name Filters'; @override - String get downloadCreatePlaylistSourceFolder => - 'Create playlist source folder'; + String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder'; @override String get downloadCreatePlaylistSourceFolderEnabled => - 'Playlist downloads use Playlist/ plus your normal folder structure.'; + 'A subfolder is created for each playlist'; @override String get downloadCreatePlaylistSourceFolderDisabled => - 'Playlist downloads use the normal folder structure only.'; + 'All tracks saved directly to download folder'; @override String get downloadCreatePlaylistSourceFolderRedundant => - 'By Playlist already places downloads inside a playlist folder.'; + 'Handled by folder organization setting'; @override String get downloadSongLinkRegion => 'SongLink Region'; @override - String get downloadNetworkCompatibilityMode => 'Network compatibility mode'; + String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode'; @override String get downloadNetworkCompatibilityModeEnabled => - 'Enabled: try HTTP + accept invalid TLS certificates (unsafe)'; + 'Using legacy TLS settings for older networks'; @override String get downloadNetworkCompatibilityModeDisabled => - 'Off: strict HTTPS certificate validation (recommended)'; + 'Using standard network settings'; @override String get downloadSelectServiceToEnable => - 'Select a built-in service to enable'; + 'Select Tidal or Qobuz to enable this option'; @override String get downloadSelectTidalQobuz => - 'Select Tidal or Qobuz above to configure quality'; + 'Select Tidal or Qobuz to choose audio quality'; @override - String get downloadEmbedLyricsDisabled => - 'Disabled while Embed Metadata is turned off'; + String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first'; @override String get downloadNeteaseIncludeTranslation => @@ -2989,11 +2990,11 @@ class AppLocalizationsJa extends AppLocalizations { @override String get downloadNeteaseIncludeTranslationEnabled => - 'Append translated lyrics when available'; + 'Chinese translation lines included'; @override String get downloadNeteaseIncludeTranslationDisabled => - 'Use original lyrics only'; + 'Original lyrics only'; @override String get downloadNeteaseIncludeRomanization => @@ -3001,21 +3002,21 @@ class AppLocalizationsJa extends AppLocalizations { @override String get downloadNeteaseIncludeRomanizationEnabled => - 'Append romanized lyrics when available'; + 'Romanization lines included'; @override - String get downloadNeteaseIncludeRomanizationDisabled => 'Disabled'; + String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization'; @override - String get downloadAppleQqMultiPerson => 'Apple/QQ Multi-Person Word-by-Word'; + String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics'; @override String get downloadAppleQqMultiPersonEnabled => - 'Enable v1/v2 speaker and [bg:] tags'; + 'Speaker labels included for duets and group tracks'; @override String get downloadAppleQqMultiPersonDisabled => - 'Simplified word-by-word formatting'; + 'Standard lyrics without speaker labels'; @override String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; @@ -3032,46 +3033,45 @@ class AppLocalizationsJa extends AppLocalizations { String get downloadMusixmatchLanguage => 'Musixmatch Language'; @override - String get downloadMusixmatchLanguageAuto => 'Auto (original)'; + String get downloadMusixmatchLanguageAuto => 'Auto (original language)'; @override - String get downloadFilterContributing => - 'Filter contributing artists in Album Artist'; + String get downloadFilterContributing => 'Filter Contributing Artists'; @override String get downloadFilterContributingEnabled => - 'Album Artist metadata uses primary artist only'; + 'Contributing artists removed from Album Artist folder name'; @override String get downloadFilterContributingDisabled => - 'Keep full Album Artist metadata value'; + 'Full Album Artist string used'; @override - String get downloadProvidersNoneEnabled => 'None enabled'; + String get downloadProvidersNoneEnabled => 'No providers enabled'; @override String get downloadMusixmatchLanguageCode => 'Language code'; @override - String get downloadMusixmatchLanguageHint => 'auto / en / es / ja'; + String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja'; @override String get downloadMusixmatchLanguageDesc => - 'Set preferred language code (example: en, es, ja). Leave empty for auto.'; + 'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.'; @override String get downloadMusixmatchAuto => 'Auto'; @override - String get downloadNetworkAnySubtitle => 'WiFi + Mobile Data'; + String get downloadNetworkAnySubtitle => 'Use WiFi or mobile data'; @override String get downloadNetworkWifiOnlySubtitle => - 'Pause downloads on mobile data'; + 'Downloads pause when on mobile data'; @override String get downloadSongLinkRegionDesc => - 'Used as userCountry for SongLink API lookup.'; + 'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.'; @override String get snackbarUnsupportedAudioFormat => 'Unsupported audio format'; @@ -3457,7 +3457,13 @@ class AppLocalizationsJa extends AppLocalizations { @override String notifTracksDownloadedSuccess(int count) { - return '$count tracks downloaded successfully'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks downloaded successfully', + one: '1 track downloaded successfully', + ); + return '$_temp0'; } @override diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index acd639e6..68ae2e77 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -27,7 +27,7 @@ class AppLocalizationsKo extends AppLocalizations { String get homeTitle => 'Home'; @override - String get homeSubtitle => 'Paste a supported URL or search by name'; + String get homeSubtitle => '지원되는 URL을 붙여 넣거나, 이름을 검색'; @override String get homeEmptyTitle => 'No search providers yet'; @@ -97,10 +97,10 @@ class AppLocalizationsKo extends AppLocalizations { String get appearanceThemeSystem => 'System'; @override - String get appearanceThemeLight => 'Light'; + String get appearanceThemeLight => '밝은'; @override - String get appearanceThemeDark => 'Dark'; + String get appearanceThemeDark => '다크'; @override String get appearanceDynamicColor => 'Dynamic Color'; @@ -124,7 +124,8 @@ class AppLocalizationsKo extends AppLocalizations { String get optionsPrimaryProvider => '기본 제공자'; @override - String get optionsPrimaryProviderSubtitle => '음반 이름으로 검색할 때 사용되는 서비스'; + String get optionsPrimaryProviderSubtitle => + 'Service used for searching by track or album name'; @override String optionsUsingExtension(String extensionName) { @@ -160,7 +161,8 @@ class AppLocalizationsKo extends AppLocalizations { String get optionsEmbedLyrics => '가사 삽입'; @override - String get optionsEmbedLyricsSubtitle => 'FLAC 파일에 동기화된 가사를 삽입합니다'; + String get optionsEmbedLyricsSubtitle => + 'Save synced lyrics alongside your downloaded tracks'; @override String get optionsMaxQualityCover => '고품질 커버 이미지'; @@ -829,7 +831,7 @@ class AppLocalizationsKo extends AppLocalizations { String get tooltipPlay => '재생'; @override - String get filenameFormat => ''; + String get filenameFormat => 'Filename Format'; @override String get filenameShowAdvancedTags => '고급 태그 표시'; @@ -1101,10 +1103,10 @@ class AppLocalizationsKo extends AppLocalizations { String get settingsAppearanceSubtitle => 'Theme, colors, display'; @override - String get settingsDownloadSubtitle => 'Service, quality, filename format'; + String get settingsDownloadSubtitle => 'Service, quality, fallback'; @override - String get settingsOptionsSubtitle => 'Fallback, lyrics, cover art, updates'; + String get settingsOptionsSubtitle => 'Fallback, metadata, lyrics, cover art'; @override String get settingsExtensionsSubtitle => 'Manage download providers'; @@ -2403,7 +2405,7 @@ class AppLocalizationsKo extends AppLocalizations { @override String get trackConvertFormatSubtitle => - 'Convert to MP3, Opus, ALAC, or FLAC'; + 'Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC'; @override String get trackConvertTitle => 'Convert Audio'; @@ -2756,14 +2758,14 @@ class AppLocalizationsKo extends AppLocalizations { @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Artist folders use Album Artist when available'; + 'Folder named after Album Artist tag'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => - 'Artist folders use Track Artist only'; + 'Folder named after Track Artist tag'; @override - String get lyricsProvidersTitle => 'Lyrics Providers'; + String get lyricsProvidersTitle => 'Lyrics Provider Priority'; @override String get lyricsProvidersDescription => @@ -2831,10 +2833,10 @@ class AppLocalizationsKo extends AppLocalizations { String get safMigrationSuccess => 'Download folder updated to SAF mode'; @override - String get settingsDonate => 'Donate'; + String get settingsDonate => 'Support Development'; @override - String get settingsDonateSubtitle => 'Support SpotiFLAC-Mobile development'; + String get settingsDonateSubtitle => 'Buy the developer a coffee'; @override String get tooltipLoveAll => 'Love All'; @@ -2894,20 +2896,20 @@ class AppLocalizationsKo extends AppLocalizations { @override String get downloadLocationSubtitle => - 'Choose storage mode for downloaded files.'; + 'Choose where to save your downloaded tracks'; @override - String get storageModeAppFolder => 'App folder (non-SAF)'; + String get storageModeAppFolder => 'App Folder (Recommended)'; @override - String get storageModeAppFolderSubtitle => 'Use default Music/SpotiFLAC path'; + String get storageModeAppFolderSubtitle => + 'Saves to Music/SpotiFLAC by default'; @override - String get storageModeSaf => 'SAF folder'; + String get storageModeSaf => 'Custom Folder (SAF)'; @override - String get storageModeSafSubtitle => - 'Pick folder via Android Storage Access Framework'; + String get storageModeSafSubtitle => 'Pick any folder, including SD card'; @override String downloadFilenameDescription( @@ -2919,62 +2921,62 @@ class AppLocalizationsKo extends AppLocalizations { Object track, Object year, ) { - return 'Customize how your files are named.'; + return 'Use $artist, $title, $album, $track, $year, $date, $disc as placeholders.'; } @override String get downloadFilenameInsertTag => 'Tap to insert tag:'; @override - String get downloadSeparateSinglesEnabled => 'Albums/ and Singles/ folders'; + String get downloadSeparateSinglesEnabled => + 'Singles and EPs saved in a separate folder'; @override - String get downloadSeparateSinglesDisabled => 'All files in same structure'; + String get downloadSeparateSinglesDisabled => + 'Singles and albums saved in the same folder'; @override String get downloadArtistNameFilters => 'Artist Name Filters'; @override - String get downloadCreatePlaylistSourceFolder => - 'Create playlist source folder'; + String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder'; @override String get downloadCreatePlaylistSourceFolderEnabled => - 'Playlist downloads use Playlist/ plus your normal folder structure.'; + 'A subfolder is created for each playlist'; @override String get downloadCreatePlaylistSourceFolderDisabled => - 'Playlist downloads use the normal folder structure only.'; + 'All tracks saved directly to download folder'; @override String get downloadCreatePlaylistSourceFolderRedundant => - 'By Playlist already places downloads inside a playlist folder.'; + 'Handled by folder organization setting'; @override String get downloadSongLinkRegion => 'SongLink Region'; @override - String get downloadNetworkCompatibilityMode => 'Network compatibility mode'; + String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode'; @override String get downloadNetworkCompatibilityModeEnabled => - 'Enabled: try HTTP + accept invalid TLS certificates (unsafe)'; + 'Using legacy TLS settings for older networks'; @override String get downloadNetworkCompatibilityModeDisabled => - 'Off: strict HTTPS certificate validation (recommended)'; + 'Using standard network settings'; @override String get downloadSelectServiceToEnable => - 'Select a built-in service to enable'; + 'Select Tidal or Qobuz to enable this option'; @override String get downloadSelectTidalQobuz => - 'Select Tidal or Qobuz above to configure quality'; + 'Select Tidal or Qobuz to choose audio quality'; @override - String get downloadEmbedLyricsDisabled => - 'Disabled while Embed Metadata is turned off'; + String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first'; @override String get downloadNeteaseIncludeTranslation => @@ -2982,11 +2984,11 @@ class AppLocalizationsKo extends AppLocalizations { @override String get downloadNeteaseIncludeTranslationEnabled => - 'Append translated lyrics when available'; + 'Chinese translation lines included'; @override String get downloadNeteaseIncludeTranslationDisabled => - 'Use original lyrics only'; + 'Original lyrics only'; @override String get downloadNeteaseIncludeRomanization => @@ -2994,21 +2996,21 @@ class AppLocalizationsKo extends AppLocalizations { @override String get downloadNeteaseIncludeRomanizationEnabled => - 'Append romanized lyrics when available'; + 'Romanization lines included'; @override - String get downloadNeteaseIncludeRomanizationDisabled => 'Disabled'; + String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization'; @override - String get downloadAppleQqMultiPerson => 'Apple/QQ Multi-Person Word-by-Word'; + String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics'; @override String get downloadAppleQqMultiPersonEnabled => - 'Enable v1/v2 speaker and [bg:] tags'; + 'Speaker labels included for duets and group tracks'; @override String get downloadAppleQqMultiPersonDisabled => - 'Simplified word-by-word formatting'; + 'Standard lyrics without speaker labels'; @override String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; @@ -3025,46 +3027,45 @@ class AppLocalizationsKo extends AppLocalizations { String get downloadMusixmatchLanguage => 'Musixmatch Language'; @override - String get downloadMusixmatchLanguageAuto => 'Auto (original)'; + String get downloadMusixmatchLanguageAuto => 'Auto (original language)'; @override - String get downloadFilterContributing => - 'Filter contributing artists in Album Artist'; + String get downloadFilterContributing => 'Filter Contributing Artists'; @override String get downloadFilterContributingEnabled => - 'Album Artist metadata uses primary artist only'; + 'Contributing artists removed from Album Artist folder name'; @override String get downloadFilterContributingDisabled => - 'Keep full Album Artist metadata value'; + 'Full Album Artist string used'; @override - String get downloadProvidersNoneEnabled => 'None enabled'; + String get downloadProvidersNoneEnabled => 'No providers enabled'; @override String get downloadMusixmatchLanguageCode => 'Language code'; @override - String get downloadMusixmatchLanguageHint => 'auto / en / es / ja'; + String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja'; @override String get downloadMusixmatchLanguageDesc => - 'Set preferred language code (example: en, es, ja). Leave empty for auto.'; + 'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.'; @override String get downloadMusixmatchAuto => 'Auto'; @override - String get downloadNetworkAnySubtitle => 'WiFi + Mobile Data'; + String get downloadNetworkAnySubtitle => 'Use WiFi or mobile data'; @override String get downloadNetworkWifiOnlySubtitle => - 'Pause downloads on mobile data'; + 'Downloads pause when on mobile data'; @override String get downloadSongLinkRegionDesc => - 'Used as userCountry for SongLink API lookup.'; + 'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.'; @override String get snackbarUnsupportedAudioFormat => 'Unsupported audio format'; @@ -3450,7 +3451,13 @@ class AppLocalizationsKo extends AppLocalizations { @override String notifTracksDownloadedSuccess(int count) { - return '$count tracks downloaded successfully'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks downloaded successfully', + one: '1 track downloaded successfully', + ); + return '$_temp0'; } @override diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index afcafbdf..90110db8 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -126,7 +126,7 @@ class AppLocalizationsNl extends AppLocalizations { @override String get optionsPrimaryProviderSubtitle => - 'Service used when searching by track name.'; + 'Service used for searching by track or album name'; @override String optionsUsingExtension(String extensionName) { @@ -165,7 +165,7 @@ class AppLocalizationsNl extends AppLocalizations { @override String get optionsEmbedLyricsSubtitle => - 'Embed synced lyrics into FLAC files'; + 'Save synced lyrics alongside your downloaded tracks'; @override String get optionsMaxQualityCover => 'Max Quality Cover'; @@ -214,7 +214,7 @@ class AppLocalizationsNl extends AppLocalizations { @override String optionsConcurrentParallel(int count) { - return ''; + return '$count parallel downloads'; } @override @@ -323,7 +323,7 @@ class AppLocalizationsNl extends AppLocalizations { String get aboutContributors => 'Contributors'; @override - String get aboutMobileDeveloper => ''; + String get aboutMobileDeveloper => 'Mobile version developer'; @override String get aboutOriginalCreator => 'Creator of the original SpotiFLAC'; @@ -1121,10 +1121,10 @@ class AppLocalizationsNl extends AppLocalizations { String get settingsAppearanceSubtitle => 'Theme, colors, display'; @override - String get settingsDownloadSubtitle => 'Service, quality, filename format'; + String get settingsDownloadSubtitle => 'Service, quality, fallback'; @override - String get settingsOptionsSubtitle => 'Fallback, lyrics, cover art, updates'; + String get settingsOptionsSubtitle => 'Fallback, metadata, lyrics, cover art'; @override String get settingsExtensionsSubtitle => 'Manage download providers'; @@ -2423,7 +2423,7 @@ class AppLocalizationsNl extends AppLocalizations { @override String get trackConvertFormatSubtitle => - 'Convert to MP3, Opus, ALAC, or FLAC'; + 'Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC'; @override String get trackConvertTitle => 'Convert Audio'; @@ -2776,14 +2776,14 @@ class AppLocalizationsNl extends AppLocalizations { @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Artist folders use Album Artist when available'; + 'Folder named after Album Artist tag'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => - 'Artist folders use Track Artist only'; + 'Folder named after Track Artist tag'; @override - String get lyricsProvidersTitle => 'Lyrics Providers'; + String get lyricsProvidersTitle => 'Lyrics Provider Priority'; @override String get lyricsProvidersDescription => @@ -2851,10 +2851,10 @@ class AppLocalizationsNl extends AppLocalizations { String get safMigrationSuccess => 'Download folder updated to SAF mode'; @override - String get settingsDonate => 'Donate'; + String get settingsDonate => 'Support Development'; @override - String get settingsDonateSubtitle => 'Support SpotiFLAC-Mobile development'; + String get settingsDonateSubtitle => 'Buy the developer a coffee'; @override String get tooltipLoveAll => 'Love All'; @@ -2914,20 +2914,20 @@ class AppLocalizationsNl extends AppLocalizations { @override String get downloadLocationSubtitle => - 'Choose storage mode for downloaded files.'; + 'Choose where to save your downloaded tracks'; @override - String get storageModeAppFolder => 'App folder (non-SAF)'; + String get storageModeAppFolder => 'App Folder (Recommended)'; @override - String get storageModeAppFolderSubtitle => 'Use default Music/SpotiFLAC path'; + String get storageModeAppFolderSubtitle => + 'Saves to Music/SpotiFLAC by default'; @override - String get storageModeSaf => 'SAF folder'; + String get storageModeSaf => 'Custom Folder (SAF)'; @override - String get storageModeSafSubtitle => - 'Pick folder via Android Storage Access Framework'; + String get storageModeSafSubtitle => 'Pick any folder, including SD card'; @override String downloadFilenameDescription( @@ -2939,62 +2939,62 @@ class AppLocalizationsNl extends AppLocalizations { Object track, Object year, ) { - return 'Customize how your files are named.'; + return 'Use $artist, $title, $album, $track, $year, $date, $disc as placeholders.'; } @override String get downloadFilenameInsertTag => 'Tap to insert tag:'; @override - String get downloadSeparateSinglesEnabled => 'Albums/ and Singles/ folders'; + String get downloadSeparateSinglesEnabled => + 'Singles and EPs saved in a separate folder'; @override - String get downloadSeparateSinglesDisabled => 'All files in same structure'; + String get downloadSeparateSinglesDisabled => + 'Singles and albums saved in the same folder'; @override String get downloadArtistNameFilters => 'Artist Name Filters'; @override - String get downloadCreatePlaylistSourceFolder => - 'Create playlist source folder'; + String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder'; @override String get downloadCreatePlaylistSourceFolderEnabled => - 'Playlist downloads use Playlist/ plus your normal folder structure.'; + 'A subfolder is created for each playlist'; @override String get downloadCreatePlaylistSourceFolderDisabled => - 'Playlist downloads use the normal folder structure only.'; + 'All tracks saved directly to download folder'; @override String get downloadCreatePlaylistSourceFolderRedundant => - 'By Playlist already places downloads inside a playlist folder.'; + 'Handled by folder organization setting'; @override String get downloadSongLinkRegion => 'SongLink Region'; @override - String get downloadNetworkCompatibilityMode => 'Network compatibility mode'; + String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode'; @override String get downloadNetworkCompatibilityModeEnabled => - 'Enabled: try HTTP + accept invalid TLS certificates (unsafe)'; + 'Using legacy TLS settings for older networks'; @override String get downloadNetworkCompatibilityModeDisabled => - 'Off: strict HTTPS certificate validation (recommended)'; + 'Using standard network settings'; @override String get downloadSelectServiceToEnable => - 'Select a built-in service to enable'; + 'Select Tidal or Qobuz to enable this option'; @override String get downloadSelectTidalQobuz => - 'Select Tidal or Qobuz above to configure quality'; + 'Select Tidal or Qobuz to choose audio quality'; @override - String get downloadEmbedLyricsDisabled => - 'Disabled while Embed Metadata is turned off'; + String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first'; @override String get downloadNeteaseIncludeTranslation => @@ -3002,11 +3002,11 @@ class AppLocalizationsNl extends AppLocalizations { @override String get downloadNeteaseIncludeTranslationEnabled => - 'Append translated lyrics when available'; + 'Chinese translation lines included'; @override String get downloadNeteaseIncludeTranslationDisabled => - 'Use original lyrics only'; + 'Original lyrics only'; @override String get downloadNeteaseIncludeRomanization => @@ -3014,21 +3014,21 @@ class AppLocalizationsNl extends AppLocalizations { @override String get downloadNeteaseIncludeRomanizationEnabled => - 'Append romanized lyrics when available'; + 'Romanization lines included'; @override - String get downloadNeteaseIncludeRomanizationDisabled => 'Disabled'; + String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization'; @override - String get downloadAppleQqMultiPerson => 'Apple/QQ Multi-Person Word-by-Word'; + String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics'; @override String get downloadAppleQqMultiPersonEnabled => - 'Enable v1/v2 speaker and [bg:] tags'; + 'Speaker labels included for duets and group tracks'; @override String get downloadAppleQqMultiPersonDisabled => - 'Simplified word-by-word formatting'; + 'Standard lyrics without speaker labels'; @override String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; @@ -3045,46 +3045,45 @@ class AppLocalizationsNl extends AppLocalizations { String get downloadMusixmatchLanguage => 'Musixmatch Language'; @override - String get downloadMusixmatchLanguageAuto => 'Auto (original)'; + String get downloadMusixmatchLanguageAuto => 'Auto (original language)'; @override - String get downloadFilterContributing => - 'Filter contributing artists in Album Artist'; + String get downloadFilterContributing => 'Filter Contributing Artists'; @override String get downloadFilterContributingEnabled => - 'Album Artist metadata uses primary artist only'; + 'Contributing artists removed from Album Artist folder name'; @override String get downloadFilterContributingDisabled => - 'Keep full Album Artist metadata value'; + 'Full Album Artist string used'; @override - String get downloadProvidersNoneEnabled => 'None enabled'; + String get downloadProvidersNoneEnabled => 'No providers enabled'; @override String get downloadMusixmatchLanguageCode => 'Language code'; @override - String get downloadMusixmatchLanguageHint => 'auto / en / es / ja'; + String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja'; @override String get downloadMusixmatchLanguageDesc => - 'Set preferred language code (example: en, es, ja). Leave empty for auto.'; + 'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.'; @override String get downloadMusixmatchAuto => 'Auto'; @override - String get downloadNetworkAnySubtitle => 'WiFi + Mobile Data'; + String get downloadNetworkAnySubtitle => 'Use WiFi or mobile data'; @override String get downloadNetworkWifiOnlySubtitle => - 'Pause downloads on mobile data'; + 'Downloads pause when on mobile data'; @override String get downloadSongLinkRegionDesc => - 'Used as userCountry for SongLink API lookup.'; + 'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.'; @override String get snackbarUnsupportedAudioFormat => 'Unsupported audio format'; @@ -3470,7 +3469,13 @@ class AppLocalizationsNl extends AppLocalizations { @override String notifTracksDownloadedSuccess(int count) { - return '$count tracks downloaded successfully'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks downloaded successfully', + one: '1 track downloaded successfully', + ); + return '$_temp0'; } @override diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 998802d0..636c8959 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -4266,6 +4266,12 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get homeSubtitle => 'Paste a supported URL or search by name'; + @override + String get homeEmptyTitle => 'No search providers yet'; + + @override + String get homeEmptySubtitle => 'Install an extension to continue.'; + @override String get homeSupports => 'Suporte: Faixas, Álbuns, Playlists, URLs de Artista'; @@ -4359,7 +4365,7 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get optionsPrimaryProviderSubtitle => - 'Serviço usado ao pesquisar por nome da faixa.'; + 'Service used for searching by track or album name'; @override String optionsUsingExtension(String extensionName) { @@ -4400,7 +4406,7 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get optionsEmbedLyricsSubtitle => - 'Incorporar letras sincronizadas aos arquivos FLAC'; + 'Save synced lyrics alongside your downloaded tracks'; @override String get optionsMaxQualityCover => 'Capa de Qualidade Máxima'; @@ -4785,6 +4791,16 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { String get setupAllowAccessToManageFiles => 'Por favor, habilite \"Permitir acesso para gerenciar todos os arquivos\" na próxima tela.'; + @override + String get setupLanguageTitle => 'Choose Language'; + + @override + String get setupLanguageDescription => + 'Select your preferred language for the app. You can change this later in Settings.'; + + @override + String get setupLanguageSystemDefault => 'System Default'; + @override String get dialogCancel => 'Cancelar'; @@ -4973,6 +4989,9 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get errorNoTracksFound => 'Nenhuma faixa encontrada'; + @override + String get searchEmptyResultSubtitle => 'Try another keyword'; + @override String get errorUrlNotRecognized => 'Link not recognized'; @@ -5353,12 +5372,10 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { String get settingsAppearanceSubtitle => 'Tema, cores, exibição'; @override - String get settingsDownloadSubtitle => - 'Serviço, qualidade, formato de nome de arquivo'; + String get settingsDownloadSubtitle => 'Service, quality, fallback'; @override - String get settingsOptionsSubtitle => - 'Fallback, letras, arte de capa, atualizações'; + String get settingsOptionsSubtitle => 'Fallback, metadata, lyrics, cover art'; @override String get settingsExtensionsSubtitle => 'Gerenciar provedores de download'; @@ -5457,6 +5474,11 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get trackCopyLyrics => 'Copiar letra'; + @override + String trackLyricsSource(String source) { + return 'Source: $source'; + } + @override String get trackLyricsNotAvailable => 'Letra não disponível para esta faixa'; @@ -5671,6 +5693,16 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get extensionsInstalledSuccess => 'Extensão instalada com sucesso'; + @override + String extensionsInstalledCount(int count) { + return '$count extensions installed successfully'; + } + + @override + String extensionsInstallPartialSuccess(int installed, int attempted) { + return 'Installed $installed of $attempted extensions'; + } + @override String get extensionsDownloadPriority => 'Prioridade de Download'; @@ -5754,6 +5786,13 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get downloadLossyMp3Subtitle => 'Best compatibility, ~10MB per track'; + @override + String get downloadLossyAac => 'AAC/M4A 320kbps'; + + @override + String get downloadLossyAacSubtitle => + 'Best mobile compatibility, M4A container'; + @override String get downloadLossyOpus256 => 'Opus 256kbps'; @@ -6640,7 +6679,7 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get trackConvertFormatSubtitle => - 'Convert to MP3, Opus, ALAC, or FLAC'; + 'Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC'; @override String get trackConvertTitle => 'Convert Audio'; @@ -6746,6 +6785,9 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get collectionLoved => 'Loved'; + @override + String get collectionFavoriteArtists => 'Favorite Artists'; + @override String get collectionPlaylists => 'Playlists'; @@ -6776,6 +6818,17 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { return '$_temp0'; } + @override + String collectionArtistCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count artists', + one: '1 artist', + ); + return '$_temp0'; + } + @override String collectionAddedToPlaylist(String playlistName) { return 'Added to \"$playlistName\"'; @@ -6826,6 +6879,13 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { String get collectionLovedEmptySubtitle => 'Tap love on tracks to keep your favorites'; + @override + String get collectionFavoriteArtistsEmptyTitle => 'No favorite artists yet'; + + @override + String get collectionFavoriteArtistsEmptySubtitle => + 'Tap the heart on an artist page to keep them here'; + @override String get collectionPlaylistEmptyTitle => 'Playlist is empty'; @@ -6864,6 +6924,16 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { return '\"$trackName\" removed from Wishlist'; } + @override + String collectionAddedToFavoriteArtists(String artistName) { + return '\"$artistName\" added to Favorite Artists'; + } + + @override + String collectionRemovedFromFavoriteArtists(String artistName) { + return '\"$artistName\" removed from Favorite Artists'; + } + @override String get trackOptionAddToLoved => 'Add to Loved'; @@ -6876,6 +6946,12 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get trackOptionRemoveFromWishlist => 'Remove from Wishlist'; + @override + String get artistOptionAddToFavorites => 'Add to Favorite Artists'; + + @override + String get artistOptionRemoveFromFavorites => 'Remove from Favorite Artists'; + @override String get collectionPlaylistChangeCover => 'Change cover image'; @@ -6956,14 +7032,14 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Artist folders use Album Artist when available'; + 'Folder named after Album Artist tag'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => - 'Artist folders use Track Artist only'; + 'Folder named after Track Artist tag'; @override - String get lyricsProvidersTitle => 'Lyrics Providers'; + String get lyricsProvidersTitle => 'Lyrics Provider Priority'; @override String get lyricsProvidersDescription => @@ -7031,10 +7107,10 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { String get safMigrationSuccess => 'Download folder updated to SAF mode'; @override - String get settingsDonate => 'Donate'; + String get settingsDonate => 'Support Development'; @override - String get settingsDonateSubtitle => 'Support SpotiFLAC-Mobile development'; + String get settingsDonateSubtitle => 'Buy the developer a coffee'; @override String get tooltipLoveAll => 'Love All'; @@ -7094,20 +7170,20 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get downloadLocationSubtitle => - 'Choose storage mode for downloaded files.'; + 'Choose where to save your downloaded tracks'; @override - String get storageModeAppFolder => 'App folder (non-SAF)'; + String get storageModeAppFolder => 'App Folder (Recommended)'; @override - String get storageModeAppFolderSubtitle => 'Use default Music/SpotiFLAC path'; + String get storageModeAppFolderSubtitle => + 'Saves to Music/SpotiFLAC by default'; @override - String get storageModeSaf => 'SAF folder'; + String get storageModeSaf => 'Custom Folder (SAF)'; @override - String get storageModeSafSubtitle => - 'Pick folder via Android Storage Access Framework'; + String get storageModeSafSubtitle => 'Pick any folder, including SD card'; @override String downloadFilenameDescription( @@ -7119,62 +7195,62 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { Object track, Object year, ) { - return 'Customize how your files are named.'; + return 'Use $artist, $title, $album, $track, $year, $date, $disc as placeholders.'; } @override String get downloadFilenameInsertTag => 'Tap to insert tag:'; @override - String get downloadSeparateSinglesEnabled => 'Albums/ and Singles/ folders'; + String get downloadSeparateSinglesEnabled => + 'Singles and EPs saved in a separate folder'; @override - String get downloadSeparateSinglesDisabled => 'All files in same structure'; + String get downloadSeparateSinglesDisabled => + 'Singles and albums saved in the same folder'; @override String get downloadArtistNameFilters => 'Artist Name Filters'; @override - String get downloadCreatePlaylistSourceFolder => - 'Create playlist source folder'; + String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder'; @override String get downloadCreatePlaylistSourceFolderEnabled => - 'Playlist downloads use Playlist/ plus your normal folder structure.'; + 'A subfolder is created for each playlist'; @override String get downloadCreatePlaylistSourceFolderDisabled => - 'Playlist downloads use the normal folder structure only.'; + 'All tracks saved directly to download folder'; @override String get downloadCreatePlaylistSourceFolderRedundant => - 'By Playlist already places downloads inside a playlist folder.'; + 'Handled by folder organization setting'; @override String get downloadSongLinkRegion => 'SongLink Region'; @override - String get downloadNetworkCompatibilityMode => 'Network compatibility mode'; + String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode'; @override String get downloadNetworkCompatibilityModeEnabled => - 'Enabled: try HTTP + accept invalid TLS certificates (unsafe)'; + 'Using legacy TLS settings for older networks'; @override String get downloadNetworkCompatibilityModeDisabled => - 'Off: strict HTTPS certificate validation (recommended)'; + 'Using standard network settings'; @override String get downloadSelectServiceToEnable => - 'Select a built-in service to enable'; + 'Select Tidal or Qobuz to enable this option'; @override String get downloadSelectTidalQobuz => - 'Select Tidal or Qobuz above to configure quality'; + 'Select Tidal or Qobuz to choose audio quality'; @override - String get downloadEmbedLyricsDisabled => - 'Disabled while Embed Metadata is turned off'; + String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first'; @override String get downloadNeteaseIncludeTranslation => @@ -7182,11 +7258,11 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get downloadNeteaseIncludeTranslationEnabled => - 'Append translated lyrics when available'; + 'Chinese translation lines included'; @override String get downloadNeteaseIncludeTranslationDisabled => - 'Use original lyrics only'; + 'Original lyrics only'; @override String get downloadNeteaseIncludeRomanization => @@ -7194,66 +7270,76 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get downloadNeteaseIncludeRomanizationEnabled => - 'Append romanized lyrics when available'; + 'Romanization lines included'; @override - String get downloadNeteaseIncludeRomanizationDisabled => 'Disabled'; + String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization'; @override - String get downloadAppleQqMultiPerson => 'Apple/QQ Multi-Person Word-by-Word'; + String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics'; @override String get downloadAppleQqMultiPersonEnabled => - 'Enable v1/v2 speaker and [bg:] tags'; + 'Speaker labels included for duets and group tracks'; @override String get downloadAppleQqMultiPersonDisabled => - 'Simplified word-by-word formatting'; + 'Standard lyrics without speaker labels'; + + @override + String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; + + @override + String get downloadAppleElrcWordSyncEnabled => + 'Raw word-by-word timestamps preserved'; + + @override + String get downloadAppleElrcWordSyncDisabled => + 'Safer line-by-line Apple Music lyrics'; @override String get downloadMusixmatchLanguage => 'Musixmatch Language'; @override - String get downloadMusixmatchLanguageAuto => 'Auto (original)'; + String get downloadMusixmatchLanguageAuto => 'Auto (original language)'; @override - String get downloadFilterContributing => - 'Filter contributing artists in Album Artist'; + String get downloadFilterContributing => 'Filter Contributing Artists'; @override String get downloadFilterContributingEnabled => - 'Album Artist metadata uses primary artist only'; + 'Contributing artists removed from Album Artist folder name'; @override String get downloadFilterContributingDisabled => - 'Keep full Album Artist metadata value'; + 'Full Album Artist string used'; @override - String get downloadProvidersNoneEnabled => 'None enabled'; + String get downloadProvidersNoneEnabled => 'No providers enabled'; @override String get downloadMusixmatchLanguageCode => 'Language code'; @override - String get downloadMusixmatchLanguageHint => 'auto / en / es / ja'; + String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja'; @override String get downloadMusixmatchLanguageDesc => - 'Set preferred language code (example: en, es, ja). Leave empty for auto.'; + 'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.'; @override String get downloadMusixmatchAuto => 'Auto'; @override - String get downloadNetworkAnySubtitle => 'WiFi + Mobile Data'; + String get downloadNetworkAnySubtitle => 'Use WiFi or mobile data'; @override String get downloadNetworkWifiOnlySubtitle => - 'Pause downloads on mobile data'; + 'Downloads pause when on mobile data'; @override String get downloadSongLinkRegionDesc => - 'Used as userCountry for SongLink API lookup.'; + 'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.'; @override String get snackbarUnsupportedAudioFormat => 'Unsupported audio format'; @@ -7456,6 +7542,15 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get audioAnalysisSampleRate => 'Sample Rate'; + @override + String get audioAnalysisCodec => 'Codec'; + + @override + String get audioAnalysisContainer => 'Container'; + + @override + String get audioAnalysisDecodedFormat => 'Decoded Format'; + @override String get audioAnalysisBitDepth => 'Bit Depth'; @@ -7480,6 +7575,24 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get audioAnalysisRms => 'RMS'; + @override + String get audioAnalysisLufs => 'LUFS'; + + @override + String get audioAnalysisTruePeak => 'True Peak'; + + @override + String get audioAnalysisClipping => 'Clipping'; + + @override + String get audioAnalysisNoClipping => 'No clipping'; + + @override + String get audioAnalysisSpectralCutoff => 'Spectral Cutoff'; + + @override + String get audioAnalysisChannelStats => 'Per-channel Stats'; + @override String get audioAnalysisSamples => 'Samples'; @@ -7508,6 +7621,13 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { String get extensionsHomeFeedAutoSubtitle => 'Automatically select the best available'; + @override + String get extensionsHomeFeedOff => 'Off'; + + @override + String get extensionsHomeFeedOffSubtitle => + 'Do not show the home feed on the main screen'; + @override String extensionsHomeFeedUse(String extensionName) { return 'Use $extensionName home feed'; @@ -7605,7 +7725,44 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String notifTracksDownloadedSuccess(int count) { - return '$count tracks downloaded successfully'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks downloaded successfully', + one: '1 track downloaded successfully', + ); + return '$_temp0'; + } + + @override + String notifDownloadsFinishedBody(int completed, int failed) { + String _temp0 = intl.Intl.pluralLogic( + completed, + locale: localeName, + other: '$completed tracks downloaded', + one: '1 track downloaded', + ); + String _temp1 = intl.Intl.pluralLogic( + failed, + locale: localeName, + other: '$failed failed', + one: '1 failed', + ); + return '$_temp0, $_temp1'; + } + + @override + String get notifDownloadsCanceledTitle => 'Downloads canceled'; + + @override + String notifDownloadsCanceledBody(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count downloads canceled by user', + one: '1 download canceled by user', + ); + return '$_temp0'; } @override @@ -7677,6 +7834,232 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { String get notifUpdateFailedBody => 'Could not download update. Try again later.'; + @override + String get searchTracks => 'Tracks'; + + @override + String get homeSearchHintDefault => 'Paste supported URL or search...'; + + @override + String homeSearchHintProvider(String providerName) { + return 'Search with $providerName...'; + } + + @override + String get homeImportCsvTooltip => 'Import CSV'; + + @override + String get homeChangeSearchProviderTooltip => 'Change search provider'; + + @override + String get actionPaste => 'Paste'; + + @override + String get searchTracksHint => 'Search tracks...'; + + @override + String get searchTracksEmptyPrompt => 'Search for tracks'; + + @override + String get tutorialSearchHint => 'Paste or search...'; + + @override + String get tutorialDownloadCompletedSemantics => 'Download completed'; + + @override + String get tutorialDownloadInProgressSemantics => 'Download in progress'; + + @override + String get tutorialStartDownloadSemantics => 'Start download'; + + @override + String get optionsEmbedMetadata => 'Embed Metadata'; + + @override + String get optionsEmbedMetadataSubtitleOn => + 'Write metadata, cover art, and embedded lyrics to files'; + + @override + String get optionsEmbedMetadataSubtitleOff => + 'Disabled (advanced): skip all metadata embedding'; + + @override + String get optionsMaxQualityCoverSubtitleDisabled => + 'Disabled when metadata embedding is off'; + + @override + String downloadFilenameHintExample(Object artist, Object title) { + return '$artist - $title'; + } + + @override + String get trackCoverNoEmbeddedArt => 'No embedded album art found'; + + @override + String get trackCoverReplace => 'Replace Cover'; + + @override + String get trackCoverPick => 'Pick Cover'; + + @override + String get trackCoverClearSelected => 'Clear selected cover'; + + @override + String get trackCoverCurrent => 'Current cover'; + + @override + String get trackCoverSelected => 'Selected cover'; + + @override + String get trackCoverReplaceNotice => + 'The selected cover will replace the current embedded cover when you tap Save.'; + + @override + String get actionStop => 'Stop'; + + @override + String get queueFinalizingDownload => 'Finalizing download'; + + @override + String get queueDownloadedFileMissing => 'Downloaded file missing'; + + @override + String get queueDownloadCompleted => 'Download completed'; + + @override + String get queueRateLimitTitle => 'Service rate limited'; + + @override + String get queueRateLimitMessage => + 'This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.'; + + @override + String appearanceSelectAccentColor(String hex) { + return 'Select accent color $hex'; + } + + @override + String get logAutoScrollOn => 'Auto-scroll ON'; + + @override + String get logAutoScrollOff => 'Auto-scroll OFF'; + + @override + String get logCopyLogs => 'Copy logs'; + + @override + String get logClearSearch => 'Clear search'; + + @override + String get logIssueIspBlockingLabel => 'ISP BLOCKING DETECTED'; + + @override + String get logIssueIspBlockingDescription => + 'Your ISP may be blocking access to download services'; + + @override + String get logIssueIspBlockingSuggestion => + 'Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8'; + + @override + String get logIssueRateLimitedLabel => 'RATE LIMITED'; + + @override + String get logIssueRateLimitedDescription => + 'Too many requests to the service'; + + @override + String get logIssueRateLimitedSuggestion => + 'Wait a few minutes before trying again'; + + @override + String get logIssueNetworkErrorLabel => 'NETWORK ERROR'; + + @override + String get logIssueNetworkErrorDescription => 'Connection issues detected'; + + @override + String get logIssueNetworkErrorSuggestion => 'Check your internet connection'; + + @override + String get logIssueTrackNotFoundLabel => 'TRACK NOT FOUND'; + + @override + String get logIssueTrackNotFoundDescription => + 'Some tracks could not be found on download services'; + + @override + String get logIssueTrackNotFoundSuggestion => + 'The track may not be available in lossless quality'; + + @override + String get clickableLookingUpArtist => 'Looking up artist...'; + + @override + String clickableInformationUnavailable(String type) { + return '$type information not available'; + } + + @override + String get extensionDetailsTags => 'Tags'; + + @override + String get extensionDetailsInformation => 'Information'; + + @override + String get extensionUtilityFunctions => 'Utility Functions'; + + @override + String get actionDismiss => 'Dismiss'; + + @override + String get setupChangeFolderTooltip => 'Change folder'; + + @override + String a11yOpenTrackByArtist(String trackName, String artistName) { + return 'Open track $trackName by $artistName'; + } + + @override + String a11yOpenItem(String itemType, String name) { + return 'Open $itemType $name'; + } + + @override + String a11yOpenItemCount(String title, int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'items', + one: 'item', + ); + return 'Open $title, $count $_temp0'; + } + + @override + String a11yOpenAlbumByArtistTrackCount( + String albumName, + String artistName, + int trackCount, + ) { + return 'Open album $albumName by $artistName, $trackCount tracks'; + } + + @override + String a11yTrackByArtist(String trackName, String artistName) { + return '$trackName by $artistName'; + } + + @override + String a11ySelectAlbum(String albumName) { + return 'Select album $albumName'; + } + + @override + String a11yOpenAlbum(String albumName) { + return 'Open album $albumName'; + } + @override String get optionsDefaultSearchTabAlbums => 'Albums'; @@ -7743,4 +8126,379 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get downloadFallbackExtensionsSubtitle => 'Choose which extensions can be used as fallback'; + + @override + String get editMetadataFieldDateHint => 'YYYY-MM-DD or YYYY'; + + @override + String get editMetadataFieldTrackTotal => 'Track Total'; + + @override + String get editMetadataFieldDiscTotal => 'Disc Total'; + + @override + String get editMetadataFieldComposer => 'Composer'; + + @override + String get editMetadataFieldComment => 'Comment'; + + @override + String get editMetadataAdvanced => 'Advanced'; + + @override + String get libraryFilterMetadataMissingTrackNumber => 'Missing track number'; + + @override + String get libraryFilterMetadataMissingDiscNumber => 'Missing disc number'; + + @override + String get libraryFilterMetadataMissingArtist => 'Missing artist'; + + @override + String get libraryFilterMetadataIncorrectIsrcFormat => + 'Incorrect ISRC format'; + + @override + String get libraryFilterMetadataMissingLabel => 'Missing label'; + + @override + String collectionDeletePlaylistsMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Delete $count $_temp0?'; + } + + @override + String collectionPlaylistsDeleted(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return '$count $_temp0 deleted'; + } + + @override + String collectionAddedTracksToPlaylist(int count, String playlistName) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Added $count $_temp0 to $playlistName'; + } + + @override + String collectionAddedTracksToPlaylistWithExisting( + int count, + String playlistName, + int alreadyCount, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Added $count $_temp0 to $playlistName ($alreadyCount already in playlist)'; + } + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'items', + one: 'item', + ); + return '$count $_temp0'; + } + + @override + String trackReEnrichSuccessWithFailures( + int successCount, + int total, + int failedCount, + ) { + return 'Metadata re-enriched successfully ($successCount/$total) - Failed: $failedCount'; + } + + @override + String selectionDeleteTracksCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Delete $count $_temp0'; + } + + @override + String queueDownloadSpeedStatus(String speed) { + return 'Downloading - $speed MB/s'; + } + + @override + String get queueDownloadStarting => 'Starting...'; + + @override + String get a11ySelectTrack => 'Select track'; + + @override + String get a11yDeselectTrack => 'Deselect track'; + + @override + String a11yPlayTrackByArtist(String trackName, String artistName) { + return 'Play $trackName by $artistName'; + } + + @override + String storeExtensionsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'extensions', + one: 'extension', + ); + return '$count $_temp0'; + } + + @override + String storeRequiresVersion(String version) { + return 'Requires v$version+'; + } + + @override + String get actionGo => 'Go'; + + @override + String get logIssueSummary => 'Issue Summary'; + + @override + String logTotalErrors(int count) { + return 'Total errors: $count'; + } + + @override + String logAffectedDomains(String domains) { + return 'Affected: $domains'; + } + + @override + String get libraryScanCancelled => 'Scan cancelled'; + + @override + String get libraryScanCancelledSubtitle => + 'You can retry the scan when ready.'; + + @override + String libraryDownloadsHistoryExcluded(int count) { + return '$count from Downloads history (excluded from list)'; + } + + @override + String get downloadNativeWorker => 'Native download worker'; + + @override + String get downloadNativeWorkerSubtitle => + 'Beta Android service worker for extension downloads'; + + @override + String get badgeBeta => 'BETA'; + + @override + String get extensionServiceStatus => 'Service Status'; + + @override + String get extensionServiceHealth => 'Service health'; + + @override + String extensionHealthChecksConfigured(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'checks', + one: 'check', + ); + return '$count $_temp0 configured'; + } + + @override + String get extensionOauthConnectHint => + 'Tap Connect to Spotify to fill this field.'; + + @override + String extensionLastChecked(String time) { + return 'Last checked $time'; + } + + @override + String get extensionRefreshStatus => 'Refresh status'; + + @override + String get extensionCustomUrlHandling => 'Custom URL Handling'; + + @override + String get extensionCustomUrlHandlingSubtitle => + 'This extension can handle links from these sites'; + + @override + String get extensionCustomUrlHandlingShareHint => + 'Share links from these sites to SpotiFLAC Mobile and this extension will handle them.'; + + @override + String extensionSettingsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'settings', + one: 'setting', + ); + return '$count $_temp0'; + } + + @override + String get extensionHealthOnline => 'Online'; + + @override + String get extensionHealthDegraded => 'Degraded'; + + @override + String get extensionHealthOffline => 'Offline'; + + @override + String get extensionHealthNotConfigured => 'Not configured'; + + @override + String get extensionHealthUnknown => 'Unknown'; + + @override + String get extensionHealthRequired => 'required'; + + @override + String get extensionSettingNotSet => 'Not set'; + + @override + String get extensionActionFailed => 'Action failed'; + + @override + String get extensionEnterValue => 'Enter value'; + + @override + String get extensionHealthServiceOnline => 'Service online'; + + @override + String get extensionHealthServiceDegraded => 'Service degraded'; + + @override + String get extensionHealthServiceOffline => 'Service offline'; + + @override + String get extensionHealthServiceUnknown => 'Service status unknown'; + + @override + String get audioAnalysisStereo => 'Stereo'; + + @override + String get audioAnalysisMono => 'Mono'; + + @override + String trackOpenInService(String serviceName) { + return 'Open in $serviceName'; + } + + @override + String get trackLyricsEmbeddedSource => 'Embedded'; + + @override + String get unknownAlbum => 'Unknown Album'; + + @override + String get unknownArtist => 'Unknown Artist'; + + @override + String get permissionAudio => 'Audio'; + + @override + String get permissionStorage => 'Storage'; + + @override + String get permissionNotification => 'Notification'; + + @override + String get errorInvalidFolderSelected => 'Invalid folder selected'; + + @override + String get errorCouldNotKeepFolderAccess => + 'Could not keep access to the selected folder'; + + @override + String get storeAnyVersion => 'Any'; + + @override + String get storeCategoryMetadata => 'Metadata'; + + @override + String get storeCategoryDownload => 'Download'; + + @override + String get storeCategoryUtility => 'Utility'; + + @override + String get storeCategoryLyrics => 'Lyrics'; + + @override + String get storeCategoryIntegration => 'Integration'; + + @override + String get artistReleases => 'Releases'; + + @override + String get editMetadataSelectNone => 'None'; + + @override + String queueRetryAllFailed(int count) { + return 'Retry $count failed'; + } + + @override + String get settingsSaveDownloadHistory => 'Save download history'; + + @override + String get settingsSaveDownloadHistorySubtitle => + 'Keep completed downloads in history and library views'; + + @override + String get dialogDisableHistoryTitle => 'Turn off download history?'; + + @override + String get dialogDisableHistoryMessage => + 'Existing history will be cleared. Downloaded files will not be deleted.'; + + @override + String get dialogDisableAndClear => 'Turn off and clear'; + + @override + String get openInOtherServices => 'Open in Other Services'; + + @override + String get shareSheetNoExtensions => 'No other compatible services'; + + @override + String get shareSheetNotFound => 'Not found'; + + @override + String get shareSheetCopyLink => 'Copy Link'; + + @override + String shareSheetLinkCopied(Object service) { + return '$service link copied'; + } } diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index bbc648be..3a01b4b4 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -9,7 +9,7 @@ class AppLocalizationsRu extends AppLocalizations { AppLocalizationsRu([String locale = 'ru']) : super(locale); @override - String get appName => 'SpotiFLAC Mobile'; + String get appName => 'Spotify'; @override String get navHome => 'Главная'; @@ -21,13 +21,13 @@ class AppLocalizationsRu extends AppLocalizations { String get navSettings => 'Настройки'; @override - String get navStore => 'Repo'; + String get navStore => 'Репозиторий'; @override String get homeTitle => 'Главная'; @override - String get homeSubtitle => 'Paste a supported URL or search by name'; + String get homeSubtitle => 'Вставьте URL или ищите по названию'; @override String get homeEmptyTitle => 'No search providers yet'; @@ -83,11 +83,11 @@ class AppLocalizationsRu extends AppLocalizations { String get downloadFilenameFormat => 'Формат имени файла'; @override - String get downloadSingleFilenameFormat => 'Single Filename Format'; + String get downloadSingleFilenameFormat => 'Формат имени файла'; @override String get downloadSingleFilenameFormatDescription => - 'Filename pattern for singles and EPs. Uses the same tags as the album format.'; + 'Формат имени файла для синглов и EP. Используются те же теги, что и для альбомов.'; @override String get downloadFolderOrganization => 'Организация папок'; @@ -128,7 +128,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String get optionsPrimaryProviderSubtitle => - 'Сервис, используемый при поиске по названию трека.'; + 'Сервис для поиска по названию трека или альбома'; @override String optionsUsingExtension(String extensionName) { @@ -136,7 +136,7 @@ class AppLocalizationsRu extends AppLocalizations { } @override - String get optionsDefaultSearchTab => 'Default Search Tab'; + String get optionsDefaultSearchTab => 'Вкладка поиска по умолчанию'; @override String get optionsDefaultSearchTabSubtitle => @@ -170,7 +170,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String get optionsEmbedLyricsSubtitle => - 'Вписать синхронизированные тексты во FLAC файлы'; + 'Сохранять синхронизированный текст песни рядом с загруженным треком'; @override String get optionsMaxQualityCover => 'Максимальное качество обложки'; @@ -227,7 +227,7 @@ class AppLocalizationsRu extends AppLocalizations { 'Параллельные загрузки могут вызвать ограничение скорости'; @override - String get optionsExtensionStore => 'Extension Repo'; + String get optionsExtensionStore => 'Репозиторий расширения'; @override String get optionsExtensionStoreSubtitle => 'Show Repo tab in navigation'; @@ -307,7 +307,7 @@ class AppLocalizationsRu extends AppLocalizations { String get extensionsUninstall => 'Удалить'; @override - String get storeTitle => 'Extension Repo'; + String get storeTitle => 'Репозиторий расширения'; @override String get storeSearch => 'Поиск расширений...'; @@ -585,7 +585,7 @@ class AppLocalizationsRu extends AppLocalizations { String get dialogImport => 'Импорт'; @override - String get dialogDownload => 'Download'; + String get dialogDownload => 'Скачать'; @override String get dialogDiscard => 'Отменить'; @@ -637,9 +637,9 @@ class AppLocalizationsRu extends AppLocalizations { count, locale: localeName, other: 'треков', + one: 'трек', many: 'треков', few: 'трека', - one: 'трек', ); return 'Удалить $count $_temp0 из истории?\n\nЭто также удалит файлы из хранилища.'; } @@ -692,9 +692,9 @@ class AppLocalizationsRu extends AppLocalizations { count, locale: localeName, other: 'треков', + one: 'трек', many: 'треков', few: 'трека', - one: 'трек', ); return 'Удалено $count $_temp0'; } @@ -827,34 +827,34 @@ class AppLocalizationsRu extends AppLocalizations { String get searchPlaylists => 'Плейлисты'; @override - String get searchSortTitle => 'Sort Results'; + String get searchSortTitle => 'Упорядочить результаты'; @override - String get searchSortDefault => 'Default'; + String get searchSortDefault => 'По умолчанию'; @override - String get searchSortTitleAZ => 'Title (A-Z)'; + String get searchSortTitleAZ => 'Название (А-Я)'; @override - String get searchSortTitleZA => 'Title (Z-A)'; + String get searchSortTitleZA => 'Название (Я-А)'; @override - String get searchSortArtistAZ => 'Artist (A-Z)'; + String get searchSortArtistAZ => 'Исполнитель (А-Я)'; @override - String get searchSortArtistZA => 'Artist (Z-A)'; + String get searchSortArtistZA => 'Исполнитель (Я-А)'; @override - String get searchSortDurationShort => 'Duration (Shortest)'; + String get searchSortDurationShort => 'Продолжительность (наименьшая)'; @override - String get searchSortDurationLong => 'Duration (Longest)'; + String get searchSortDurationLong => 'Продолжительность (наибольшая)'; @override - String get searchSortDateOldest => 'Release Date (Oldest)'; + String get searchSortDateOldest => 'Дата релиза (старейшая)'; @override - String get searchSortDateNewest => 'Release Date (Newest)'; + String get searchSortDateNewest => 'Дата релиза (новейшая)'; @override String get tooltipPlay => 'Воспроизвести'; @@ -955,7 +955,7 @@ class AppLocalizationsRu extends AppLocalizations { 'Если трек не доступен у первого провайдера, приложение автоматически попробует следующий.'; @override - String get providerPriorityFallbackExtensionsTitle => 'Extension Fallback'; + String get providerPriorityFallbackExtensionsTitle => 'Резервное расширение'; @override String get providerPriorityFallbackExtensionsDescription => @@ -1049,7 +1049,7 @@ class AppLocalizationsRu extends AppLocalizations { String get credentialsClientIdHint => 'Вставьте Client ID'; @override - String get credentialsClientSecret => 'Client Secret'; + String get credentialsClientSecret => 'Секретный код клиента'; @override String get credentialsClientSecretHint => 'Вставьте Client Secret'; @@ -1135,12 +1135,10 @@ class AppLocalizationsRu extends AppLocalizations { String get settingsAppearanceSubtitle => 'Тема, цвета, дисплей'; @override - String get settingsDownloadSubtitle => - 'Сервисы, качество, формат имени файла'; + String get settingsDownloadSubtitle => 'Service, quality, fallback'; @override - String get settingsOptionsSubtitle => - 'Резерв. сервер, тексты песен, обложки, обновления'; + String get settingsOptionsSubtitle => 'Fallback, metadata, lyrics, cover art'; @override String get settingsExtensionsSubtitle => 'Управление провайдерами скачивания'; @@ -1165,9 +1163,9 @@ class AppLocalizationsRu extends AppLocalizations { count, locale: localeName, other: '$count треков', + one: '1 трек', many: '$count треков', few: '$count трека', - one: '$count трек', ); return '$_temp0'; } @@ -1339,19 +1337,19 @@ class AppLocalizationsRu extends AppLocalizations { @override String get storeRepoUrlHelper => - 'e.g. https://github.com/user/extensions-repo'; + 'например, https://github.com/user/extensions-repo'; @override - String get storeAddRepoButton => 'Add Repository'; + String get storeAddRepoButton => 'Добавить репозиторий'; @override - String get storeChangeRepoTooltip => 'Change repository'; + String get storeChangeRepoTooltip => 'Изменить репозиторий'; @override String get storeRepoDialogTitle => 'Extension Repository'; @override - String get storeRepoDialogCurrent => 'Current repository:'; + String get storeRepoDialogCurrent => 'Текущий репозиторий:'; @override String get storeNewRepoUrlLabel => 'New Repository URL'; @@ -1363,10 +1361,10 @@ class AppLocalizationsRu extends AppLocalizations { String get storeEmptyNoExtensions => 'No extensions available'; @override - String get storeEmptyNoResults => 'No extensions found'; + String get storeEmptyNoResults => 'Расширения не найдены'; @override - String get extensionDefaultProvider => 'Default (Deezer)'; + String get extensionDefaultProvider => 'По умолчанию (Deezer)'; @override String get extensionDefaultProviderSubtitle => @@ -1537,23 +1535,24 @@ class AppLocalizationsRu extends AppLocalizations { String get qualityHiResFlacMaxSubtitle => '24-бит / до 192кГц'; @override - String get downloadLossy320 => 'Lossy 320kbps'; + String get downloadLossy320 => 'С потерями 320 кбит/с'; @override - String get downloadLossyFormat => 'Lossy Format'; + String get downloadLossyFormat => 'Формат с потерями'; @override - String get downloadLossy320Format => 'Lossy 320kbps Format'; + String get downloadLossy320Format => 'Формат с потерями 320 кбит/с'; @override String get downloadLossy320FormatDesc => 'Choose the output format for Tidal 320kbps lossy downloads. The original AAC stream will be converted to your selected format.'; @override - String get downloadLossyMp3 => 'MP3 320kbps'; + String get downloadLossyMp3 => 'MP3 320 кбит/с'; @override - String get downloadLossyMp3Subtitle => 'Best compatibility, ~10MB per track'; + String get downloadLossyMp3Subtitle => + 'Наилучшая совместимость, ~10 Мб на трек'; @override String get downloadLossyAac => 'AAC/M4A 320kbps'; @@ -1563,17 +1562,18 @@ class AppLocalizationsRu extends AppLocalizations { 'Best mobile compatibility, M4A container'; @override - String get downloadLossyOpus256 => 'Opus 256kbps'; + String get downloadLossyOpus256 => 'Opus 256 кбит/с'; @override String get downloadLossyOpus256Subtitle => 'Best quality Opus, ~8MB per track'; @override - String get downloadLossyOpus128 => 'Opus 128kbps'; + String get downloadLossyOpus128 => 'Opus 128 кбит/с'; @override - String get downloadLossyOpus128Subtitle => 'Smallest size, ~4MB per track'; + String get downloadLossyOpus128Subtitle => + 'Минимальный размер, ~4 Мб на трек'; @override String get qualityNote => @@ -1696,9 +1696,9 @@ class AppLocalizationsRu extends AppLocalizations { count, locale: localeName, other: 'треков', + one: 'трек', many: 'треков', few: 'трека', - one: 'трек', ); return 'Удалить $count $_temp0 из этого альбома?\n\nЭто также удалит файлы из хранилища.'; } @@ -1720,9 +1720,9 @@ class AppLocalizationsRu extends AppLocalizations { count, locale: localeName, other: 'треков', + one: 'трек', many: 'треков', few: 'трека', - one: 'трек', ); return 'Удалить $count $_temp0'; } @@ -1890,7 +1890,7 @@ class AppLocalizationsRu extends AppLocalizations { 'Показать при поиске существующих треков'; @override - String get libraryAutoScan => 'Auto Scan'; + String get libraryAutoScan => 'Автосканирование'; @override String get libraryAutoScanSubtitle => @@ -1900,13 +1900,13 @@ class AppLocalizationsRu extends AppLocalizations { String get libraryAutoScanOff => 'Off'; @override - String get libraryAutoScanOnOpen => 'Every app open'; + String get libraryAutoScanOnOpen => 'Каждое открытие приложения'; @override - String get libraryAutoScanDaily => 'Daily'; + String get libraryAutoScanDaily => 'Ежедневно'; @override - String get libraryAutoScanWeekly => 'Weekly'; + String get libraryAutoScanWeekly => 'Еженедельно'; @override String get libraryActions => 'Действия'; @@ -1953,9 +1953,9 @@ class AppLocalizationsRu extends AppLocalizations { count, locale: localeName, other: 'треков', + one: 'трек', many: 'треков', few: 'трека', - one: 'трек', ); return '$_temp0'; } @@ -1983,7 +1983,7 @@ class AppLocalizationsRu extends AppLocalizations { String get libraryScanning => 'Сканирование...'; @override - String get libraryScanFinalizing => 'Finalizing library...'; + String get libraryScanFinalizing => 'Завершение работы с библиотекой...'; @override String libraryScanProgress(String progress, int total) { @@ -2056,25 +2056,25 @@ class AppLocalizationsRu extends AppLocalizations { String get libraryFilterQualityCD => 'CD (16 бит)'; @override - String get libraryFilterQualityLossy => 'Lossy'; + String get libraryFilterQualityLossy => 'С потерями'; @override String get libraryFilterFormat => 'Формат'; @override - String get libraryFilterMetadata => 'Metadata'; + String get libraryFilterMetadata => 'Метаданные'; @override String get libraryFilterMetadataComplete => 'Complete metadata'; @override - String get libraryFilterMetadataMissingAny => 'Missing any metadata'; + String get libraryFilterMetadataMissingAny => 'Не хватает метаданных'; @override - String get libraryFilterMetadataMissingYear => 'Missing year'; + String get libraryFilterMetadataMissingYear => 'Отсутствует год'; @override - String get libraryFilterMetadataMissingGenre => 'Missing genre'; + String get libraryFilterMetadataMissingGenre => 'Отсутствует жанр'; @override String get libraryFilterMetadataMissingAlbumArtist => 'Missing album artist'; @@ -2089,16 +2089,16 @@ class AppLocalizationsRu extends AppLocalizations { String get libraryFilterSortOldest => 'Старые'; @override - String get libraryFilterSortAlbumAsc => 'Album (A-Z)'; + String get libraryFilterSortAlbumAsc => 'Альбом (А-Я)'; @override - String get libraryFilterSortAlbumDesc => 'Album (Z-A)'; + String get libraryFilterSortAlbumDesc => 'Альбом (Я-А)'; @override - String get libraryFilterSortGenreAsc => 'Genre (A-Z)'; + String get libraryFilterSortGenreAsc => 'Жанр (А-Я)'; @override - String get libraryFilterSortGenreDesc => 'Genre (Z-A)'; + String get libraryFilterSortGenreDesc => 'Жанр (Я-А)'; @override String get timeJustNow => 'Только что'; @@ -2109,9 +2109,9 @@ class AppLocalizationsRu extends AppLocalizations { count, locale: localeName, other: '$count минут', + one: '1 минуту', many: '$count минут', few: '$count минуты', - one: '$count минуту', ); return '$_temp0 назад'; } @@ -2122,9 +2122,9 @@ class AppLocalizationsRu extends AppLocalizations { count, locale: localeName, other: '$count часов', + one: '1 час', many: '$count часов', few: '$count часа', - one: '$count час', ); return '$_temp0 назад'; } @@ -2391,28 +2391,28 @@ class AppLocalizationsRu extends AppLocalizations { 'Поиск в сети метаданных и встраивание в файл'; @override - String get trackReEnrichFieldsTitle => 'Fields to update'; + String get trackReEnrichFieldsTitle => 'Поля для обновления'; @override - String get trackReEnrichFieldCover => 'Cover Art'; + String get trackReEnrichFieldCover => 'Обложка'; @override - String get trackReEnrichFieldLyrics => 'Lyrics'; + String get trackReEnrichFieldLyrics => 'Текст песни'; @override - String get trackReEnrichFieldBasicTags => 'Album, Album Artist'; + String get trackReEnrichFieldBasicTags => 'Альбом, Исполнитель альбома'; @override - String get trackReEnrichFieldTrackInfo => 'Track & Disc Number'; + String get trackReEnrichFieldTrackInfo => 'Номер трека и диска'; @override - String get trackReEnrichFieldReleaseInfo => 'Date & ISRC'; + String get trackReEnrichFieldReleaseInfo => 'Дата и ISRC'; @override - String get trackReEnrichFieldExtra => 'Genre, Label, Copyright'; + String get trackReEnrichFieldExtra => 'Жанр, Название, Авторские права'; @override - String get trackReEnrichSelectAll => 'Select All'; + String get trackReEnrichSelectAll => 'Выбрать всё'; @override String get trackEditMetadata => 'Редактировать метаданные'; @@ -2444,7 +2444,7 @@ class AppLocalizationsRu extends AppLocalizations { 'Ошибка встраивания метаданных FFmpeg'; @override - String get queueFlacAction => 'Queue FLAC'; + String get queueFlacAction => 'Очередь FLAC'; @override String queueFlacConfirmMessage(int count) { @@ -2453,7 +2453,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String queueFlacFindingProgress(int current, int total) { - return 'Finding FLAC matches... ($current/$total)'; + return 'Поиск совпадений FLAC... ($current/$total)'; } @override @@ -2475,7 +2475,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String get trackConvertFormatSubtitle => - 'Convert to MP3, Opus, ALAC, or FLAC'; + 'Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC'; @override String get trackConvertTitle => 'Конвертировать аудио'; @@ -2507,8 +2507,7 @@ class AppLocalizationsRu extends AppLocalizations { } @override - String get trackConvertLosslessHint => - 'Lossless conversion — no quality loss'; + String get trackConvertLosslessHint => 'Конвертация без потери качества'; @override String get trackConvertConverting => 'Конвертация аудио...'; @@ -2609,9 +2608,9 @@ class AppLocalizationsRu extends AppLocalizations { count, locale: localeName, other: '$count треков', + one: '1 трек', many: '$count треков', few: '$count трека', - one: '$count трек', ); return '$_temp0'; } @@ -2762,9 +2761,9 @@ class AppLocalizationsRu extends AppLocalizations { count, locale: localeName, other: 'треков', + one: 'трек', many: 'треков', few: 'трека', - one: 'трек', ); return 'Отправить $count $_temp0'; } @@ -2779,9 +2778,9 @@ class AppLocalizationsRu extends AppLocalizations { count, locale: localeName, other: 'треков', + one: 'трек', many: 'треков', few: 'трека', - one: 'трек', ); return 'Конвертировать $count $_temp0'; } @@ -2815,7 +2814,7 @@ class AppLocalizationsRu extends AppLocalizations { other: 'tracks', one: 'track', ); - return 'Convert $count $_temp0 to $format? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.'; + return 'Конвертировать $count $_temp0 в $format? (Без потери качества)\n\nОригинальные файлы будут удалены после конвертации.'; } @override @@ -2835,18 +2834,18 @@ class AppLocalizationsRu extends AppLocalizations { @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Для папок исполнителей используется исполнитель альбома, если он указан'; + 'Папка названная в честь тега Альбома Артиста'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => - 'Папки исполнителя используют только трек исполнителя'; + 'Папка названная в честь тега Трека Артиста'; @override - String get lyricsProvidersTitle => 'Lyrics Providers'; + String get lyricsProvidersTitle => 'Приоритет к поставщику текста песни'; @override String get lyricsProvidersDescription => - 'Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.'; + 'Включайте, выключайте, переупорядочивайте источники текстов. Поставщики связаны сверху вниз пока проводится поиск текста.'; @override String get lyricsProvidersInfoText => @@ -2854,12 +2853,12 @@ class AppLocalizationsRu extends AppLocalizations { @override String lyricsProvidersEnabledSection(int count) { - return 'Enabled ($count)'; + return 'Включено ($count)'; } @override String lyricsProvidersDisabledSection(int count) { - return 'Disabled ($count)'; + return 'Выключено ($count)'; } @override @@ -2871,14 +2870,14 @@ class AppLocalizationsRu extends AppLocalizations { @override String get lyricsProvidersDiscardContent => - 'You have unsaved changes that will be lost.'; + 'У вас есть несохранённые изменения, которые будут потеряны.'; @override String get lyricsProviderLrclibDesc => 'Open-source synced lyrics database'; @override String get lyricsProviderNeteaseDesc => - 'NetEase Cloud Music (good for Asian songs)'; + 'NetEase Cloud Music (хорош для азиатских песен)'; @override String get lyricsProviderMusixmatchDesc => @@ -2890,10 +2889,10 @@ class AppLocalizationsRu extends AppLocalizations { @override String get lyricsProviderQqMusicDesc => - 'QQ Music (good for Chinese songs, via proxy)'; + 'QQ Музыка (хорошо подходит для китайских песен, через прокси)'; @override - String get lyricsProviderExtensionDesc => 'Extension provider'; + String get lyricsProviderExtensionDesc => 'Поставщик расширений'; @override String get safMigrationTitle => 'Storage Update Required'; @@ -2910,16 +2909,16 @@ class AppLocalizationsRu extends AppLocalizations { String get safMigrationSuccess => 'Download folder updated to SAF mode'; @override - String get settingsDonate => 'Donate'; + String get settingsDonate => 'Support Development'; @override - String get settingsDonateSubtitle => 'Support SpotiFLAC-Mobile development'; + String get settingsDonateSubtitle => 'Buy the developer a coffee'; @override String get tooltipLoveAll => 'Love All'; @override - String get tooltipAddToPlaylist => 'Add to Playlist'; + String get tooltipAddToPlaylist => 'Добавить в плейлист'; @override String snackbarRemovedTracksFromLoved(int count) { @@ -2932,7 +2931,7 @@ class AppLocalizationsRu extends AppLocalizations { } @override - String get dialogDownloadAllTitle => 'Download All'; + String get dialogDownloadAllTitle => 'Скачать всё'; @override String dialogDownloadAllMessage(int count) { @@ -2943,16 +2942,16 @@ class AppLocalizationsRu extends AppLocalizations { String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @override - String get homeGoToAlbum => 'Go to Album'; + String get homeGoToAlbum => 'Перейти к альбому'; @override String get homeAlbumInfoUnavailable => 'Album info not available'; @override - String get snackbarLoadingCueSheet => 'Loading CUE sheet...'; + String get snackbarLoadingCueSheet => 'Загрузка CUE разметки...'; @override - String get snackbarMetadataSaved => 'Metadata saved successfully'; + String get snackbarMetadataSaved => 'Метаданные успешно сохранены'; @override String get snackbarFailedToEmbedLyrics => 'Failed to embed lyrics'; @@ -2962,7 +2961,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String snackbarError(String error) { - return 'Error: $error'; + return 'Ошибка: $error'; } @override @@ -2973,20 +2972,20 @@ class AppLocalizationsRu extends AppLocalizations { @override String get downloadLocationSubtitle => - 'Choose storage mode for downloaded files.'; + 'Choose where to save your downloaded tracks'; @override - String get storageModeAppFolder => 'App folder (non-SAF)'; + String get storageModeAppFolder => 'App Folder (Recommended)'; @override - String get storageModeAppFolderSubtitle => 'Use default Music/SpotiFLAC path'; + String get storageModeAppFolderSubtitle => + 'Saves to Music/SpotiFLAC by default'; @override - String get storageModeSaf => 'SAF folder'; + String get storageModeSaf => 'Custom Folder (SAF)'; @override - String get storageModeSafSubtitle => - 'Pick folder via Android Storage Access Framework'; + String get storageModeSafSubtitle => 'Pick any folder, including SD card'; @override String downloadFilenameDescription( @@ -2998,74 +2997,73 @@ class AppLocalizationsRu extends AppLocalizations { Object track, Object year, ) { - return 'Customize how your files are named.'; + return 'Use $artist, $title, $album, $track, $year, $date, $disc as placeholders.'; } @override - String get downloadFilenameInsertTag => 'Tap to insert tag:'; + String get downloadFilenameInsertTag => 'Нажмите для вставки тега:'; @override - String get downloadSeparateSinglesEnabled => 'Albums/ and Singles/ folders'; + String get downloadSeparateSinglesEnabled => + 'Singles and EPs saved in a separate folder'; @override - String get downloadSeparateSinglesDisabled => 'All files in same structure'; + String get downloadSeparateSinglesDisabled => + 'Singles and albums saved in the same folder'; @override String get downloadArtistNameFilters => 'Artist Name Filters'; @override - String get downloadCreatePlaylistSourceFolder => - 'Create playlist source folder'; + String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder'; @override String get downloadCreatePlaylistSourceFolderEnabled => - 'Playlist downloads use Playlist/ plus your normal folder structure.'; + 'A subfolder is created for each playlist'; @override String get downloadCreatePlaylistSourceFolderDisabled => - 'Playlist downloads use the normal folder structure only.'; + 'All tracks saved directly to download folder'; @override String get downloadCreatePlaylistSourceFolderRedundant => - 'By Playlist already places downloads inside a playlist folder.'; + 'Handled by folder organization setting'; @override - String get downloadSongLinkRegion => 'SongLink Region'; + String get downloadSongLinkRegion => 'Регион SongLink'; @override - String get downloadNetworkCompatibilityMode => 'Network compatibility mode'; + String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode'; @override String get downloadNetworkCompatibilityModeEnabled => - 'Enabled: try HTTP + accept invalid TLS certificates (unsafe)'; + 'Using legacy TLS settings for older networks'; @override String get downloadNetworkCompatibilityModeDisabled => - 'Off: strict HTTPS certificate validation (recommended)'; + 'Using standard network settings'; @override String get downloadSelectServiceToEnable => - 'Select a built-in service to enable'; + 'Select Tidal or Qobuz to enable this option'; @override String get downloadSelectTidalQobuz => - 'Select Tidal or Qobuz above to configure quality'; + 'Select Tidal or Qobuz to choose audio quality'; @override - String get downloadEmbedLyricsDisabled => - 'Disabled while Embed Metadata is turned off'; + String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first'; @override - String get downloadNeteaseIncludeTranslation => - 'Netease: Include Translation'; + String get downloadNeteaseIncludeTranslation => 'Netease: включение перевода'; @override String get downloadNeteaseIncludeTranslationEnabled => - 'Append translated lyrics when available'; + 'Chinese translation lines included'; @override String get downloadNeteaseIncludeTranslationDisabled => - 'Use original lyrics only'; + 'Original lyrics only'; @override String get downloadNeteaseIncludeRomanization => @@ -3073,21 +3071,21 @@ class AppLocalizationsRu extends AppLocalizations { @override String get downloadNeteaseIncludeRomanizationEnabled => - 'Append romanized lyrics when available'; + 'Romanization lines included'; @override - String get downloadNeteaseIncludeRomanizationDisabled => 'Disabled'; + String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization'; @override - String get downloadAppleQqMultiPerson => 'Apple/QQ Multi-Person Word-by-Word'; + String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics'; @override String get downloadAppleQqMultiPersonEnabled => - 'Enable v1/v2 speaker and [bg:] tags'; + 'Speaker labels included for duets and group tracks'; @override String get downloadAppleQqMultiPersonDisabled => - 'Simplified word-by-word formatting'; + 'Standard lyrics without speaker labels'; @override String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; @@ -3101,55 +3099,54 @@ class AppLocalizationsRu extends AppLocalizations { 'Safer line-by-line Apple Music lyrics'; @override - String get downloadMusixmatchLanguage => 'Musixmatch Language'; + String get downloadMusixmatchLanguage => 'Язык Musixmatch'; @override - String get downloadMusixmatchLanguageAuto => 'Auto (original)'; + String get downloadMusixmatchLanguageAuto => 'Auto (original language)'; @override - String get downloadFilterContributing => - 'Filter contributing artists in Album Artist'; + String get downloadFilterContributing => 'Filter Contributing Artists'; @override String get downloadFilterContributingEnabled => - 'Album Artist metadata uses primary artist only'; + 'Contributing artists removed from Album Artist folder name'; @override String get downloadFilterContributingDisabled => - 'Keep full Album Artist metadata value'; + 'Full Album Artist string used'; @override - String get downloadProvidersNoneEnabled => 'None enabled'; + String get downloadProvidersNoneEnabled => 'No providers enabled'; @override - String get downloadMusixmatchLanguageCode => 'Language code'; + String get downloadMusixmatchLanguageCode => 'Код языка'; @override - String get downloadMusixmatchLanguageHint => 'auto / en / es / ja'; + String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja'; @override String get downloadMusixmatchLanguageDesc => - 'Set preferred language code (example: en, es, ja). Leave empty for auto.'; + 'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.'; @override - String get downloadMusixmatchAuto => 'Auto'; + String get downloadMusixmatchAuto => 'Авто'; @override - String get downloadNetworkAnySubtitle => 'WiFi + Mobile Data'; + String get downloadNetworkAnySubtitle => 'Use WiFi or mobile data'; @override String get downloadNetworkWifiOnlySubtitle => - 'Pause downloads on mobile data'; + 'Downloads pause when on mobile data'; @override String get downloadSongLinkRegionDesc => - 'Used as userCountry for SongLink API lookup.'; + 'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.'; @override - String get snackbarUnsupportedAudioFormat => 'Unsupported audio format'; + String get snackbarUnsupportedAudioFormat => 'Неподдерживаемый аудио формат'; @override - String get cacheRefresh => 'Refresh'; + String get cacheRefresh => 'Обновить'; @override String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { @@ -3205,10 +3202,10 @@ class AppLocalizationsRu extends AppLocalizations { 'Select fields to fill automatically from online metadata'; @override - String get editMetadataAutoFillFetch => 'Fetch & Fill'; + String get editMetadataAutoFillFetch => 'Получить и заполнить'; @override - String get editMetadataAutoFillSearching => 'Searching online...'; + String get editMetadataAutoFillSearching => 'Поиск в сети...'; @override String get editMetadataAutoFillNoResults => @@ -3230,57 +3227,57 @@ class AppLocalizationsRu extends AppLocalizations { 'Select at least one field to auto-fill'; @override - String get editMetadataFieldTitle => 'Title'; + String get editMetadataFieldTitle => 'Название'; @override - String get editMetadataFieldArtist => 'Artist'; + String get editMetadataFieldArtist => 'Исполнитель'; @override - String get editMetadataFieldAlbum => 'Album'; + String get editMetadataFieldAlbum => 'Альбом'; @override - String get editMetadataFieldAlbumArtist => 'Album Artist'; + String get editMetadataFieldAlbumArtist => 'Исполнитель альбома'; @override - String get editMetadataFieldDate => 'Date'; + String get editMetadataFieldDate => 'Дата'; @override - String get editMetadataFieldTrackNum => 'Track #'; + String get editMetadataFieldTrackNum => 'Трек #'; @override - String get editMetadataFieldDiscNum => 'Disc #'; + String get editMetadataFieldDiscNum => 'Диск #'; @override - String get editMetadataFieldGenre => 'Genre'; + String get editMetadataFieldGenre => 'Жанр'; @override String get editMetadataFieldIsrc => 'ISRC'; @override - String get editMetadataFieldLabel => 'Label'; + String get editMetadataFieldLabel => 'Заголовок'; @override - String get editMetadataFieldCopyright => 'Copyright'; + String get editMetadataFieldCopyright => 'Авторские права'; @override - String get editMetadataFieldCover => 'Cover Art'; + String get editMetadataFieldCover => 'Обложка'; @override - String get editMetadataSelectAll => 'All'; + String get editMetadataSelectAll => 'Все'; @override - String get editMetadataSelectEmpty => 'Empty only'; + String get editMetadataSelectEmpty => 'Только пустые'; @override String queueDownloadingCount(int count) { - return 'Downloading ($count)'; + return 'Скачивание ($count)'; } @override - String get queueDownloadedHeader => 'Downloaded'; + String get queueDownloadedHeader => 'Скачано'; @override - String get queueFilteringIndicator => 'Filtering...'; + String get queueFilteringIndicator => 'Фильтрация...'; @override String queueTrackCount(int count) { @@ -3319,13 +3316,13 @@ class AppLocalizationsRu extends AppLocalizations { 'Single track downloads will appear here'; @override - String get queueEmptyHistory => 'No download history'; + String get queueEmptyHistory => 'Нет истории скачиваний'; @override - String get queueEmptyHistorySubtitle => 'Downloaded tracks will appear here'; + String get queueEmptyHistorySubtitle => 'Скачанные треки появятся здесь'; @override - String get selectionAllPlaylistsSelected => 'All playlists selected'; + String get selectionAllPlaylistsSelected => 'Выбраны все плейлисты'; @override String get selectionTapPlaylistsToSelect => 'Tap playlists to select'; @@ -3344,7 +3341,7 @@ class AppLocalizationsRu extends AppLocalizations { String get audioAnalysisAnalyzing => 'Analyzing audio...'; @override - String get audioAnalysisSampleRate => 'Sample Rate'; + String get audioAnalysisSampleRate => 'Частота дискретизации'; @override String get audioAnalysisCodec => 'Codec'; @@ -3356,22 +3353,22 @@ class AppLocalizationsRu extends AppLocalizations { String get audioAnalysisDecodedFormat => 'Decoded Format'; @override - String get audioAnalysisBitDepth => 'Bit Depth'; + String get audioAnalysisBitDepth => 'Разрядность'; @override - String get audioAnalysisChannels => 'Channels'; + String get audioAnalysisChannels => 'Каналы'; @override - String get audioAnalysisDuration => 'Duration'; + String get audioAnalysisDuration => 'Продолжительность'; @override String get audioAnalysisNyquist => 'Nyquist'; @override - String get audioAnalysisFileSize => 'Size'; + String get audioAnalysisFileSize => 'Размер'; @override - String get audioAnalysisDynamicRange => 'Dynamic Range'; + String get audioAnalysisDynamicRange => 'Динамический диапазон'; @override String get audioAnalysisPeak => 'Peak'; @@ -3398,7 +3395,7 @@ class AppLocalizationsRu extends AppLocalizations { String get audioAnalysisChannelStats => 'Per-channel Stats'; @override - String get audioAnalysisSamples => 'Samples'; + String get audioAnalysisSamples => 'Сэмплы'; @override String get audioAnalysisRescan => 'Re-analyze'; @@ -3408,7 +3405,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String extensionsSearchWith(String providerName) { - return 'Search with $providerName'; + return 'Искать с помощью $providerName'; } @override @@ -3419,7 +3416,7 @@ class AppLocalizationsRu extends AppLocalizations { 'Choose which extension provides the home feed on the main screen'; @override - String get extensionsHomeFeedAuto => 'Auto'; + String get extensionsHomeFeedAuto => 'Авто'; @override String get extensionsHomeFeedAutoSubtitle => @@ -3441,13 +3438,13 @@ class AppLocalizationsRu extends AppLocalizations { String get extensionsNoHomeFeedExtensions => 'No extensions with home feed'; @override - String get sortAlphaAsc => 'A-Z'; + String get sortAlphaAsc => 'А-Я'; @override - String get sortAlphaDesc => 'Z-A'; + String get sortAlphaDesc => 'Я-А'; @override - String get cancelDownloadTitle => 'Cancel download?'; + String get cancelDownloadTitle => 'Отменить скачивание?'; @override String cancelDownloadContent(String trackName) { @@ -3455,37 +3452,38 @@ class AppLocalizationsRu extends AppLocalizations { } @override - String get cancelDownloadKeep => 'Keep'; + String get cancelDownloadKeep => 'Удерживать'; @override - String get metadataSaveFailedFfmpeg => 'Failed to save metadata via FFmpeg'; + String get metadataSaveFailedFfmpeg => + 'Не удалось сохранить метаданные через FFmpeg'; @override String get metadataSaveFailedStorage => - 'Failed to write metadata back to storage'; + 'Не удалось записать метаданные обратно в хранилище'; @override String snackbarFolderPickerFailed(String error) { - return 'Failed to open folder picker: $error'; + return 'Не удалось открыть выбор папок: $error'; } @override - String get errorLoadAlbum => 'Failed to load album'; + String get errorLoadAlbum => 'Не удалось загрузить альбом'; @override - String get errorLoadPlaylist => 'Failed to load playlist'; + String get errorLoadPlaylist => 'Не удалось загрузить плейлист'; @override - String get errorLoadArtist => 'Failed to load artist'; + String get errorLoadArtist => 'Не удалось загрузить исполнителя'; @override - String get notifChannelDownloadName => 'Download Progress'; + String get notifChannelDownloadName => 'Прогресс скачивания'; @override String get notifChannelDownloadDesc => 'Shows download progress for tracks'; @override - String get notifChannelLibraryScanName => 'Library Scan'; + String get notifChannelLibraryScanName => 'Сканирование библиотеки'; @override String get notifChannelLibraryScanDesc => 'Shows local library scan progress'; @@ -3501,35 +3499,41 @@ class AppLocalizationsRu extends AppLocalizations { } @override - String get notifEmbeddingMetadata => 'Embedding metadata...'; + String get notifEmbeddingMetadata => 'Встраивание метаданных...'; @override String notifAlreadyInLibraryCount(int completed, int total) { - return 'Already in Library ($completed/$total)'; + return 'Уже в библиотеке ($completed/$total)'; } @override - String get notifAlreadyInLibrary => 'Already in Library'; + String get notifAlreadyInLibrary => 'Уже в библиотеке'; @override String notifDownloadCompleteCount(int completed, int total) { - return 'Download Complete ($completed/$total)'; + return 'Загрузка завершена ($completed/$total)'; } @override - String get notifDownloadComplete => 'Download Complete'; + String get notifDownloadComplete => 'Скачивание завершено'; @override String notifDownloadsFinished(int completed, int failed) { - return 'Downloads Finished ($completed done, $failed failed)'; + return 'Загрузка завершена ($completed завершено, $failed не удалось)'; } @override - String get notifAllDownloadsComplete => 'All Downloads Complete'; + String get notifAllDownloadsComplete => 'Все загрузки завершены'; @override String notifTracksDownloadedSuccess(int count) { - return '$count tracks downloaded successfully'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks downloaded successfully', + one: '1 track downloaded successfully', + ); + return '$_temp0'; } @override @@ -3564,7 +3568,7 @@ class AppLocalizationsRu extends AppLocalizations { } @override - String get notifScanningLibrary => 'Scanning local library'; + String get notifScanningLibrary => 'Сканирование локальной библиотеки'; @override String notifLibraryScanProgressWithTotal( @@ -3581,31 +3585,32 @@ class AppLocalizationsRu extends AppLocalizations { } @override - String get notifLibraryScanComplete => 'Library scan complete'; + String get notifLibraryScanComplete => 'Сканирование библиотеки завершено'; @override String notifLibraryScanCompleteBody(int count) { - return '$count tracks indexed'; + return '$count треков индексировано'; } @override String notifLibraryScanExcluded(int count) { - return '$count excluded'; + return '$count исключено'; } @override String notifLibraryScanErrors(int count) { - return '$count errors'; + return '$count ошибок'; } @override - String get notifLibraryScanFailed => 'Library scan failed'; + String get notifLibraryScanFailed => 'Ошибка сканирования библиотеки'; @override - String get notifLibraryScanCancelled => 'Library scan cancelled'; + String get notifLibraryScanCancelled => 'Сканирование библиотеки отменено'; @override - String get notifLibraryScanStopped => 'Scan stopped before completion.'; + String get notifLibraryScanStopped => + 'Сканирование остановлено перед завершением.'; @override String notifDownloadingUpdate(String version) { @@ -3614,11 +3619,11 @@ class AppLocalizationsRu extends AppLocalizations { @override String notifUpdateProgress(String received, String total, int percentage) { - return '$received / $total MB • $percentage%'; + return '$received / $total МБ • $percentage%'; } @override - String get notifUpdateReady => 'Update Ready'; + String get notifUpdateReady => 'Обновление готово'; @override String notifUpdateReadyBody(String version) { @@ -3626,11 +3631,11 @@ class AppLocalizationsRu extends AppLocalizations { } @override - String get notifUpdateFailed => 'Update Failed'; + String get notifUpdateFailed => 'Ошибка обновления'; @override String get notifUpdateFailedBody => - 'Could not download update. Try again later.'; + 'Не удалось скачать обновление. Попробуйте позже.'; @override String get searchTracks => 'Tracks'; @@ -3859,10 +3864,10 @@ class AppLocalizationsRu extends AppLocalizations { } @override - String get optionsDefaultSearchTabAlbums => 'Albums'; + String get optionsDefaultSearchTabAlbums => 'Альбомы'; @override - String get optionsDefaultSearchTabTracks => 'Tracks'; + String get optionsDefaultSearchTabTracks => 'Треки'; @override String get settingsFiles => 'Files & Folders'; diff --git a/lib/l10n/app_localizations_tr.dart b/lib/l10n/app_localizations_tr.dart index 6d5e985c..d5367ef4 100644 --- a/lib/l10n/app_localizations_tr.dart +++ b/lib/l10n/app_localizations_tr.dart @@ -31,10 +31,10 @@ class AppLocalizationsTr extends AppLocalizations { 'Desteklenen bir URL yapıştırın veya isme göre arayın'; @override - String get homeEmptyTitle => 'No search providers yet'; + String get homeEmptyTitle => 'Henüz arama sağlayıcısı yok'; @override - String get homeEmptySubtitle => 'Install an extension to continue.'; + String get homeEmptySubtitle => 'Devam etmek için bir eklenti yükleyin.'; @override String get homeSupports => @@ -129,7 +129,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String get optionsPrimaryProviderSubtitle => - 'Şarkı ismi aratılırken kullanılan kaynak.'; + 'Parça veya albüm adına göre arama yapmak için kullanılan hizmet'; @override String optionsUsingExtension(String extensionName) { @@ -137,11 +137,11 @@ class AppLocalizationsTr extends AppLocalizations { } @override - String get optionsDefaultSearchTab => 'Default Search Tab'; + String get optionsDefaultSearchTab => 'Varsayılan Arama Sekmesi'; @override String get optionsDefaultSearchTabSubtitle => - 'Choose which tab opens first for new search results.'; + 'Yeni arama sonuçları için hangi sekmenin önce açılacağını seçin.'; @override String get optionsSwitchBack => @@ -169,7 +169,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String get optionsEmbedLyricsSubtitle => - 'Senkronize şarkı sözlerini FLAC dosyalarına göm'; + 'İndirdiğiniz parçaların yanına senkronize edilmiş şarkı sözlerini kaydedin'; @override String get optionsMaxQualityCover => 'En Yüksek Kapak Kalitesi'; @@ -273,7 +273,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String optionsSpotifyCredentialsConfigured(String clientId) { - return 'Client ID: $clientId...'; + return 'Müşteri Kimliği: $clientId...'; } @override @@ -354,7 +354,7 @@ class AppLocalizationsTr extends AppLocalizations { String get aboutPCSource => 'PC kaynak kodu'; @override - String get aboutKeepAndroidOpen => 'Keep Android Open'; + String get aboutKeepAndroidOpen => 'Android\'i Açık Tutun'; @override String get aboutReportIssue => 'Sorun bildir'; @@ -405,7 +405,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String get aboutAppDescription => - 'Search music metadata, manage extensions, and organize your library.'; + 'Müzik meta verilerini arayın, uzantıları yönetin ve kütüphanenizi düzenleyin.'; @override String get artistAlbums => 'Albümler'; @@ -554,14 +554,14 @@ class AppLocalizationsTr extends AppLocalizations { 'Lütfen bir sonraki ekranda \"Bütün dosyalara eriş\" iznini sağlayın.'; @override - String get setupLanguageTitle => 'Choose Language'; + String get setupLanguageTitle => 'Dil Seçin'; @override String get setupLanguageDescription => - 'Select your preferred language for the app. You can change this later in Settings.'; + 'Uygulama için tercih ettiğiniz dili seçin. Bunu daha sonra Ayarlar\'dan değiştirebilirsiniz.'; @override - String get setupLanguageSystemDefault => 'System Default'; + String get setupLanguageSystemDefault => 'Sistem Varsayılanı'; @override String get dialogCancel => 'İptal'; @@ -954,7 +954,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String get providerPriorityFallbackExtensionsDescription => - 'Otomatik yedekleme sırasında hangi yüklü indirme uzantılarının kullanılabileceğini seçin. Yerleşik sağlayıcılar hâlâ yukarıdaki öncelik sırasını takip eder.'; + 'Otomatik geri dönüş sırasında hangi yüklü indirme uzantılarının kullanılabileceğini seçin.'; @override String get providerPriorityFallbackExtensionsHint => @@ -1039,13 +1039,13 @@ class AppLocalizationsTr extends AppLocalizations { 'Kendi Spotify uygulama kotanızı kullanmak için Client ID ve Secret girin.'; @override - String get credentialsClientId => 'Client ID'; + String get credentialsClientId => 'Müşteri Kimliği'; @override String get credentialsClientIdHint => 'Client ID yapıştır'; @override - String get credentialsClientSecret => 'Client Secret'; + String get credentialsClientSecret => 'Müşteri Sırrı'; @override String get credentialsClientSecretHint => 'Client Secret yapıştır'; @@ -1133,11 +1133,11 @@ class AppLocalizationsTr extends AppLocalizations { String get settingsAppearanceSubtitle => 'Tema, renkler, görünüm'; @override - String get settingsDownloadSubtitle => 'Servis, kalite, dosya adı formatı'; + String get settingsDownloadSubtitle => 'Hizmet, kalite, yedekleme'; @override String get settingsOptionsSubtitle => - 'Yedekleme, sözler, kapak resmi, güncellemeler'; + 'Yedek plan, meta veriler, şarkı sözleri, kapak resmi'; @override String get settingsExtensionsSubtitle => 'İndirme sağlayıcılarını yönet'; @@ -1239,7 +1239,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String trackLyricsSource(String source) { - return 'Source: $source'; + return 'Kaynak: $source'; } @override @@ -1370,7 +1370,7 @@ class AppLocalizationsTr extends AppLocalizations { String get extensionAuthor => 'Oluşturan'; @override - String get extensionId => 'ID'; + String get extensionId => 'Kimlik'; @override String get extensionError => 'Hata'; @@ -1457,12 +1457,12 @@ class AppLocalizationsTr extends AppLocalizations { @override String extensionsInstalledCount(int count) { - return '$count extensions installed successfully'; + return '$count uzantı başarıyla yüklendi'; } @override String extensionsInstallPartialSuccess(int installed, int attempted) { - return 'Installed $installed of $attempted extensions'; + return 'Yüklenen uzantı sayısı: $installed / $attempted'; } @override @@ -1553,7 +1553,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String get downloadLossyAacSubtitle => - 'Best mobile compatibility, M4A container'; + 'En iyi mobil uyumluluk, M4A konteyner'; @override String get downloadLossyOpus256 => 'Opus 256kbps'; @@ -1943,8 +1943,8 @@ class AppLocalizationsTr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'parçalar', + one: 'parça', ); return '$_temp0'; } @@ -1954,66 +1954,67 @@ class AppLocalizationsTr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'files', - one: 'file', + other: 'dosyalar', + one: 'dosya', ); return '$_temp0'; } @override String libraryLastScanned(String time) { - return 'Last scanned: $time'; + return 'Son tarama tarihi: $time'; } @override - String get libraryLastScannedNever => 'Never'; + String get libraryLastScannedNever => 'Asla'; @override String get libraryScanning => 'Scanning...'; @override - String get libraryScanFinalizing => 'Finalizing library...'; + String get libraryScanFinalizing => 'Kütüphane sonlandırılıyor...'; @override String libraryScanProgress(String progress, int total) { - return '$progress% of $total files'; + return '$total dosyanın $progress%\'si'; } @override - String get libraryInLibrary => 'In Library'; + String get libraryInLibrary => 'Kütüphanede'; @override String libraryRemovedMissingFiles(int count) { - return 'Removed $count missing files from library'; + return 'Kütüphaneden $count adet eksik dosya kaldırıldı'; } @override - String get libraryCleared => 'Library cleared'; + String get libraryCleared => 'Kütüphane temizlendi'; @override - String get libraryStorageAccessRequired => 'Storage Access Required'; + String get libraryStorageAccessRequired => + 'Depolama Alanına Erişim Gereklidir'; @override String get libraryStorageAccessMessage => - 'SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.'; + 'SpotiFLAC, müzik kitaplığınızı tarayabilmek için depolama alanına erişime ihtiyaç duyar. Lütfen ayarlar bölümünden izin verin.'; @override - String get libraryFolderNotExist => 'Selected folder does not exist'; + String get libraryFolderNotExist => 'Seçilen klasör mevcut değil'; @override String get librarySourceDownloaded => 'Downloaded'; @override - String get librarySourceLocal => 'Local'; + String get librarySourceLocal => 'Yerel'; @override String get libraryFilterAll => 'All'; @override - String get libraryFilterDownloaded => 'Downloaded'; + String get libraryFilterDownloaded => 'İndirildi'; @override - String get libraryFilterLocal => 'Local'; + String get libraryFilterLocal => 'Yerel'; @override String get libraryFilterTitle => 'Filtreler'; @@ -2037,52 +2038,52 @@ class AppLocalizationsTr extends AppLocalizations { String get libraryFilterQualityCD => 'CD (16bit)'; @override - String get libraryFilterQualityLossy => 'Lossy'; + String get libraryFilterQualityLossy => 'Kayıplı'; @override String get libraryFilterFormat => 'Format'; @override - String get libraryFilterMetadata => 'Metadata'; + String get libraryFilterMetadata => 'Meta veriler'; @override - String get libraryFilterMetadataComplete => 'Complete metadata'; + String get libraryFilterMetadataComplete => 'Tam meta veriler'; @override - String get libraryFilterMetadataMissingAny => 'Missing any metadata'; + String get libraryFilterMetadataMissingAny => 'Herhangi bir meta veri eksik'; @override - String get libraryFilterMetadataMissingYear => 'Missing year'; + String get libraryFilterMetadataMissingYear => 'Kayıp yıl'; @override - String get libraryFilterMetadataMissingGenre => 'Missing genre'; + String get libraryFilterMetadataMissingGenre => 'Eksik tür'; @override - String get libraryFilterMetadataMissingAlbumArtist => 'Missing album artist'; + String get libraryFilterMetadataMissingAlbumArtist => 'Kayıp albüm sanatçısı'; @override - String get libraryFilterSort => 'Sort'; + String get libraryFilterSort => 'Sırala'; @override - String get libraryFilterSortLatest => 'Latest'; + String get libraryFilterSortLatest => 'En sonuncu'; @override - String get libraryFilterSortOldest => 'Oldest'; + String get libraryFilterSortOldest => 'En eski'; @override - String get libraryFilterSortAlbumAsc => 'Album (A-Z)'; + String get libraryFilterSortAlbumAsc => 'Albüm (A-Z)'; @override - String get libraryFilterSortAlbumDesc => 'Album (Z-A)'; + String get libraryFilterSortAlbumDesc => 'Albüm (Z-A)'; @override - String get libraryFilterSortGenreAsc => 'Genre (A-Z)'; + String get libraryFilterSortGenreAsc => 'Tür (A-Z)'; @override - String get libraryFilterSortGenreDesc => 'Genre (Z-A)'; + String get libraryFilterSortGenreDesc => 'Tür (Z-A)'; @override - String get timeJustNow => 'Just now'; + String get timeJustNow => 'Şu anda'; @override String timeMinutesAgo(int count) { @@ -2107,7 +2108,7 @@ class AppLocalizationsTr extends AppLocalizations { } @override - String get tutorialWelcomeTitle => 'Welcome to SpotiFLAC!'; + String get tutorialWelcomeTitle => 'SpotiFLAC\'e hoş geldiniz!'; @override String get tutorialWelcomeDesc => @@ -2193,42 +2194,44 @@ class AppLocalizationsTr extends AppLocalizations { 'Varsayılan ses kalitesi ve format tercihlerini ayarlayın'; @override - String get tutorialSettingsTip3 => 'Customize app theme and appearance'; + String get tutorialSettingsTip3 => + 'Uygulama temasını ve görünümünü özelleştirin'; @override String get tutorialReadyMessage => - 'You\'re all set! Start downloading your favorite music now.'; + 'Her şey hazır! En sevdiğiniz müzikleri hemen indirmeye başlayın.'; @override - String get libraryForceFullScan => 'Force Full Scan'; + String get libraryForceFullScan => 'Tam Taramayı Zorla'; @override - String get libraryForceFullScanSubtitle => 'Rescan all files, ignoring cache'; + String get libraryForceFullScanSubtitle => + 'Önbelleği yok sayarak tüm dosyaları yeniden tarayın'; @override - String get cleanupOrphanedDownloads => 'Cleanup Orphaned Downloads'; + String get cleanupOrphanedDownloads => 'Yetim kalmış indirmeleri temizle'; @override String get cleanupOrphanedDownloadsSubtitle => - 'Remove history entries for files that no longer exist'; + 'Artık mevcut olmayan dosyalar için geçmiş kayıtlarını kaldırın'; @override String cleanupOrphanedDownloadsResult(int count) { - return 'Removed $count orphaned entries from history'; + return 'Geçmişten $count adet yetim kayıt kaldırıldı'; } @override - String get cleanupOrphanedDownloadsNone => 'No orphaned entries found'; + String get cleanupOrphanedDownloadsNone => 'Hiçbir yetim kayıt bulunamadı'; @override - String get cacheTitle => 'Storage & Cache'; + String get cacheTitle => 'Depolama & Önbellek'; @override - String get cacheSummaryTitle => 'Cache overview'; + String get cacheSummaryTitle => 'Önbellek genel bakışı'; @override String get cacheSummarySubtitle => - 'Clearing cache will not remove downloaded music files.'; + 'Önbelleği temizlemek, indirilen müzik dosyalarını silmeyecektir.'; @override String cacheEstimatedTotal(String size) { @@ -2236,48 +2239,48 @@ class AppLocalizationsTr extends AppLocalizations { } @override - String get cacheSectionStorage => 'Cached Data'; + String get cacheSectionStorage => 'Önbelleğe alınmış veriler'; @override - String get cacheSectionMaintenance => 'Maintenance'; + String get cacheSectionMaintenance => 'Bakım'; @override - String get cacheAppDirectory => 'App cache directory'; + String get cacheAppDirectory => 'Uygulama önbellek dizini'; @override String get cacheAppDirectoryDesc => - 'HTTP responses, WebView data, and other temporary app data.'; + 'HTTP yanıtları, WebView verileri ve diğer geçici uygulama verileri.'; @override - String get cacheTempDirectory => 'Temporary directory'; + String get cacheTempDirectory => 'Geçici dizin'; @override String get cacheTempDirectoryDesc => - 'Temporary files from downloads and audio conversion.'; + 'İndirmelerden ve ses dönüştürme işlemlerinden kaynaklanan geçici dosyalar.'; @override - String get cacheCoverImage => 'Cover image cache'; + String get cacheCoverImage => 'Kapak resmi önbelleği'; @override String get cacheCoverImageDesc => - 'Downloaded album and track cover art. Will re-download when viewed.'; + 'Albüm ve şarkı kapak resimleri indirildi. Görüntülendikten sonra tekrar indirilecektir.'; @override - String get cacheLibraryCover => 'Library cover cache'; + String get cacheLibraryCover => 'Kütüphane kapağı önbelleği'; @override String get cacheLibraryCoverDesc => - 'Cover art extracted from local music files. Will re-extract on next scan.'; + 'Kapak resmi yerel müzik dosyalarından çıkarıldı. Bir sonraki taramada yeniden çıkarılacaktır.'; @override - String get cacheExploreFeed => 'Explore feed cache'; + String get cacheExploreFeed => 'Besleme önbelleğini keşfedin'; @override String get cacheExploreFeedDesc => - 'Explore tab content (new releases, trending). Will refresh on next visit.'; + 'Sekme içeriğini keşfedin (yeni çıkanlar, trendler). Bir sonraki ziyaretinizde yenilenecektir.'; @override - String get cacheTrackLookup => 'Track lookup cache'; + String get cacheTrackLookup => 'İzleme arama önbelleği'; @override String get cacheTrackLookupDesc => @@ -2449,7 +2452,7 @@ class AppLocalizationsTr extends AppLocalizations { @override String get trackConvertFormatSubtitle => - 'Convert to MP3, Opus, ALAC, or FLAC'; + 'Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC'; @override String get trackConvertTitle => 'Convert Audio'; @@ -2461,7 +2464,7 @@ class AppLocalizationsTr extends AppLocalizations { String get trackConvertBitrate => 'Bitrate'; @override - String get trackConvertConfirmTitle => 'Confirm Conversion'; + String get trackConvertConfirmTitle => 'Dönüştürmeyi Onayla'; @override String trackConvertConfirmMessage( @@ -2469,7 +2472,7 @@ class AppLocalizationsTr extends AppLocalizations { String targetFormat, String bitrate, ) { - return 'Convert from $sourceFormat to $targetFormat at $bitrate?\n\nThe original file will be deleted after conversion.'; + return '$sourceFormat formatından $targetFormat formatına $bitrate hızında dönüştürülsün mü?\n\nDönüştürme işleminden sonra orijinal dosya silinecektir.'; } @override @@ -2477,29 +2480,29 @@ class AppLocalizationsTr extends AppLocalizations { String sourceFormat, String targetFormat, ) { - return 'Convert from $sourceFormat to $targetFormat? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.'; + return '$sourceFormat formatından $targetFormat formatına dönüştürmek ister misiniz? (Kayıpsız — kalite kaybı yok)\n\nDönüştürme işleminden sonra orijinal dosya silinecektir.'; } @override String get trackConvertLosslessHint => - 'Lossless conversion — no quality loss'; + 'Kayıpsız dönüştürme — kalite kaybı yok'; @override String get trackConvertConverting => 'Converting audio...'; @override String trackConvertSuccess(String format) { - return 'Converted to $format successfully'; + return '$format formatına başarıyla dönüştürüldü'; } @override - String get trackConvertFailed => 'Conversion failed'; + String get trackConvertFailed => 'Dönüştürme başarısız oldu'; @override - String get cueSplitTitle => 'Split CUE Sheet'; + String get cueSplitTitle => 'Bölünmüş CUE Sayfası'; @override - String get cueSplitSubtitle => 'Split CUE+FLAC into individual tracks'; + String get cueSplitSubtitle => 'CUE+FLAC dosyalarını ayrı parçalara bölün'; @override String cueSplitAlbum(String album) { @@ -2513,35 +2516,36 @@ class AppLocalizationsTr extends AppLocalizations { @override String cueSplitTrackCount(int count) { - return '$count tracks'; + return '$count parça'; } @override - String get cueSplitConfirmTitle => 'Split CUE Album'; + String get cueSplitConfirmTitle => 'Bölünmüş CUE Albümü'; @override String cueSplitConfirmMessage(String album, int count) { - return 'Split \"$album\" into $count individual FLAC files?\n\nFiles will be saved to the same directory.'; + return '\"$album\" albümünü $count adet ayrı FLAC dosyasına bölmek ister misiniz?\n\nDosyalar aynı dizine kaydedilecektir.'; } @override String cueSplitSplitting(int current, int total) { - return 'Splitting CUE sheet... ($current/$total)'; + return 'CUE sayfası bölünüyor... ($current/$total)'; } @override String cueSplitSuccess(int count) { - return 'Split into $count tracks successfully'; + return '$count parçaya başarıyla bölündü'; } @override - String get cueSplitFailed => 'CUE split failed'; + String get cueSplitFailed => 'CUE bölme işlemi başarısız oldu'; @override - String get cueSplitNoAudioFile => 'Audio file not found for this CUE sheet'; + String get cueSplitNoAudioFile => + 'Bu CUE sayfası için ses dosyası bulunamadı'; @override - String get cueSplitButton => 'Split into Tracks'; + String get cueSplitButton => 'Parçalara Ayrılmış'; @override String get actionCreate => 'Create'; @@ -2550,40 +2554,40 @@ class AppLocalizationsTr extends AppLocalizations { String get collectionFoldersTitle => 'My folders'; @override - String get collectionWishlist => 'Wishlist'; + String get collectionWishlist => 'İstek listesi'; @override - String get collectionLoved => 'Loved'; + String get collectionLoved => 'Sevilen'; @override - String get collectionFavoriteArtists => 'Favorite Artists'; + String get collectionFavoriteArtists => 'Favori Sanatçılar'; @override - String get collectionPlaylists => 'Playlists'; + String get collectionPlaylists => 'Çalma listeleri'; @override - String get collectionPlaylist => 'Playlist'; + String get collectionPlaylist => 'Çalma listesi'; @override String get collectionAddToPlaylist => 'Add to playlist'; @override - String get collectionCreatePlaylist => 'Create playlist'; + String get collectionCreatePlaylist => 'Çalma listesi oluştur'; @override - String get collectionNoPlaylistsYet => 'No playlists yet'; + String get collectionNoPlaylistsYet => 'Henüz çalma listesi yok'; @override String get collectionNoPlaylistsSubtitle => - 'Create a playlist to start categorizing tracks'; + 'Parçaları kategorize etmeye başlamak için bir çalma listesi oluşturun'; @override String collectionPlaylistTracks(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count tracks', - one: '1 track', + other: '$count parça', + one: '1 parça', ); return '$_temp0'; } @@ -2593,20 +2597,20 @@ class AppLocalizationsTr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count artists', - one: '1 artist', + other: '$count sanatçı', + one: '1 sanatçı', ); return '$_temp0'; } @override String collectionAddedToPlaylist(String playlistName) { - return 'Added to \"$playlistName\"'; + return '\"$playlistName\"e eklendi'; } @override String collectionAlreadyInPlaylist(String playlistName) { - return 'Already in \"$playlistName\"'; + return 'Zaten \"$playlistName\" içinde'; } @override @@ -2616,52 +2620,52 @@ class AppLocalizationsTr extends AppLocalizations { String get collectionPlaylistNameHint => 'Playlist name'; @override - String get collectionPlaylistNameRequired => 'Playlist name is required'; + String get collectionPlaylistNameRequired => 'Çalma listesi adı zorunludur'; @override - String get collectionRenamePlaylist => 'Rename playlist'; + String get collectionRenamePlaylist => 'Çalma listesini yeniden adlandır'; @override - String get collectionDeletePlaylist => 'Delete playlist'; + String get collectionDeletePlaylist => 'Çalma listesini sil'; @override String collectionDeletePlaylistMessage(String playlistName) { - return 'Delete \"$playlistName\" and all tracks inside it?'; + return '\"$playlistName\" ve içindeki tüm parçaları silmek mi istiyorsunuz?'; } @override String get collectionPlaylistDeleted => 'Playlist deleted'; @override - String get collectionPlaylistRenamed => 'Playlist renamed'; + String get collectionPlaylistRenamed => 'Çalma listesinin adı değiştirildi'; @override - String get collectionWishlistEmptyTitle => 'Wishlist is empty'; + String get collectionWishlistEmptyTitle => 'İstek listesi boş'; @override String get collectionWishlistEmptySubtitle => - 'Tap + on tracks to save what you want to download later'; + 'Daha sonra indirmek istediğiniz parçaları kaydetmek için parçaların üzerine + işaretiyle dokunun'; @override - String get collectionLovedEmptyTitle => 'Loved folder is empty'; + String get collectionLovedEmptyTitle => 'Sevilenler klasörü boş'; @override String get collectionLovedEmptySubtitle => - 'Tap love on tracks to keep your favorites'; + 'Favorilerinizi kaydetmek için parçalara beğeni bırakın'; @override - String get collectionFavoriteArtistsEmptyTitle => 'No favorite artists yet'; + String get collectionFavoriteArtistsEmptyTitle => 'Henüz favori sanatçım yok'; @override String get collectionFavoriteArtistsEmptySubtitle => - 'Tap the heart on an artist page to keep them here'; + 'Bir sanatçının sayfasındaki kalbe dokunarak onu burada tutmaya devam edin'; @override - String get collectionPlaylistEmptyTitle => 'Playlist is empty'; + String get collectionPlaylistEmptyTitle => 'Çalma listesi boş'; @override String get collectionPlaylistEmptySubtitle => - 'Long-press + on any track to add it here'; + 'Buraya eklemek istediğiniz herhangi bir parçaya uzun süre basılı tutun +'; @override String get collectionRemoveFromPlaylist => 'Remove from playlist'; @@ -2802,14 +2806,14 @@ class AppLocalizationsTr extends AppLocalizations { @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Artist folders use Album Artist when available'; + 'Folder named after Album Artist tag'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => - 'Artist folders use Track Artist only'; + 'Folder named after Track Artist tag'; @override - String get lyricsProvidersTitle => 'Lyrics Providers'; + String get lyricsProvidersTitle => 'Lyrics Provider Priority'; @override String get lyricsProvidersDescription => @@ -2877,25 +2881,25 @@ class AppLocalizationsTr extends AppLocalizations { String get safMigrationSuccess => 'Download folder updated to SAF mode'; @override - String get settingsDonate => 'Donate'; + String get settingsDonate => 'Support Development'; @override - String get settingsDonateSubtitle => 'Support SpotiFLAC-Mobile development'; + String get settingsDonateSubtitle => 'Buy the developer a coffee'; @override String get tooltipLoveAll => 'Love All'; @override - String get tooltipAddToPlaylist => 'Add to Playlist'; + String get tooltipAddToPlaylist => 'Çalma listesine ekle'; @override String snackbarRemovedTracksFromLoved(int count) { - return 'Removed $count tracks from Loved'; + return 'Sevilen albümünden $count parça kaldırıldı'; } @override String snackbarAddedTracksToLoved(int count) { - return 'Added $count tracks to Loved'; + return 'Sevilen\'e $count parça eklendi'; } @override @@ -2903,29 +2907,30 @@ class AppLocalizationsTr extends AppLocalizations { @override String dialogDownloadAllMessage(int count) { - return 'Download $count tracks?'; + return '$count parça indirilsin mi?'; } @override - String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; + String get homeSkipAlreadyDownloaded => 'Daha önce indirilmiş şarkıları atla'; @override String get homeGoToAlbum => 'Go to Album'; @override - String get homeAlbumInfoUnavailable => 'Album info not available'; + String get homeAlbumInfoUnavailable => 'Albüm bilgisi mevcut değil'; @override - String get snackbarLoadingCueSheet => 'Loading CUE sheet...'; + String get snackbarLoadingCueSheet => 'CUE sayfası yükleniyor...'; @override - String get snackbarMetadataSaved => 'Metadata saved successfully'; + String get snackbarMetadataSaved => 'Meta veriler başarıyla kaydedildi'; @override - String get snackbarFailedToEmbedLyrics => 'Failed to embed lyrics'; + String get snackbarFailedToEmbedLyrics => 'Şarkı sözleri eklenemedi'; @override - String get snackbarFailedToWriteStorage => 'Failed to write back to storage'; + String get snackbarFailedToWriteStorage => + 'Depolama alanına geri yazma işlemi başarısız oldu'; @override String snackbarError(String error) { @@ -2933,27 +2938,29 @@ class AppLocalizationsTr extends AppLocalizations { } @override - String get snackbarNoActionDefined => 'No action defined for this button'; + String get snackbarNoActionDefined => + 'Bu düğme için tanımlanmış bir işlem yok'; @override - String get noTracksFoundForAlbum => 'No tracks found for this album'; + String get noTracksFoundForAlbum => 'Bu albüm için hiçbir parça bulunamadı'; @override String get downloadLocationSubtitle => - 'Choose storage mode for downloaded files.'; + 'İndirdiğiniz parçaları nereye kaydedeceğinizi seçin'; @override - String get storageModeAppFolder => 'App folder (non-SAF)'; + String get storageModeAppFolder => 'Uygulama Klasörü (Önerilir)'; @override - String get storageModeAppFolderSubtitle => 'Use default Music/SpotiFLAC path'; + String get storageModeAppFolderSubtitle => + 'Varsayılan olarak Müzik/SpotiFLAC klasörüne kaydeder'; @override - String get storageModeSaf => 'SAF folder'; + String get storageModeSaf => 'Özel Klasör (SAF)'; @override String get storageModeSafSubtitle => - 'Pick folder via Android Storage Access Framework'; + 'SD kart dahil herhangi bir klasörü seçin'; @override String downloadFilenameDescription( @@ -2965,62 +2972,62 @@ class AppLocalizationsTr extends AppLocalizations { Object track, Object year, ) { - return 'Customize how your files are named.'; + return 'Yer tutucu olarak $artist, $title, $album, $track, $year, $date, $disc ifadelerini kullanın.'; } @override - String get downloadFilenameInsertTag => 'Tap to insert tag:'; + String get downloadFilenameInsertTag => 'Etiket eklemek için dokunun:'; @override - String get downloadSeparateSinglesEnabled => 'Albums/ and Singles/ folders'; + String get downloadSeparateSinglesEnabled => + 'Single şarkılar ve EP\'ler ayrı bir klasöre kaydedildi'; @override - String get downloadSeparateSinglesDisabled => 'All files in same structure'; + String get downloadSeparateSinglesDisabled => + 'Singles and albums saved in the same folder'; @override String get downloadArtistNameFilters => 'Artist Name Filters'; @override - String get downloadCreatePlaylistSourceFolder => - 'Create playlist source folder'; + String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder'; @override String get downloadCreatePlaylistSourceFolderEnabled => - 'Playlist downloads use Playlist/ plus your normal folder structure.'; + 'A subfolder is created for each playlist'; @override String get downloadCreatePlaylistSourceFolderDisabled => - 'Playlist downloads use the normal folder structure only.'; + 'All tracks saved directly to download folder'; @override String get downloadCreatePlaylistSourceFolderRedundant => - 'By Playlist already places downloads inside a playlist folder.'; + 'Handled by folder organization setting'; @override String get downloadSongLinkRegion => 'SongLink Region'; @override - String get downloadNetworkCompatibilityMode => 'Network compatibility mode'; + String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode'; @override String get downloadNetworkCompatibilityModeEnabled => - 'Enabled: try HTTP + accept invalid TLS certificates (unsafe)'; + 'Using legacy TLS settings for older networks'; @override String get downloadNetworkCompatibilityModeDisabled => - 'Off: strict HTTPS certificate validation (recommended)'; + 'Using standard network settings'; @override String get downloadSelectServiceToEnable => - 'Select a built-in service to enable'; + 'Select Tidal or Qobuz to enable this option'; @override String get downloadSelectTidalQobuz => - 'Select Tidal or Qobuz above to configure quality'; + 'Select Tidal or Qobuz to choose audio quality'; @override - String get downloadEmbedLyricsDisabled => - 'Disabled while Embed Metadata is turned off'; + String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first'; @override String get downloadNeteaseIncludeTranslation => @@ -3028,11 +3035,11 @@ class AppLocalizationsTr extends AppLocalizations { @override String get downloadNeteaseIncludeTranslationEnabled => - 'Append translated lyrics when available'; + 'Chinese translation lines included'; @override String get downloadNeteaseIncludeTranslationDisabled => - 'Use original lyrics only'; + 'Original lyrics only'; @override String get downloadNeteaseIncludeRomanization => @@ -3040,21 +3047,21 @@ class AppLocalizationsTr extends AppLocalizations { @override String get downloadNeteaseIncludeRomanizationEnabled => - 'Append romanized lyrics when available'; + 'Romanization lines included'; @override - String get downloadNeteaseIncludeRomanizationDisabled => 'Disabled'; + String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization'; @override - String get downloadAppleQqMultiPerson => 'Apple/QQ Multi-Person Word-by-Word'; + String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics'; @override String get downloadAppleQqMultiPersonEnabled => - 'Enable v1/v2 speaker and [bg:] tags'; + 'Speaker labels included for duets and group tracks'; @override String get downloadAppleQqMultiPersonDisabled => - 'Simplified word-by-word formatting'; + 'Standard lyrics without speaker labels'; @override String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; @@ -3071,46 +3078,45 @@ class AppLocalizationsTr extends AppLocalizations { String get downloadMusixmatchLanguage => 'Musixmatch Language'; @override - String get downloadMusixmatchLanguageAuto => 'Auto (original)'; + String get downloadMusixmatchLanguageAuto => 'Auto (original language)'; @override - String get downloadFilterContributing => - 'Filter contributing artists in Album Artist'; + String get downloadFilterContributing => 'Filter Contributing Artists'; @override String get downloadFilterContributingEnabled => - 'Album Artist metadata uses primary artist only'; + 'Contributing artists removed from Album Artist folder name'; @override String get downloadFilterContributingDisabled => - 'Keep full Album Artist metadata value'; + 'Full Album Artist string used'; @override - String get downloadProvidersNoneEnabled => 'None enabled'; + String get downloadProvidersNoneEnabled => 'No providers enabled'; @override String get downloadMusixmatchLanguageCode => 'Language code'; @override - String get downloadMusixmatchLanguageHint => 'auto / en / es / ja'; + String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja'; @override String get downloadMusixmatchLanguageDesc => - 'Set preferred language code (example: en, es, ja). Leave empty for auto.'; + 'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.'; @override String get downloadMusixmatchAuto => 'Auto'; @override - String get downloadNetworkAnySubtitle => 'WiFi + Mobile Data'; + String get downloadNetworkAnySubtitle => 'Use WiFi or mobile data'; @override String get downloadNetworkWifiOnlySubtitle => - 'Pause downloads on mobile data'; + 'Downloads pause when on mobile data'; @override String get downloadSongLinkRegionDesc => - 'Used as userCountry for SongLink API lookup.'; + 'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.'; @override String get snackbarUnsupportedAudioFormat => 'Unsupported audio format'; @@ -3496,7 +3502,13 @@ class AppLocalizationsTr extends AppLocalizations { @override String notifTracksDownloadedSuccess(int count) { - return '$count tracks downloaded successfully'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks downloaded successfully', + one: '1 track downloaded successfully', + ); + return '$_temp0'; } @override diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index d954d087..90f5d4f6 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -129,7 +129,7 @@ class AppLocalizationsUk extends AppLocalizations { @override String get optionsPrimaryProviderSubtitle => - 'Розширення будуть випробувані першими'; + 'Service used for searching by track or album name'; @override String optionsUsingExtension(String extensionName) { @@ -137,11 +137,11 @@ class AppLocalizationsUk extends AppLocalizations { } @override - String get optionsDefaultSearchTab => 'Default Search Tab'; + String get optionsDefaultSearchTab => 'Вкладка пошуку за замовчуванням'; @override String get optionsDefaultSearchTabSubtitle => - 'Choose which tab opens first for new search results.'; + 'Виберіть, яка вкладка відкриється першою для нових результатів пошуку.'; @override String get optionsSwitchBack => @@ -171,7 +171,7 @@ class AppLocalizationsUk extends AppLocalizations { @override String get optionsEmbedLyricsSubtitle => - 'Вбудовувати синхронізовані тексти пісень у файли FLAC'; + 'Save synced lyrics alongside your downloaded tracks'; @override String get optionsMaxQualityCover => 'Максимальна якість обкладинки'; @@ -959,7 +959,7 @@ class AppLocalizationsUk extends AppLocalizations { @override String get providerPriorityFallbackExtensionsDescription => - 'Виберіть, які встановлені розширення завантаження можна використовувати під час автоматичного відновлення до попереднього режиму. Вбудовані постачальники все одно дотримуються порядку пріоритетності, зазначеного вище.'; + 'Choose which installed download extensions can be used during automatic fallback.'; @override String get providerPriorityFallbackExtensionsHint => @@ -1137,11 +1137,10 @@ class AppLocalizationsUk extends AppLocalizations { String get settingsAppearanceSubtitle => 'Тема, кольори, дисплей'; @override - String get settingsDownloadSubtitle => 'Сервіс, якість, формат назви файлу'; + String get settingsDownloadSubtitle => 'Service, quality, fallback'; @override - String get settingsOptionsSubtitle => - 'Резервний варіант, тексти пісень, обкладинка, оновлення'; + String get settingsOptionsSubtitle => 'Fallback, metadata, lyrics, cover art'; @override String get settingsExtensionsSubtitle => @@ -2464,7 +2463,7 @@ class AppLocalizationsUk extends AppLocalizations { @override String get trackConvertFormatSubtitle => - 'Конвертувати в MP3, Opus, ALAC або FLAC'; + 'Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC'; @override String get trackConvertTitle => 'Конвертувати аудіо'; @@ -2821,14 +2820,14 @@ class AppLocalizationsUk extends AppLocalizations { @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Папки виконавців використовують \"Виконавець альбому\", коли це можливо'; + 'Folder named after Album Artist tag'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => - 'Папки виконавців використовують лише виконавця доріжки'; + 'Folder named after Track Artist tag'; @override - String get lyricsProvidersTitle => 'Постачальники текстів пісень'; + String get lyricsProvidersTitle => 'Lyrics Provider Priority'; @override String get lyricsProvidersDescription => @@ -2898,11 +2897,10 @@ class AppLocalizationsUk extends AppLocalizations { String get safMigrationSuccess => 'Папку завантажень оновлено до режиму SAF'; @override - String get settingsDonate => 'Пожертвувати кошти'; + String get settingsDonate => 'Support Development'; @override - String get settingsDonateSubtitle => - 'Підтримка розробки SpotiFLAC для мобільних пристроїв'; + String get settingsDonateSubtitle => 'Buy the developer a coffee'; @override String get tooltipLoveAll => 'Уподобати всіх'; @@ -2965,21 +2963,20 @@ class AppLocalizationsUk extends AppLocalizations { @override String get downloadLocationSubtitle => - 'Виберіть режим зберігання для завантажених файлів.'; + 'Choose where to save your downloaded tracks'; @override - String get storageModeAppFolder => 'Папка додатку (не SAF)'; + String get storageModeAppFolder => 'App Folder (Recommended)'; @override String get storageModeAppFolderSubtitle => - 'Використовувати шлях Music/SpotiFLAC за замовчуванням'; + 'Saves to Music/SpotiFLAC by default'; @override - String get storageModeSaf => 'Папка SAF'; + String get storageModeSaf => 'Custom Folder (SAF)'; @override - String get storageModeSafSubtitle => - 'Вибрати папку через Android Storage Access Framework'; + String get storageModeSafSubtitle => 'Pick any folder, including SD card'; @override String downloadFilenameDescription( @@ -2991,73 +2988,73 @@ class AppLocalizationsUk extends AppLocalizations { Object track, Object year, ) { - return 'Налаштувати спосіб іменування ваших файлів.'; + return 'Use $artist, $title, $album, $track, $year, $date, $disc as placeholders.'; } @override String get downloadFilenameInsertTag => 'Натисніть, щоб вставити тег:'; @override - String get downloadSeparateSinglesEnabled => 'Папки «Альбоми» та «Сингли»'; + String get downloadSeparateSinglesEnabled => + 'Singles and EPs saved in a separate folder'; @override - String get downloadSeparateSinglesDisabled => 'Всі файли в одній структурі'; + String get downloadSeparateSinglesDisabled => + 'Singles and albums saved in the same folder'; @override String get downloadArtistNameFilters => 'Фільтри імені виконавця'; @override - String get downloadCreatePlaylistSourceFolder => - 'Створити папку джерела списку відтворення'; + String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder'; @override String get downloadCreatePlaylistSourceFolderEnabled => - 'Завантаження списків відтворення використовує Playlist/ плюс вашу звичайну структуру папок.'; + 'A subfolder is created for each playlist'; @override String get downloadCreatePlaylistSourceFolderDisabled => - 'Завантаження списків відтворення використовують лише звичайну структуру папок.'; + 'All tracks saved directly to download folder'; @override String get downloadCreatePlaylistSourceFolderRedundant => - 'За допомогою списку відтворення завантаження вже розміщуються в папці зі списком відтворення.'; + 'Handled by folder organization setting'; @override String get downloadSongLinkRegion => 'Регіон SongLink'; @override - String get downloadNetworkCompatibilityMode => 'Режим сумісності з мережею'; + String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode'; @override String get downloadNetworkCompatibilityModeEnabled => - 'Увімкнено: спробувати HTTP + прийняти недійсні сертифікати TLS (небезпечно)'; + 'Using legacy TLS settings for older networks'; @override String get downloadNetworkCompatibilityModeDisabled => - 'Вимкнено: сувора перевірка сертифіката HTTPS (рекомендовано)'; + 'Using standard network settings'; @override String get downloadSelectServiceToEnable => - 'Виберіть вбудовану службу, яку потрібно ввімкнути'; + 'Select Tidal or Qobuz to enable this option'; @override String get downloadSelectTidalQobuz => - 'Виберіть Tidal або Qobuz вище, щоб налаштувати якість'; + 'Select Tidal or Qobuz to choose audio quality'; @override - String get downloadEmbedLyricsDisabled => - 'Вимкнено, якщо вимкнено функцію «Вбудувати метадані»'; + String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first'; @override String get downloadNeteaseIncludeTranslation => 'Netease: Включити переклад'; @override String get downloadNeteaseIncludeTranslationEnabled => - 'Додати перекладені тексти пісень, коли вони доступні'; + 'Chinese translation lines included'; @override String get downloadNeteaseIncludeTranslationDisabled => - 'Використовувати лише оригінальні тексти пісень'; + 'Original lyrics only'; @override String get downloadNeteaseIncludeRomanization => @@ -3065,22 +3062,21 @@ class AppLocalizationsUk extends AppLocalizations { @override String get downloadNeteaseIncludeRomanizationEnabled => - 'Додати романізовані тексти пісень, коли це можливо'; + 'Romanization lines included'; @override - String get downloadNeteaseIncludeRomanizationDisabled => 'Вимкнути'; + String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization'; @override - String get downloadAppleQqMultiPerson => - 'Apple/QQ Багатокористувацький переклад слово за словом'; + String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics'; @override String get downloadAppleQqMultiPersonEnabled => - 'Увімкнути теги динаміка v1/v2 та [bg:]'; + 'Speaker labels included for duets and group tracks'; @override String get downloadAppleQqMultiPersonDisabled => - 'Спрощене послівне форматування'; + 'Standard lyrics without speaker labels'; @override String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; @@ -3097,46 +3093,45 @@ class AppLocalizationsUk extends AppLocalizations { String get downloadMusixmatchLanguage => 'Мова Musixmatch'; @override - String get downloadMusixmatchLanguageAuto => 'Авто (оригінал)'; + String get downloadMusixmatchLanguageAuto => 'Auto (original language)'; @override - String get downloadFilterContributing => - 'Фільтрувати виконавців-учасників у розділі «Виконавець альбому»'; + String get downloadFilterContributing => 'Filter Contributing Artists'; @override String get downloadFilterContributingEnabled => - 'Метадані виконавця альбому використовують лише основного виконавця'; + 'Contributing artists removed from Album Artist folder name'; @override String get downloadFilterContributingDisabled => - 'Зберегти повне значення метаданих виконавця альбому'; + 'Full Album Artist string used'; @override - String get downloadProvidersNoneEnabled => 'Не ввімкнено'; + String get downloadProvidersNoneEnabled => 'No providers enabled'; @override String get downloadMusixmatchLanguageCode => 'Код мови'; @override - String get downloadMusixmatchLanguageHint => 'авто / en / es / ja'; + String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja'; @override String get downloadMusixmatchLanguageDesc => - 'Встановити потрібний код мови (наприклад: en, es, ja). Залиште поле порожнім для автоматичного вибору.'; + 'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.'; @override String get downloadMusixmatchAuto => 'Авто'; @override - String get downloadNetworkAnySubtitle => 'Wi-Fi + мобільний інтернет'; + String get downloadNetworkAnySubtitle => 'Use WiFi or mobile data'; @override String get downloadNetworkWifiOnlySubtitle => - 'Призупинити завантаження через мобільний інтернет'; + 'Downloads pause when on mobile data'; @override String get downloadSongLinkRegionDesc => - 'Використовувати як userCountry для пошуку SongLink API.'; + 'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.'; @override String get snackbarUnsupportedAudioFormat => 'Непідтримуваний аудіоформат'; @@ -3529,7 +3524,13 @@ class AppLocalizationsUk extends AppLocalizations { @override String notifTracksDownloadedSuccess(int count) { - return '$count треки успішно завантажено'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks downloaded successfully', + one: '1 track downloaded successfully', + ); + return '$_temp0'; } @override @@ -3609,7 +3610,7 @@ class AppLocalizationsUk extends AppLocalizations { @override String notifDownloadingUpdate(String version) { - return 'Завантаження SpotiFLAC Mobile v$version'; + return 'Downloading SpotiFLAC Mobile v$version'; } @override @@ -3622,7 +3623,7 @@ class AppLocalizationsUk extends AppLocalizations { @override String notifUpdateReadyBody(String version) { - return 'SpotiFLAC Mobile v$version завантажений. Натисніть щоб установити.'; + return 'SpotiFLAC Mobile v$version downloaded. Tap to install.'; } @override diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index 0c1ca11d..e359fa71 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -4258,13 +4258,19 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { String get navSettings => '设置'; @override - String get navStore => 'Repo'; + String get navStore => '仓库'; @override String get homeTitle => '主页'; @override - String get homeSubtitle => 'Paste a supported URL or search by name'; + String get homeSubtitle => '粘贴支持的 URL 或按名称搜索'; + + @override + String get homeEmptyTitle => '暂无搜索提供商'; + + @override + String get homeEmptySubtitle => '安装一个拓展以继续。'; @override String get homeSupports => '支持:歌曲、专辑、播放列表、艺人网址'; @@ -4312,11 +4318,11 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { String get downloadFilenameFormat => '文件名格式'; @override - String get downloadSingleFilenameFormat => 'Single Filename Format'; + String get downloadSingleFilenameFormat => '单曲文件名格式'; @override String get downloadSingleFilenameFormatDescription => - 'Filename pattern for singles and EPs. Uses the same tags as the album format.'; + '单曲和EP的文件名格式。使用与专辑格式相同的标签。'; @override String get downloadFolderOrganization => '文件夹结构'; @@ -4355,7 +4361,7 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { String get optionsPrimaryProvider => '主要提供者'; @override - String get optionsPrimaryProviderSubtitle => '按歌曲名称搜索时使用的服务。'; + String get optionsPrimaryProviderSubtitle => '用于按曲目或专辑名称搜索的服务'; @override String optionsUsingExtension(String extensionName) { @@ -4363,11 +4369,10 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { } @override - String get optionsDefaultSearchTab => 'Default Search Tab'; + String get optionsDefaultSearchTab => '默认搜索栏'; @override - String get optionsDefaultSearchTabSubtitle => - 'Choose which tab opens first for new search results.'; + String get optionsDefaultSearchTabSubtitle => '选择新搜索结果首先打开的标签页。'; @override String get optionsSwitchBack => '点击 Deezer 或 Spotify 即可从扩展程序切换回来'; @@ -4391,7 +4396,7 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { String get optionsEmbedLyrics => '内嵌歌词'; @override - String get optionsEmbedLyricsSubtitle => '嵌入已同步歌词到 FLAC 文件'; + String get optionsEmbedLyricsSubtitle => '将同步的歌词与你下载的音轨一起保存'; @override String get optionsMaxQualityCover => '最高质量封面'; @@ -4403,15 +4408,13 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { String get optionsReplayGain => 'ReplayGain'; @override - String get optionsReplayGainSubtitleOn => - 'Scan loudness and embed ReplayGain tags (EBU R128)'; + String get optionsReplayGainSubtitleOn => '扫描响度并嵌入 ReplayGain 标签(EBU R128)'; @override - String get optionsReplayGainSubtitleOff => - 'Disabled: no loudness normalization tags'; + String get optionsReplayGainSubtitleOff => '已禁用:不添加响度标准化标签'; @override - String get optionsArtistTagMode => 'Artist Tag Mode'; + String get optionsArtistTagMode => '艺术家标签模式'; @override String get optionsArtistTagModeDescription => @@ -4764,6 +4767,16 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { String get setupAllowAccessToManageFiles => 'Please enable \"Allow access to manage all files\" in the next screen.'; + @override + String get setupLanguageTitle => 'Choose Language'; + + @override + String get setupLanguageDescription => + 'Select your preferred language for the app. You can change this later in Settings.'; + + @override + String get setupLanguageSystemDefault => 'System Default'; + @override String get dialogCancel => 'Cancel'; @@ -4950,6 +4963,9 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get errorNoTracksFound => '未找到曲目'; + @override + String get searchEmptyResultSubtitle => 'Try another keyword'; + @override String get errorUrlNotRecognized => 'Link not recognized'; @@ -5326,10 +5342,10 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { String get settingsAppearanceSubtitle => 'Theme, colors, display'; @override - String get settingsDownloadSubtitle => 'Service, quality, filename format'; + String get settingsDownloadSubtitle => 'Service, quality, fallback'; @override - String get settingsOptionsSubtitle => 'Fallback, lyrics, cover art, updates'; + String get settingsOptionsSubtitle => 'Fallback, metadata, lyrics, cover art'; @override String get settingsExtensionsSubtitle => 'Manage download providers'; @@ -5428,6 +5444,11 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get trackCopyLyrics => 'Copy lyrics'; + @override + String trackLyricsSource(String source) { + return 'Source: $source'; + } + @override String get trackLyricsNotAvailable => 'Lyrics not available for this track'; @@ -5640,6 +5661,16 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get extensionsInstalledSuccess => 'Extension installed successfully'; + @override + String extensionsInstalledCount(int count) { + return '$count extensions installed successfully'; + } + + @override + String extensionsInstallPartialSuccess(int installed, int attempted) { + return 'Installed $installed of $attempted extensions'; + } + @override String get extensionsDownloadPriority => 'Download Priority'; @@ -5721,6 +5752,13 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get downloadLossyMp3Subtitle => 'Best compatibility, ~10MB per track'; + @override + String get downloadLossyAac => 'AAC/M4A 320kbps'; + + @override + String get downloadLossyAacSubtitle => + 'Best mobile compatibility, M4A container'; + @override String get downloadLossyOpus256 => 'Opus 256kbps'; @@ -6606,7 +6644,7 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get trackConvertFormatSubtitle => - 'Convert to MP3, Opus, ALAC, or FLAC'; + 'Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC'; @override String get trackConvertTitle => 'Convert Audio'; @@ -6712,6 +6750,9 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get collectionLoved => 'Loved'; + @override + String get collectionFavoriteArtists => 'Favorite Artists'; + @override String get collectionPlaylists => 'Playlists'; @@ -6742,6 +6783,17 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { return '$_temp0'; } + @override + String collectionArtistCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count artists', + one: '1 artist', + ); + return '$_temp0'; + } + @override String collectionAddedToPlaylist(String playlistName) { return 'Added to \"$playlistName\"'; @@ -6792,6 +6844,13 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { String get collectionLovedEmptySubtitle => 'Tap love on tracks to keep your favorites'; + @override + String get collectionFavoriteArtistsEmptyTitle => 'No favorite artists yet'; + + @override + String get collectionFavoriteArtistsEmptySubtitle => + 'Tap the heart on an artist page to keep them here'; + @override String get collectionPlaylistEmptyTitle => 'Playlist is empty'; @@ -6830,6 +6889,16 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { return '\"$trackName\" removed from Wishlist'; } + @override + String collectionAddedToFavoriteArtists(String artistName) { + return '\"$artistName\" added to Favorite Artists'; + } + + @override + String collectionRemovedFromFavoriteArtists(String artistName) { + return '\"$artistName\" removed from Favorite Artists'; + } + @override String get trackOptionAddToLoved => 'Add to Loved'; @@ -6842,6 +6911,12 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get trackOptionRemoveFromWishlist => 'Remove from Wishlist'; + @override + String get artistOptionAddToFavorites => 'Add to Favorite Artists'; + + @override + String get artistOptionRemoveFromFavorites => 'Remove from Favorite Artists'; + @override String get collectionPlaylistChangeCover => 'Change cover image'; @@ -6922,14 +6997,14 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Artist folders use Album Artist when available'; + 'Folder named after Album Artist tag'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => - 'Artist folders use Track Artist only'; + 'Folder named after Track Artist tag'; @override - String get lyricsProvidersTitle => 'Lyrics Providers'; + String get lyricsProvidersTitle => 'Lyrics Provider Priority'; @override String get lyricsProvidersDescription => @@ -6997,10 +7072,10 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { String get safMigrationSuccess => 'Download folder updated to SAF mode'; @override - String get settingsDonate => 'Donate'; + String get settingsDonate => 'Support Development'; @override - String get settingsDonateSubtitle => 'Support SpotiFLAC-Mobile development'; + String get settingsDonateSubtitle => 'Buy the developer a coffee'; @override String get tooltipLoveAll => 'Love All'; @@ -7060,20 +7135,20 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get downloadLocationSubtitle => - 'Choose storage mode for downloaded files.'; + 'Choose where to save your downloaded tracks'; @override - String get storageModeAppFolder => 'App folder (non-SAF)'; + String get storageModeAppFolder => 'App Folder (Recommended)'; @override - String get storageModeAppFolderSubtitle => 'Use default Music/SpotiFLAC path'; + String get storageModeAppFolderSubtitle => + 'Saves to Music/SpotiFLAC by default'; @override - String get storageModeSaf => 'SAF folder'; + String get storageModeSaf => 'Custom Folder (SAF)'; @override - String get storageModeSafSubtitle => - 'Pick folder via Android Storage Access Framework'; + String get storageModeSafSubtitle => 'Pick any folder, including SD card'; @override String downloadFilenameDescription( @@ -7085,62 +7160,62 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { Object track, Object year, ) { - return 'Customize how your files are named.'; + return 'Use $artist, $title, $album, $track, $year, $date, $disc as placeholders.'; } @override String get downloadFilenameInsertTag => 'Tap to insert tag:'; @override - String get downloadSeparateSinglesEnabled => 'Albums/ and Singles/ folders'; + String get downloadSeparateSinglesEnabled => + 'Singles and EPs saved in a separate folder'; @override - String get downloadSeparateSinglesDisabled => 'All files in same structure'; + String get downloadSeparateSinglesDisabled => + 'Singles and albums saved in the same folder'; @override String get downloadArtistNameFilters => 'Artist Name Filters'; @override - String get downloadCreatePlaylistSourceFolder => - 'Create playlist source folder'; + String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder'; @override String get downloadCreatePlaylistSourceFolderEnabled => - 'Playlist downloads use Playlist/ plus your normal folder structure.'; + 'A subfolder is created for each playlist'; @override String get downloadCreatePlaylistSourceFolderDisabled => - 'Playlist downloads use the normal folder structure only.'; + 'All tracks saved directly to download folder'; @override String get downloadCreatePlaylistSourceFolderRedundant => - 'By Playlist already places downloads inside a playlist folder.'; + 'Handled by folder organization setting'; @override String get downloadSongLinkRegion => 'SongLink Region'; @override - String get downloadNetworkCompatibilityMode => 'Network compatibility mode'; + String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode'; @override String get downloadNetworkCompatibilityModeEnabled => - 'Enabled: try HTTP + accept invalid TLS certificates (unsafe)'; + 'Using legacy TLS settings for older networks'; @override String get downloadNetworkCompatibilityModeDisabled => - 'Off: strict HTTPS certificate validation (recommended)'; + 'Using standard network settings'; @override String get downloadSelectServiceToEnable => - 'Select a built-in service to enable'; + 'Select Tidal or Qobuz to enable this option'; @override String get downloadSelectTidalQobuz => - 'Select Tidal or Qobuz above to configure quality'; + 'Select Tidal or Qobuz to choose audio quality'; @override - String get downloadEmbedLyricsDisabled => - 'Disabled while Embed Metadata is turned off'; + String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first'; @override String get downloadNeteaseIncludeTranslation => @@ -7148,11 +7223,11 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get downloadNeteaseIncludeTranslationEnabled => - 'Append translated lyrics when available'; + 'Chinese translation lines included'; @override String get downloadNeteaseIncludeTranslationDisabled => - 'Use original lyrics only'; + 'Original lyrics only'; @override String get downloadNeteaseIncludeRomanization => @@ -7160,66 +7235,76 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get downloadNeteaseIncludeRomanizationEnabled => - 'Append romanized lyrics when available'; + 'Romanization lines included'; @override - String get downloadNeteaseIncludeRomanizationDisabled => 'Disabled'; + String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization'; @override - String get downloadAppleQqMultiPerson => 'Apple/QQ Multi-Person Word-by-Word'; + String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics'; @override String get downloadAppleQqMultiPersonEnabled => - 'Enable v1/v2 speaker and [bg:] tags'; + 'Speaker labels included for duets and group tracks'; @override String get downloadAppleQqMultiPersonDisabled => - 'Simplified word-by-word formatting'; + 'Standard lyrics without speaker labels'; + + @override + String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; + + @override + String get downloadAppleElrcWordSyncEnabled => + 'Raw word-by-word timestamps preserved'; + + @override + String get downloadAppleElrcWordSyncDisabled => + 'Safer line-by-line Apple Music lyrics'; @override String get downloadMusixmatchLanguage => 'Musixmatch Language'; @override - String get downloadMusixmatchLanguageAuto => 'Auto (original)'; + String get downloadMusixmatchLanguageAuto => 'Auto (original language)'; @override - String get downloadFilterContributing => - 'Filter contributing artists in Album Artist'; + String get downloadFilterContributing => 'Filter Contributing Artists'; @override String get downloadFilterContributingEnabled => - 'Album Artist metadata uses primary artist only'; + 'Contributing artists removed from Album Artist folder name'; @override String get downloadFilterContributingDisabled => - 'Keep full Album Artist metadata value'; + 'Full Album Artist string used'; @override - String get downloadProvidersNoneEnabled => 'None enabled'; + String get downloadProvidersNoneEnabled => 'No providers enabled'; @override String get downloadMusixmatchLanguageCode => 'Language code'; @override - String get downloadMusixmatchLanguageHint => 'auto / en / es / ja'; + String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja'; @override String get downloadMusixmatchLanguageDesc => - 'Set preferred language code (example: en, es, ja). Leave empty for auto.'; + 'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.'; @override String get downloadMusixmatchAuto => 'Auto'; @override - String get downloadNetworkAnySubtitle => 'WiFi + Mobile Data'; + String get downloadNetworkAnySubtitle => 'Use WiFi or mobile data'; @override String get downloadNetworkWifiOnlySubtitle => - 'Pause downloads on mobile data'; + 'Downloads pause when on mobile data'; @override String get downloadSongLinkRegionDesc => - 'Used as userCountry for SongLink API lookup.'; + 'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.'; @override String get snackbarUnsupportedAudioFormat => 'Unsupported audio format'; @@ -7422,6 +7507,15 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get audioAnalysisSampleRate => 'Sample Rate'; + @override + String get audioAnalysisCodec => 'Codec'; + + @override + String get audioAnalysisContainer => 'Container'; + + @override + String get audioAnalysisDecodedFormat => 'Decoded Format'; + @override String get audioAnalysisBitDepth => 'Bit Depth'; @@ -7446,6 +7540,24 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get audioAnalysisRms => 'RMS'; + @override + String get audioAnalysisLufs => 'LUFS'; + + @override + String get audioAnalysisTruePeak => 'True Peak'; + + @override + String get audioAnalysisClipping => 'Clipping'; + + @override + String get audioAnalysisNoClipping => 'No clipping'; + + @override + String get audioAnalysisSpectralCutoff => 'Spectral Cutoff'; + + @override + String get audioAnalysisChannelStats => 'Per-channel Stats'; + @override String get audioAnalysisSamples => 'Samples'; @@ -7474,6 +7586,13 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { String get extensionsHomeFeedAutoSubtitle => 'Automatically select the best available'; + @override + String get extensionsHomeFeedOff => 'Off'; + + @override + String get extensionsHomeFeedOffSubtitle => + 'Do not show the home feed on the main screen'; + @override String extensionsHomeFeedUse(String extensionName) { return 'Use $extensionName home feed'; @@ -7571,7 +7690,44 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String notifTracksDownloadedSuccess(int count) { - return '$count tracks downloaded successfully'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks downloaded successfully', + one: '1 track downloaded successfully', + ); + return '$_temp0'; + } + + @override + String notifDownloadsFinishedBody(int completed, int failed) { + String _temp0 = intl.Intl.pluralLogic( + completed, + locale: localeName, + other: '$completed tracks downloaded', + one: '1 track downloaded', + ); + String _temp1 = intl.Intl.pluralLogic( + failed, + locale: localeName, + other: '$failed failed', + one: '1 failed', + ); + return '$_temp0, $_temp1'; + } + + @override + String get notifDownloadsCanceledTitle => 'Downloads canceled'; + + @override + String notifDownloadsCanceledBody(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count downloads canceled by user', + one: '1 download canceled by user', + ); + return '$_temp0'; } @override @@ -7643,6 +7799,232 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { String get notifUpdateFailedBody => 'Could not download update. Try again later.'; + @override + String get searchTracks => 'Tracks'; + + @override + String get homeSearchHintDefault => 'Paste supported URL or search...'; + + @override + String homeSearchHintProvider(String providerName) { + return 'Search with $providerName...'; + } + + @override + String get homeImportCsvTooltip => 'Import CSV'; + + @override + String get homeChangeSearchProviderTooltip => 'Change search provider'; + + @override + String get actionPaste => 'Paste'; + + @override + String get searchTracksHint => 'Search tracks...'; + + @override + String get searchTracksEmptyPrompt => 'Search for tracks'; + + @override + String get tutorialSearchHint => 'Paste or search...'; + + @override + String get tutorialDownloadCompletedSemantics => 'Download completed'; + + @override + String get tutorialDownloadInProgressSemantics => 'Download in progress'; + + @override + String get tutorialStartDownloadSemantics => 'Start download'; + + @override + String get optionsEmbedMetadata => 'Embed Metadata'; + + @override + String get optionsEmbedMetadataSubtitleOn => + 'Write metadata, cover art, and embedded lyrics to files'; + + @override + String get optionsEmbedMetadataSubtitleOff => + 'Disabled (advanced): skip all metadata embedding'; + + @override + String get optionsMaxQualityCoverSubtitleDisabled => + 'Disabled when metadata embedding is off'; + + @override + String downloadFilenameHintExample(Object artist, Object title) { + return '$artist - $title'; + } + + @override + String get trackCoverNoEmbeddedArt => 'No embedded album art found'; + + @override + String get trackCoverReplace => 'Replace Cover'; + + @override + String get trackCoverPick => 'Pick Cover'; + + @override + String get trackCoverClearSelected => 'Clear selected cover'; + + @override + String get trackCoverCurrent => 'Current cover'; + + @override + String get trackCoverSelected => 'Selected cover'; + + @override + String get trackCoverReplaceNotice => + 'The selected cover will replace the current embedded cover when you tap Save.'; + + @override + String get actionStop => 'Stop'; + + @override + String get queueFinalizingDownload => 'Finalizing download'; + + @override + String get queueDownloadedFileMissing => 'Downloaded file missing'; + + @override + String get queueDownloadCompleted => 'Download completed'; + + @override + String get queueRateLimitTitle => 'Service rate limited'; + + @override + String get queueRateLimitMessage => + 'This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.'; + + @override + String appearanceSelectAccentColor(String hex) { + return 'Select accent color $hex'; + } + + @override + String get logAutoScrollOn => 'Auto-scroll ON'; + + @override + String get logAutoScrollOff => 'Auto-scroll OFF'; + + @override + String get logCopyLogs => 'Copy logs'; + + @override + String get logClearSearch => 'Clear search'; + + @override + String get logIssueIspBlockingLabel => 'ISP BLOCKING DETECTED'; + + @override + String get logIssueIspBlockingDescription => + 'Your ISP may be blocking access to download services'; + + @override + String get logIssueIspBlockingSuggestion => + 'Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8'; + + @override + String get logIssueRateLimitedLabel => 'RATE LIMITED'; + + @override + String get logIssueRateLimitedDescription => + 'Too many requests to the service'; + + @override + String get logIssueRateLimitedSuggestion => + 'Wait a few minutes before trying again'; + + @override + String get logIssueNetworkErrorLabel => 'NETWORK ERROR'; + + @override + String get logIssueNetworkErrorDescription => 'Connection issues detected'; + + @override + String get logIssueNetworkErrorSuggestion => 'Check your internet connection'; + + @override + String get logIssueTrackNotFoundLabel => 'TRACK NOT FOUND'; + + @override + String get logIssueTrackNotFoundDescription => + 'Some tracks could not be found on download services'; + + @override + String get logIssueTrackNotFoundSuggestion => + 'The track may not be available in lossless quality'; + + @override + String get clickableLookingUpArtist => 'Looking up artist...'; + + @override + String clickableInformationUnavailable(String type) { + return '$type information not available'; + } + + @override + String get extensionDetailsTags => 'Tags'; + + @override + String get extensionDetailsInformation => 'Information'; + + @override + String get extensionUtilityFunctions => 'Utility Functions'; + + @override + String get actionDismiss => 'Dismiss'; + + @override + String get setupChangeFolderTooltip => 'Change folder'; + + @override + String a11yOpenTrackByArtist(String trackName, String artistName) { + return 'Open track $trackName by $artistName'; + } + + @override + String a11yOpenItem(String itemType, String name) { + return 'Open $itemType $name'; + } + + @override + String a11yOpenItemCount(String title, int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'items', + one: 'item', + ); + return 'Open $title, $count $_temp0'; + } + + @override + String a11yOpenAlbumByArtistTrackCount( + String albumName, + String artistName, + int trackCount, + ) { + return 'Open album $albumName by $artistName, $trackCount tracks'; + } + + @override + String a11yTrackByArtist(String trackName, String artistName) { + return '$trackName by $artistName'; + } + + @override + String a11ySelectAlbum(String albumName) { + return 'Select album $albumName'; + } + + @override + String a11yOpenAlbum(String albumName) { + return 'Open album $albumName'; + } + @override String get optionsDefaultSearchTabAlbums => 'Albums'; @@ -7709,6 +8091,381 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get downloadFallbackExtensionsSubtitle => 'Choose which extensions can be used as fallback'; + + @override + String get editMetadataFieldDateHint => 'YYYY-MM-DD or YYYY'; + + @override + String get editMetadataFieldTrackTotal => 'Track Total'; + + @override + String get editMetadataFieldDiscTotal => 'Disc Total'; + + @override + String get editMetadataFieldComposer => 'Composer'; + + @override + String get editMetadataFieldComment => 'Comment'; + + @override + String get editMetadataAdvanced => 'Advanced'; + + @override + String get libraryFilterMetadataMissingTrackNumber => 'Missing track number'; + + @override + String get libraryFilterMetadataMissingDiscNumber => 'Missing disc number'; + + @override + String get libraryFilterMetadataMissingArtist => 'Missing artist'; + + @override + String get libraryFilterMetadataIncorrectIsrcFormat => + 'Incorrect ISRC format'; + + @override + String get libraryFilterMetadataMissingLabel => 'Missing label'; + + @override + String collectionDeletePlaylistsMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Delete $count $_temp0?'; + } + + @override + String collectionPlaylistsDeleted(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return '$count $_temp0 deleted'; + } + + @override + String collectionAddedTracksToPlaylist(int count, String playlistName) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Added $count $_temp0 to $playlistName'; + } + + @override + String collectionAddedTracksToPlaylistWithExisting( + int count, + String playlistName, + int alreadyCount, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Added $count $_temp0 to $playlistName ($alreadyCount already in playlist)'; + } + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'items', + one: 'item', + ); + return '$count $_temp0'; + } + + @override + String trackReEnrichSuccessWithFailures( + int successCount, + int total, + int failedCount, + ) { + return 'Metadata re-enriched successfully ($successCount/$total) - Failed: $failedCount'; + } + + @override + String selectionDeleteTracksCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Delete $count $_temp0'; + } + + @override + String queueDownloadSpeedStatus(String speed) { + return 'Downloading - $speed MB/s'; + } + + @override + String get queueDownloadStarting => 'Starting...'; + + @override + String get a11ySelectTrack => 'Select track'; + + @override + String get a11yDeselectTrack => 'Deselect track'; + + @override + String a11yPlayTrackByArtist(String trackName, String artistName) { + return 'Play $trackName by $artistName'; + } + + @override + String storeExtensionsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'extensions', + one: 'extension', + ); + return '$count $_temp0'; + } + + @override + String storeRequiresVersion(String version) { + return 'Requires v$version+'; + } + + @override + String get actionGo => 'Go'; + + @override + String get logIssueSummary => 'Issue Summary'; + + @override + String logTotalErrors(int count) { + return 'Total errors: $count'; + } + + @override + String logAffectedDomains(String domains) { + return 'Affected: $domains'; + } + + @override + String get libraryScanCancelled => 'Scan cancelled'; + + @override + String get libraryScanCancelledSubtitle => + 'You can retry the scan when ready.'; + + @override + String libraryDownloadsHistoryExcluded(int count) { + return '$count from Downloads history (excluded from list)'; + } + + @override + String get downloadNativeWorker => 'Native download worker'; + + @override + String get downloadNativeWorkerSubtitle => + 'Beta Android service worker for extension downloads'; + + @override + String get badgeBeta => 'BETA'; + + @override + String get extensionServiceStatus => 'Service Status'; + + @override + String get extensionServiceHealth => 'Service health'; + + @override + String extensionHealthChecksConfigured(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'checks', + one: 'check', + ); + return '$count $_temp0 configured'; + } + + @override + String get extensionOauthConnectHint => + 'Tap Connect to Spotify to fill this field.'; + + @override + String extensionLastChecked(String time) { + return 'Last checked $time'; + } + + @override + String get extensionRefreshStatus => 'Refresh status'; + + @override + String get extensionCustomUrlHandling => 'Custom URL Handling'; + + @override + String get extensionCustomUrlHandlingSubtitle => + 'This extension can handle links from these sites'; + + @override + String get extensionCustomUrlHandlingShareHint => + 'Share links from these sites to SpotiFLAC Mobile and this extension will handle them.'; + + @override + String extensionSettingsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'settings', + one: 'setting', + ); + return '$count $_temp0'; + } + + @override + String get extensionHealthOnline => 'Online'; + + @override + String get extensionHealthDegraded => 'Degraded'; + + @override + String get extensionHealthOffline => 'Offline'; + + @override + String get extensionHealthNotConfigured => 'Not configured'; + + @override + String get extensionHealthUnknown => 'Unknown'; + + @override + String get extensionHealthRequired => 'required'; + + @override + String get extensionSettingNotSet => 'Not set'; + + @override + String get extensionActionFailed => 'Action failed'; + + @override + String get extensionEnterValue => 'Enter value'; + + @override + String get extensionHealthServiceOnline => 'Service online'; + + @override + String get extensionHealthServiceDegraded => 'Service degraded'; + + @override + String get extensionHealthServiceOffline => 'Service offline'; + + @override + String get extensionHealthServiceUnknown => 'Service status unknown'; + + @override + String get audioAnalysisStereo => 'Stereo'; + + @override + String get audioAnalysisMono => 'Mono'; + + @override + String trackOpenInService(String serviceName) { + return 'Open in $serviceName'; + } + + @override + String get trackLyricsEmbeddedSource => 'Embedded'; + + @override + String get unknownAlbum => 'Unknown Album'; + + @override + String get unknownArtist => 'Unknown Artist'; + + @override + String get permissionAudio => 'Audio'; + + @override + String get permissionStorage => 'Storage'; + + @override + String get permissionNotification => 'Notification'; + + @override + String get errorInvalidFolderSelected => 'Invalid folder selected'; + + @override + String get errorCouldNotKeepFolderAccess => + 'Could not keep access to the selected folder'; + + @override + String get storeAnyVersion => 'Any'; + + @override + String get storeCategoryMetadata => 'Metadata'; + + @override + String get storeCategoryDownload => 'Download'; + + @override + String get storeCategoryUtility => 'Utility'; + + @override + String get storeCategoryLyrics => 'Lyrics'; + + @override + String get storeCategoryIntegration => 'Integration'; + + @override + String get artistReleases => 'Releases'; + + @override + String get editMetadataSelectNone => 'None'; + + @override + String queueRetryAllFailed(int count) { + return 'Retry $count failed'; + } + + @override + String get settingsSaveDownloadHistory => 'Save download history'; + + @override + String get settingsSaveDownloadHistorySubtitle => + 'Keep completed downloads in history and library views'; + + @override + String get dialogDisableHistoryTitle => 'Turn off download history?'; + + @override + String get dialogDisableHistoryMessage => + 'Existing history will be cleared. Downloaded files will not be deleted.'; + + @override + String get dialogDisableAndClear => 'Turn off and clear'; + + @override + String get openInOtherServices => 'Open in Other Services'; + + @override + String get shareSheetNoExtensions => 'No other compatible services'; + + @override + String get shareSheetNotFound => 'Not found'; + + @override + String get shareSheetCopyLink => 'Copy Link'; + + @override + String shareSheetLinkCopied(Object service) { + return '$service link copied'; + } } /// The translations for Chinese, as used in Taiwan (`zh_TW`). @@ -7736,6 +8493,12 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get homeSubtitle => 'Paste a supported URL or search by name'; + @override + String get homeEmptyTitle => 'No search providers yet'; + + @override + String get homeEmptySubtitle => 'Install an extension to continue.'; + @override String get homeSupports => 'Supports: Track, Album, Playlist, Artist URLs'; @@ -7827,7 +8590,7 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get optionsPrimaryProviderSubtitle => - 'Service used when searching by track name.'; + 'Service used for searching by track or album name'; @override String optionsUsingExtension(String extensionName) { @@ -7866,7 +8629,7 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get optionsEmbedLyricsSubtitle => - 'Embed synced lyrics into FLAC files'; + 'Save synced lyrics alongside your downloaded tracks'; @override String get optionsMaxQualityCover => 'Max Quality Cover'; @@ -8246,6 +9009,16 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { String get setupAllowAccessToManageFiles => 'Please enable \"Allow access to manage all files\" in the next screen.'; + @override + String get setupLanguageTitle => 'Choose Language'; + + @override + String get setupLanguageDescription => + 'Select your preferred language for the app. You can change this later in Settings.'; + + @override + String get setupLanguageSystemDefault => 'System Default'; + @override String get dialogCancel => 'Cancel'; @@ -8433,6 +9206,9 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get errorNoTracksFound => 'No tracks found'; + @override + String get searchEmptyResultSubtitle => 'Try another keyword'; + @override String get errorUrlNotRecognized => 'Link not recognized'; @@ -8809,10 +9585,10 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { String get settingsAppearanceSubtitle => 'Theme, colors, display'; @override - String get settingsDownloadSubtitle => 'Service, quality, filename format'; + String get settingsDownloadSubtitle => 'Service, quality, fallback'; @override - String get settingsOptionsSubtitle => 'Fallback, lyrics, cover art, updates'; + String get settingsOptionsSubtitle => 'Fallback, metadata, lyrics, cover art'; @override String get settingsExtensionsSubtitle => 'Manage download providers'; @@ -8911,6 +9687,11 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get trackCopyLyrics => 'Copy lyrics'; + @override + String trackLyricsSource(String source) { + return 'Source: $source'; + } + @override String get trackLyricsNotAvailable => 'Lyrics not available for this track'; @@ -9123,6 +9904,16 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get extensionsInstalledSuccess => 'Extension installed successfully'; + @override + String extensionsInstalledCount(int count) { + return '$count extensions installed successfully'; + } + + @override + String extensionsInstallPartialSuccess(int installed, int attempted) { + return 'Installed $installed of $attempted extensions'; + } + @override String get extensionsDownloadPriority => 'Download Priority'; @@ -9204,6 +9995,13 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get downloadLossyMp3Subtitle => 'Best compatibility, ~10MB per track'; + @override + String get downloadLossyAac => 'AAC/M4A 320kbps'; + + @override + String get downloadLossyAacSubtitle => + 'Best mobile compatibility, M4A container'; + @override String get downloadLossyOpus256 => 'Opus 256kbps'; @@ -10089,7 +10887,7 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get trackConvertFormatSubtitle => - 'Convert to MP3, Opus, ALAC, or FLAC'; + 'Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC'; @override String get trackConvertTitle => 'Convert Audio'; @@ -10195,6 +10993,9 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get collectionLoved => 'Loved'; + @override + String get collectionFavoriteArtists => 'Favorite Artists'; + @override String get collectionPlaylists => 'Playlists'; @@ -10225,6 +11026,17 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { return '$_temp0'; } + @override + String collectionArtistCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count artists', + one: '1 artist', + ); + return '$_temp0'; + } + @override String collectionAddedToPlaylist(String playlistName) { return 'Added to \"$playlistName\"'; @@ -10275,6 +11087,13 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { String get collectionLovedEmptySubtitle => 'Tap love on tracks to keep your favorites'; + @override + String get collectionFavoriteArtistsEmptyTitle => 'No favorite artists yet'; + + @override + String get collectionFavoriteArtistsEmptySubtitle => + 'Tap the heart on an artist page to keep them here'; + @override String get collectionPlaylistEmptyTitle => 'Playlist is empty'; @@ -10313,6 +11132,16 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { return '\"$trackName\" removed from Wishlist'; } + @override + String collectionAddedToFavoriteArtists(String artistName) { + return '\"$artistName\" added to Favorite Artists'; + } + + @override + String collectionRemovedFromFavoriteArtists(String artistName) { + return '\"$artistName\" removed from Favorite Artists'; + } + @override String get trackOptionAddToLoved => 'Add to Loved'; @@ -10325,6 +11154,12 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get trackOptionRemoveFromWishlist => 'Remove from Wishlist'; + @override + String get artistOptionAddToFavorites => 'Add to Favorite Artists'; + + @override + String get artistOptionRemoveFromFavorites => 'Remove from Favorite Artists'; + @override String get collectionPlaylistChangeCover => 'Change cover image'; @@ -10405,14 +11240,14 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Artist folders use Album Artist when available'; + 'Folder named after Album Artist tag'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => - 'Artist folders use Track Artist only'; + 'Folder named after Track Artist tag'; @override - String get lyricsProvidersTitle => 'Lyrics Providers'; + String get lyricsProvidersTitle => 'Lyrics Provider Priority'; @override String get lyricsProvidersDescription => @@ -10480,10 +11315,10 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { String get safMigrationSuccess => 'Download folder updated to SAF mode'; @override - String get settingsDonate => 'Donate'; + String get settingsDonate => 'Support Development'; @override - String get settingsDonateSubtitle => 'Support SpotiFLAC-Mobile development'; + String get settingsDonateSubtitle => 'Buy the developer a coffee'; @override String get tooltipLoveAll => 'Love All'; @@ -10543,20 +11378,20 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get downloadLocationSubtitle => - 'Choose storage mode for downloaded files.'; + 'Choose where to save your downloaded tracks'; @override - String get storageModeAppFolder => 'App folder (non-SAF)'; + String get storageModeAppFolder => 'App Folder (Recommended)'; @override - String get storageModeAppFolderSubtitle => 'Use default Music/SpotiFLAC path'; + String get storageModeAppFolderSubtitle => + 'Saves to Music/SpotiFLAC by default'; @override - String get storageModeSaf => 'SAF folder'; + String get storageModeSaf => 'Custom Folder (SAF)'; @override - String get storageModeSafSubtitle => - 'Pick folder via Android Storage Access Framework'; + String get storageModeSafSubtitle => 'Pick any folder, including SD card'; @override String downloadFilenameDescription( @@ -10568,62 +11403,62 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { Object track, Object year, ) { - return 'Customize how your files are named.'; + return 'Use $artist, $title, $album, $track, $year, $date, $disc as placeholders.'; } @override String get downloadFilenameInsertTag => 'Tap to insert tag:'; @override - String get downloadSeparateSinglesEnabled => 'Albums/ and Singles/ folders'; + String get downloadSeparateSinglesEnabled => + 'Singles and EPs saved in a separate folder'; @override - String get downloadSeparateSinglesDisabled => 'All files in same structure'; + String get downloadSeparateSinglesDisabled => + 'Singles and albums saved in the same folder'; @override String get downloadArtistNameFilters => 'Artist Name Filters'; @override - String get downloadCreatePlaylistSourceFolder => - 'Create playlist source folder'; + String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder'; @override String get downloadCreatePlaylistSourceFolderEnabled => - 'Playlist downloads use Playlist/ plus your normal folder structure.'; + 'A subfolder is created for each playlist'; @override String get downloadCreatePlaylistSourceFolderDisabled => - 'Playlist downloads use the normal folder structure only.'; + 'All tracks saved directly to download folder'; @override String get downloadCreatePlaylistSourceFolderRedundant => - 'By Playlist already places downloads inside a playlist folder.'; + 'Handled by folder organization setting'; @override String get downloadSongLinkRegion => 'SongLink Region'; @override - String get downloadNetworkCompatibilityMode => 'Network compatibility mode'; + String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode'; @override String get downloadNetworkCompatibilityModeEnabled => - 'Enabled: try HTTP + accept invalid TLS certificates (unsafe)'; + 'Using legacy TLS settings for older networks'; @override String get downloadNetworkCompatibilityModeDisabled => - 'Off: strict HTTPS certificate validation (recommended)'; + 'Using standard network settings'; @override String get downloadSelectServiceToEnable => - 'Select a built-in service to enable'; + 'Select Tidal or Qobuz to enable this option'; @override String get downloadSelectTidalQobuz => - 'Select Tidal or Qobuz above to configure quality'; + 'Select Tidal or Qobuz to choose audio quality'; @override - String get downloadEmbedLyricsDisabled => - 'Disabled while Embed Metadata is turned off'; + String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first'; @override String get downloadNeteaseIncludeTranslation => @@ -10631,11 +11466,11 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get downloadNeteaseIncludeTranslationEnabled => - 'Append translated lyrics when available'; + 'Chinese translation lines included'; @override String get downloadNeteaseIncludeTranslationDisabled => - 'Use original lyrics only'; + 'Original lyrics only'; @override String get downloadNeteaseIncludeRomanization => @@ -10643,66 +11478,76 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get downloadNeteaseIncludeRomanizationEnabled => - 'Append romanized lyrics when available'; + 'Romanization lines included'; @override - String get downloadNeteaseIncludeRomanizationDisabled => 'Disabled'; + String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization'; @override - String get downloadAppleQqMultiPerson => 'Apple/QQ Multi-Person Word-by-Word'; + String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics'; @override String get downloadAppleQqMultiPersonEnabled => - 'Enable v1/v2 speaker and [bg:] tags'; + 'Speaker labels included for duets and group tracks'; @override String get downloadAppleQqMultiPersonDisabled => - 'Simplified word-by-word formatting'; + 'Standard lyrics without speaker labels'; + + @override + String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync'; + + @override + String get downloadAppleElrcWordSyncEnabled => + 'Raw word-by-word timestamps preserved'; + + @override + String get downloadAppleElrcWordSyncDisabled => + 'Safer line-by-line Apple Music lyrics'; @override String get downloadMusixmatchLanguage => 'Musixmatch Language'; @override - String get downloadMusixmatchLanguageAuto => 'Auto (original)'; + String get downloadMusixmatchLanguageAuto => 'Auto (original language)'; @override - String get downloadFilterContributing => - 'Filter contributing artists in Album Artist'; + String get downloadFilterContributing => 'Filter Contributing Artists'; @override String get downloadFilterContributingEnabled => - 'Album Artist metadata uses primary artist only'; + 'Contributing artists removed from Album Artist folder name'; @override String get downloadFilterContributingDisabled => - 'Keep full Album Artist metadata value'; + 'Full Album Artist string used'; @override - String get downloadProvidersNoneEnabled => 'None enabled'; + String get downloadProvidersNoneEnabled => 'No providers enabled'; @override String get downloadMusixmatchLanguageCode => 'Language code'; @override - String get downloadMusixmatchLanguageHint => 'auto / en / es / ja'; + String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja'; @override String get downloadMusixmatchLanguageDesc => - 'Set preferred language code (example: en, es, ja). Leave empty for auto.'; + 'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.'; @override String get downloadMusixmatchAuto => 'Auto'; @override - String get downloadNetworkAnySubtitle => 'WiFi + Mobile Data'; + String get downloadNetworkAnySubtitle => 'Use WiFi or mobile data'; @override String get downloadNetworkWifiOnlySubtitle => - 'Pause downloads on mobile data'; + 'Downloads pause when on mobile data'; @override String get downloadSongLinkRegionDesc => - 'Used as userCountry for SongLink API lookup.'; + 'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.'; @override String get snackbarUnsupportedAudioFormat => 'Unsupported audio format'; @@ -10905,6 +11750,15 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get audioAnalysisSampleRate => 'Sample Rate'; + @override + String get audioAnalysisCodec => 'Codec'; + + @override + String get audioAnalysisContainer => 'Container'; + + @override + String get audioAnalysisDecodedFormat => 'Decoded Format'; + @override String get audioAnalysisBitDepth => 'Bit Depth'; @@ -10929,6 +11783,24 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get audioAnalysisRms => 'RMS'; + @override + String get audioAnalysisLufs => 'LUFS'; + + @override + String get audioAnalysisTruePeak => 'True Peak'; + + @override + String get audioAnalysisClipping => 'Clipping'; + + @override + String get audioAnalysisNoClipping => 'No clipping'; + + @override + String get audioAnalysisSpectralCutoff => 'Spectral Cutoff'; + + @override + String get audioAnalysisChannelStats => 'Per-channel Stats'; + @override String get audioAnalysisSamples => 'Samples'; @@ -10957,6 +11829,13 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { String get extensionsHomeFeedAutoSubtitle => 'Automatically select the best available'; + @override + String get extensionsHomeFeedOff => 'Off'; + + @override + String get extensionsHomeFeedOffSubtitle => + 'Do not show the home feed on the main screen'; + @override String extensionsHomeFeedUse(String extensionName) { return 'Use $extensionName home feed'; @@ -11054,7 +11933,44 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String notifTracksDownloadedSuccess(int count) { - return '$count tracks downloaded successfully'; + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks downloaded successfully', + one: '1 track downloaded successfully', + ); + return '$_temp0'; + } + + @override + String notifDownloadsFinishedBody(int completed, int failed) { + String _temp0 = intl.Intl.pluralLogic( + completed, + locale: localeName, + other: '$completed tracks downloaded', + one: '1 track downloaded', + ); + String _temp1 = intl.Intl.pluralLogic( + failed, + locale: localeName, + other: '$failed failed', + one: '1 failed', + ); + return '$_temp0, $_temp1'; + } + + @override + String get notifDownloadsCanceledTitle => 'Downloads canceled'; + + @override + String notifDownloadsCanceledBody(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count downloads canceled by user', + one: '1 download canceled by user', + ); + return '$_temp0'; } @override @@ -11126,6 +12042,232 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { String get notifUpdateFailedBody => 'Could not download update. Try again later.'; + @override + String get searchTracks => 'Tracks'; + + @override + String get homeSearchHintDefault => 'Paste supported URL or search...'; + + @override + String homeSearchHintProvider(String providerName) { + return 'Search with $providerName...'; + } + + @override + String get homeImportCsvTooltip => 'Import CSV'; + + @override + String get homeChangeSearchProviderTooltip => 'Change search provider'; + + @override + String get actionPaste => 'Paste'; + + @override + String get searchTracksHint => 'Search tracks...'; + + @override + String get searchTracksEmptyPrompt => 'Search for tracks'; + + @override + String get tutorialSearchHint => 'Paste or search...'; + + @override + String get tutorialDownloadCompletedSemantics => 'Download completed'; + + @override + String get tutorialDownloadInProgressSemantics => 'Download in progress'; + + @override + String get tutorialStartDownloadSemantics => 'Start download'; + + @override + String get optionsEmbedMetadata => 'Embed Metadata'; + + @override + String get optionsEmbedMetadataSubtitleOn => + 'Write metadata, cover art, and embedded lyrics to files'; + + @override + String get optionsEmbedMetadataSubtitleOff => + 'Disabled (advanced): skip all metadata embedding'; + + @override + String get optionsMaxQualityCoverSubtitleDisabled => + 'Disabled when metadata embedding is off'; + + @override + String downloadFilenameHintExample(Object artist, Object title) { + return '$artist - $title'; + } + + @override + String get trackCoverNoEmbeddedArt => 'No embedded album art found'; + + @override + String get trackCoverReplace => 'Replace Cover'; + + @override + String get trackCoverPick => 'Pick Cover'; + + @override + String get trackCoverClearSelected => 'Clear selected cover'; + + @override + String get trackCoverCurrent => 'Current cover'; + + @override + String get trackCoverSelected => 'Selected cover'; + + @override + String get trackCoverReplaceNotice => + 'The selected cover will replace the current embedded cover when you tap Save.'; + + @override + String get actionStop => 'Stop'; + + @override + String get queueFinalizingDownload => 'Finalizing download'; + + @override + String get queueDownloadedFileMissing => 'Downloaded file missing'; + + @override + String get queueDownloadCompleted => 'Download completed'; + + @override + String get queueRateLimitTitle => 'Service rate limited'; + + @override + String get queueRateLimitMessage => + 'This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.'; + + @override + String appearanceSelectAccentColor(String hex) { + return 'Select accent color $hex'; + } + + @override + String get logAutoScrollOn => 'Auto-scroll ON'; + + @override + String get logAutoScrollOff => 'Auto-scroll OFF'; + + @override + String get logCopyLogs => 'Copy logs'; + + @override + String get logClearSearch => 'Clear search'; + + @override + String get logIssueIspBlockingLabel => 'ISP BLOCKING DETECTED'; + + @override + String get logIssueIspBlockingDescription => + 'Your ISP may be blocking access to download services'; + + @override + String get logIssueIspBlockingSuggestion => + 'Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8'; + + @override + String get logIssueRateLimitedLabel => 'RATE LIMITED'; + + @override + String get logIssueRateLimitedDescription => + 'Too many requests to the service'; + + @override + String get logIssueRateLimitedSuggestion => + 'Wait a few minutes before trying again'; + + @override + String get logIssueNetworkErrorLabel => 'NETWORK ERROR'; + + @override + String get logIssueNetworkErrorDescription => 'Connection issues detected'; + + @override + String get logIssueNetworkErrorSuggestion => 'Check your internet connection'; + + @override + String get logIssueTrackNotFoundLabel => 'TRACK NOT FOUND'; + + @override + String get logIssueTrackNotFoundDescription => + 'Some tracks could not be found on download services'; + + @override + String get logIssueTrackNotFoundSuggestion => + 'The track may not be available in lossless quality'; + + @override + String get clickableLookingUpArtist => 'Looking up artist...'; + + @override + String clickableInformationUnavailable(String type) { + return '$type information not available'; + } + + @override + String get extensionDetailsTags => 'Tags'; + + @override + String get extensionDetailsInformation => 'Information'; + + @override + String get extensionUtilityFunctions => 'Utility Functions'; + + @override + String get actionDismiss => 'Dismiss'; + + @override + String get setupChangeFolderTooltip => 'Change folder'; + + @override + String a11yOpenTrackByArtist(String trackName, String artistName) { + return 'Open track $trackName by $artistName'; + } + + @override + String a11yOpenItem(String itemType, String name) { + return 'Open $itemType $name'; + } + + @override + String a11yOpenItemCount(String title, int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'items', + one: 'item', + ); + return 'Open $title, $count $_temp0'; + } + + @override + String a11yOpenAlbumByArtistTrackCount( + String albumName, + String artistName, + int trackCount, + ) { + return 'Open album $albumName by $artistName, $trackCount tracks'; + } + + @override + String a11yTrackByArtist(String trackName, String artistName) { + return '$trackName by $artistName'; + } + + @override + String a11ySelectAlbum(String albumName) { + return 'Select album $albumName'; + } + + @override + String a11yOpenAlbum(String albumName) { + return 'Open album $albumName'; + } + @override String get optionsDefaultSearchTabAlbums => 'Albums'; @@ -11192,4 +12334,379 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get downloadFallbackExtensionsSubtitle => 'Choose which extensions can be used as fallback'; + + @override + String get editMetadataFieldDateHint => 'YYYY-MM-DD or YYYY'; + + @override + String get editMetadataFieldTrackTotal => 'Track Total'; + + @override + String get editMetadataFieldDiscTotal => 'Disc Total'; + + @override + String get editMetadataFieldComposer => 'Composer'; + + @override + String get editMetadataFieldComment => 'Comment'; + + @override + String get editMetadataAdvanced => 'Advanced'; + + @override + String get libraryFilterMetadataMissingTrackNumber => 'Missing track number'; + + @override + String get libraryFilterMetadataMissingDiscNumber => 'Missing disc number'; + + @override + String get libraryFilterMetadataMissingArtist => 'Missing artist'; + + @override + String get libraryFilterMetadataIncorrectIsrcFormat => + 'Incorrect ISRC format'; + + @override + String get libraryFilterMetadataMissingLabel => 'Missing label'; + + @override + String collectionDeletePlaylistsMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Delete $count $_temp0?'; + } + + @override + String collectionPlaylistsDeleted(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return '$count $_temp0 deleted'; + } + + @override + String collectionAddedTracksToPlaylist(int count, String playlistName) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Added $count $_temp0 to $playlistName'; + } + + @override + String collectionAddedTracksToPlaylistWithExisting( + int count, + String playlistName, + int alreadyCount, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Added $count $_temp0 to $playlistName ($alreadyCount already in playlist)'; + } + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'items', + one: 'item', + ); + return '$count $_temp0'; + } + + @override + String trackReEnrichSuccessWithFailures( + int successCount, + int total, + int failedCount, + ) { + return 'Metadata re-enriched successfully ($successCount/$total) - Failed: $failedCount'; + } + + @override + String selectionDeleteTracksCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Delete $count $_temp0'; + } + + @override + String queueDownloadSpeedStatus(String speed) { + return 'Downloading - $speed MB/s'; + } + + @override + String get queueDownloadStarting => 'Starting...'; + + @override + String get a11ySelectTrack => 'Select track'; + + @override + String get a11yDeselectTrack => 'Deselect track'; + + @override + String a11yPlayTrackByArtist(String trackName, String artistName) { + return 'Play $trackName by $artistName'; + } + + @override + String storeExtensionsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'extensions', + one: 'extension', + ); + return '$count $_temp0'; + } + + @override + String storeRequiresVersion(String version) { + return 'Requires v$version+'; + } + + @override + String get actionGo => 'Go'; + + @override + String get logIssueSummary => 'Issue Summary'; + + @override + String logTotalErrors(int count) { + return 'Total errors: $count'; + } + + @override + String logAffectedDomains(String domains) { + return 'Affected: $domains'; + } + + @override + String get libraryScanCancelled => 'Scan cancelled'; + + @override + String get libraryScanCancelledSubtitle => + 'You can retry the scan when ready.'; + + @override + String libraryDownloadsHistoryExcluded(int count) { + return '$count from Downloads history (excluded from list)'; + } + + @override + String get downloadNativeWorker => 'Native download worker'; + + @override + String get downloadNativeWorkerSubtitle => + 'Beta Android service worker for extension downloads'; + + @override + String get badgeBeta => 'BETA'; + + @override + String get extensionServiceStatus => 'Service Status'; + + @override + String get extensionServiceHealth => 'Service health'; + + @override + String extensionHealthChecksConfigured(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'checks', + one: 'check', + ); + return '$count $_temp0 configured'; + } + + @override + String get extensionOauthConnectHint => + 'Tap Connect to Spotify to fill this field.'; + + @override + String extensionLastChecked(String time) { + return 'Last checked $time'; + } + + @override + String get extensionRefreshStatus => 'Refresh status'; + + @override + String get extensionCustomUrlHandling => 'Custom URL Handling'; + + @override + String get extensionCustomUrlHandlingSubtitle => + 'This extension can handle links from these sites'; + + @override + String get extensionCustomUrlHandlingShareHint => + 'Share links from these sites to SpotiFLAC Mobile and this extension will handle them.'; + + @override + String extensionSettingsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'settings', + one: 'setting', + ); + return '$count $_temp0'; + } + + @override + String get extensionHealthOnline => 'Online'; + + @override + String get extensionHealthDegraded => 'Degraded'; + + @override + String get extensionHealthOffline => 'Offline'; + + @override + String get extensionHealthNotConfigured => 'Not configured'; + + @override + String get extensionHealthUnknown => 'Unknown'; + + @override + String get extensionHealthRequired => 'required'; + + @override + String get extensionSettingNotSet => 'Not set'; + + @override + String get extensionActionFailed => 'Action failed'; + + @override + String get extensionEnterValue => 'Enter value'; + + @override + String get extensionHealthServiceOnline => 'Service online'; + + @override + String get extensionHealthServiceDegraded => 'Service degraded'; + + @override + String get extensionHealthServiceOffline => 'Service offline'; + + @override + String get extensionHealthServiceUnknown => 'Service status unknown'; + + @override + String get audioAnalysisStereo => 'Stereo'; + + @override + String get audioAnalysisMono => 'Mono'; + + @override + String trackOpenInService(String serviceName) { + return 'Open in $serviceName'; + } + + @override + String get trackLyricsEmbeddedSource => 'Embedded'; + + @override + String get unknownAlbum => 'Unknown Album'; + + @override + String get unknownArtist => 'Unknown Artist'; + + @override + String get permissionAudio => 'Audio'; + + @override + String get permissionStorage => 'Storage'; + + @override + String get permissionNotification => 'Notification'; + + @override + String get errorInvalidFolderSelected => 'Invalid folder selected'; + + @override + String get errorCouldNotKeepFolderAccess => + 'Could not keep access to the selected folder'; + + @override + String get storeAnyVersion => 'Any'; + + @override + String get storeCategoryMetadata => 'Metadata'; + + @override + String get storeCategoryDownload => 'Download'; + + @override + String get storeCategoryUtility => 'Utility'; + + @override + String get storeCategoryLyrics => 'Lyrics'; + + @override + String get storeCategoryIntegration => 'Integration'; + + @override + String get artistReleases => 'Releases'; + + @override + String get editMetadataSelectNone => 'None'; + + @override + String queueRetryAllFailed(int count) { + return 'Retry $count failed'; + } + + @override + String get settingsSaveDownloadHistory => 'Save download history'; + + @override + String get settingsSaveDownloadHistorySubtitle => + 'Keep completed downloads in history and library views'; + + @override + String get dialogDisableHistoryTitle => 'Turn off download history?'; + + @override + String get dialogDisableHistoryMessage => + 'Existing history will be cleared. Downloaded files will not be deleted.'; + + @override + String get dialogDisableAndClear => 'Turn off and clear'; + + @override + String get openInOtherServices => 'Open in Other Services'; + + @override + String get shareSheetNoExtensions => 'No other compatible services'; + + @override + String get shareSheetNotFound => 'Not found'; + + @override + String get shareSheetCopyLink => 'Copy Link'; + + @override + String shareSheetLinkCopied(Object service) { + return '$service link copied'; + } } diff --git a/lib/l10n/arb/app_ar.arb b/lib/l10n/arb/app_ar.arb new file mode 100644 index 00000000..dd45f5e8 --- /dev/null +++ b/lib/l10n/arb/app_ar.arb @@ -0,0 +1,5558 @@ +{ + "@@locale": "ar", + "@@last_modified": "2026-04-28", + "appName": "SpotiFLAC Mobile", + "@appName": { + "description": "App name - DO NOT TRANSLATE" + }, + "navHome": "Home", + "@navHome": { + "description": "Bottom navigation - Home tab" + }, + "navLibrary": "Library", + "@navLibrary": { + "description": "Bottom navigation - Library tab" + }, + "navSettings": "Settings", + "@navSettings": { + "description": "Bottom navigation - Settings tab" + }, + "navStore": "Repo", + "@navStore": { + "description": "Bottom navigation - Extension store tab" + }, + "homeTitle": "Home", + "@homeTitle": { + "description": "Home screen title" + }, + "homeSubtitle": "Paste a supported URL or search by name", + "@homeSubtitle": { + "description": "Subtitle shown below search box" + }, + "homeEmptyTitle": "No search providers yet", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Install an extension to continue.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "homeSupports": "Supports: Track, Album, Playlist, Artist URLs", + "@homeSupports": { + "description": "Info text about supported URL types" + }, + "homeRecent": "Recent", + "@homeRecent": { + "description": "Section header for recent searches" + }, + "historyFilterAll": "All", + "@historyFilterAll": { + "description": "Filter chip - show all items" + }, + "historyFilterAlbums": "Albums", + "@historyFilterAlbums": { + "description": "Filter chip - show albums only" + }, + "historyFilterSingles": "Singles", + "@historyFilterSingles": { + "description": "Filter chip - show singles only" + }, + "historySearchHint": "Search history...", + "@historySearchHint": { + "description": "Search bar placeholder in history" + }, + "settingsTitle": "Settings", + "@settingsTitle": { + "description": "Settings screen title" + }, + "settingsDownload": "Download", + "@settingsDownload": { + "description": "Settings section - download options" + }, + "settingsAppearance": "Appearance", + "@settingsAppearance": { + "description": "Settings section - visual customization" + }, + "settingsOptions": "Options", + "@settingsOptions": { + "description": "Settings section - app options" + }, + "settingsExtensions": "Extensions", + "@settingsExtensions": { + "description": "Settings section - extension management" + }, + "settingsAbout": "About", + "@settingsAbout": { + "description": "Settings section - app info" + }, + "downloadTitle": "Download", + "@downloadTitle": { + "description": "Download settings page title" + }, + "downloadAskQualitySubtitle": "Show quality picker for each download", + "@downloadAskQualitySubtitle": { + "description": "Subtitle for ask quality toggle" + }, + "downloadFilenameFormat": "Filename Format", + "@downloadFilenameFormat": { + "description": "Setting for output filename pattern" + }, + "downloadSingleFilenameFormat": "Single Filename Format", + "@downloadSingleFilenameFormat": { + "description": "Setting for output filename pattern for singles/EPs" + }, + "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", + "@downloadSingleFilenameFormatDescription": { + "description": "Subtitle description for single filename format setting" + }, + "downloadFolderOrganization": "Folder Organization", + "@downloadFolderOrganization": { + "description": "Title of the folder organization picker bottom sheet" + }, + "appearanceTitle": "Appearance", + "@appearanceTitle": { + "description": "Appearance settings page title" + }, + "appearanceThemeSystem": "System", + "@appearanceThemeSystem": { + "description": "Follow system theme" + }, + "appearanceThemeLight": "Light", + "@appearanceThemeLight": { + "description": "Light theme" + }, + "appearanceThemeDark": "Dark", + "@appearanceThemeDark": { + "description": "Dark theme" + }, + "appearanceDynamicColor": "Dynamic Color", + "@appearanceDynamicColor": { + "description": "Material You dynamic colors" + }, + "appearanceDynamicColorSubtitle": "Use colors from your wallpaper", + "@appearanceDynamicColorSubtitle": { + "description": "Subtitle for dynamic color" + }, + "appearanceHistoryView": "History View", + "@appearanceHistoryView": { + "description": "Layout style for history" + }, + "appearanceHistoryViewList": "List", + "@appearanceHistoryViewList": { + "description": "List layout option" + }, + "appearanceHistoryViewGrid": "Grid", + "@appearanceHistoryViewGrid": { + "description": "Grid layout option" + }, + "optionsTitle": "Options", + "@optionsTitle": { + "description": "Options settings page title" + }, + "optionsPrimaryProvider": "Primary Provider", + "@optionsPrimaryProvider": { + "description": "Main search provider setting" + }, + "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", + "@optionsPrimaryProviderSubtitle": { + "description": "Subtitle for primary provider" + }, + "optionsUsingExtension": "Using extension: {extensionName}", + "@optionsUsingExtension": { + "description": "Shows active extension name", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "optionsDefaultSearchTab": "Default Search Tab", + "@optionsDefaultSearchTab": { + "description": "Title for the preferred default search tab setting" + }, + "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "@optionsDefaultSearchTabSubtitle": { + "description": "Subtitle for the preferred default search tab setting" + }, + "optionsSwitchBack": "Tap Deezer or Spotify to switch back from extension", + "@optionsSwitchBack": { + "description": "Hint to switch back to built-in providers" + }, + "optionsAutoFallback": "Auto Fallback", + "@optionsAutoFallback": { + "description": "Auto-retry with other services" + }, + "optionsAutoFallbackSubtitle": "Try other services if download fails", + "@optionsAutoFallbackSubtitle": { + "description": "Subtitle for auto fallback" + }, + "optionsUseExtensionProviders": "Use Extension Providers", + "@optionsUseExtensionProviders": { + "description": "Enable extension download providers" + }, + "optionsUseExtensionProvidersOn": "Extensions will be tried first", + "@optionsUseExtensionProvidersOn": { + "description": "Status when extension providers enabled" + }, + "optionsUseExtensionProvidersOff": "Using built-in providers only", + "@optionsUseExtensionProvidersOff": { + "description": "Status when extension providers disabled" + }, + "optionsEmbedLyrics": "Embed Lyrics", + "@optionsEmbedLyrics": { + "description": "Embed lyrics in audio files" + }, + "optionsEmbedLyricsSubtitle": "حفظ كلمات الأغاني المتزامنة جنبا إلى جنب مع المسارات التي تم تنزيلها", + "@optionsEmbedLyricsSubtitle": { + "description": "Subtitle for embed lyrics" + }, + "optionsMaxQualityCover": "اختيار اعلى جودة للغلاف", + "@optionsMaxQualityCover": { + "description": "Download highest quality album art" + }, + "optionsMaxQualityCoverSubtitle": "Download highest resolution cover art", + "@optionsMaxQualityCoverSubtitle": { + "description": "Subtitle for max quality cover" + }, + "optionsReplayGain": "ReplayGain", + "@optionsReplayGain": { + "description": "Title for ReplayGain setting toggle" + }, + "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", + "@optionsReplayGainSubtitleOn": { + "description": "Subtitle when ReplayGain is enabled" + }, + "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", + "@optionsReplayGainSubtitleOff": { + "description": "Subtitle when ReplayGain is disabled" + }, + "optionsArtistTagMode": "Artist Tag Mode", + "@optionsArtistTagMode": { + "description": "Setting title for how artist metadata is written into files" + }, + "optionsArtistTagModeDescription": "Choose how multiple artists are written into embedded tags.", + "@optionsArtistTagModeDescription": { + "description": "Bottom-sheet description for artist tag mode setting" + }, + "optionsArtistTagModeJoined": "Single joined value", + "@optionsArtistTagModeJoined": { + "description": "Artist tag mode option that joins multiple artists into one value" + }, + "optionsArtistTagModeJoinedSubtitle": "Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.", + "@optionsArtistTagModeJoinedSubtitle": { + "description": "Subtitle for joined artist tag mode" + }, + "optionsArtistTagModeSplitVorbis": "Split tags for FLAC/Opus", + "@optionsArtistTagModeSplitVorbis": { + "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" + }, + "optionsArtistTagModeSplitVorbisSubtitle": "Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.", + "@optionsArtistTagModeSplitVorbisSubtitle": { + "description": "Subtitle for split Vorbis artist tag mode" + }, + "optionsConcurrentDownloads": "Concurrent Downloads", + "@optionsConcurrentDownloads": { + "description": "Number of parallel downloads" + }, + "optionsConcurrentSequential": "Sequential (1 at a time)", + "@optionsConcurrentSequential": { + "description": "Download one at a time" + }, + "optionsConcurrentParallel": "{count} parallel downloads", + "@optionsConcurrentParallel": { + "description": "Multiple parallel downloads", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "optionsConcurrentWarning": "Parallel downloads may trigger rate limiting", + "@optionsConcurrentWarning": { + "description": "Warning about rate limits" + }, + "optionsExtensionStore": "Extension Repo", + "@optionsExtensionStore": { + "description": "Show/hide store tab" + }, + "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", + "@optionsExtensionStoreSubtitle": { + "description": "Subtitle for extension store toggle" + }, + "optionsCheckUpdates": "Check for Updates", + "@optionsCheckUpdates": { + "description": "Auto update check toggle" + }, + "optionsCheckUpdatesSubtitle": "Notify when new version is available", + "@optionsCheckUpdatesSubtitle": { + "description": "Subtitle for update check" + }, + "optionsUpdateChannel": "Update Channel", + "@optionsUpdateChannel": { + "description": "Stable vs preview releases" + }, + "optionsUpdateChannelStable": "Stable releases only", + "@optionsUpdateChannelStable": { + "description": "Only stable updates" + }, + "optionsUpdateChannelPreview": "Get preview releases", + "@optionsUpdateChannelPreview": { + "description": "Include beta/preview updates" + }, + "optionsUpdateChannelWarning": "Preview may contain bugs or incomplete features", + "@optionsUpdateChannelWarning": { + "description": "Warning about preview channel" + }, + "optionsClearHistory": "Clear Download History", + "@optionsClearHistory": { + "description": "Delete all download history" + }, + "optionsClearHistorySubtitle": "Remove all downloaded tracks from history", + "@optionsClearHistorySubtitle": { + "description": "Subtitle for clear history" + }, + "optionsDetailedLogging": "Detailed Logging", + "@optionsDetailedLogging": { + "description": "Enable verbose logs for debugging" + }, + "optionsDetailedLoggingOn": "Detailed logs are being recorded", + "@optionsDetailedLoggingOn": { + "description": "Status when logging enabled" + }, + "optionsDetailedLoggingOff": "Enable for bug reports", + "@optionsDetailedLoggingOff": { + "description": "Status when logging disabled" + }, + "optionsSpotifyCredentials": "Spotify Credentials", + "@optionsSpotifyCredentials": { + "description": "Spotify API credentials setting" + }, + "optionsSpotifyCredentialsConfigured": "Client ID: {clientId}...", + "@optionsSpotifyCredentialsConfigured": { + "description": "Shows configured client ID preview", + "placeholders": { + "clientId": { + "type": "String" + } + } + }, + "optionsSpotifyCredentialsRequired": "Required - tap to configure", + "@optionsSpotifyCredentialsRequired": { + "description": "Prompt to set up credentials" + }, + "optionsSpotifyWarning": "Spotify requires your own API credentials. Get them free from developer.spotify.com", + "@optionsSpotifyWarning": { + "description": "Info about Spotify API requirement" + }, + "optionsSpotifyDeprecationWarning": "Spotify search will be deprecated on March 3, 2026 due to Spotify API changes. Please switch to Deezer.", + "@optionsSpotifyDeprecationWarning": { + "description": "Warning about Spotify API deprecation" + }, + "extensionsTitle": "Extensions", + "@extensionsTitle": { + "description": "Extensions page title" + }, + "extensionsDisabled": "Disabled", + "@extensionsDisabled": { + "description": "Extension status - inactive" + }, + "extensionsVersion": "Version {version}", + "@extensionsVersion": { + "description": "Extension version display", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "extensionsAuthor": "by {author}", + "@extensionsAuthor": { + "description": "Extension author credit", + "placeholders": { + "author": { + "type": "String" + } + } + }, + "extensionsUninstall": "Uninstall", + "@extensionsUninstall": { + "description": "Uninstall extension button" + }, + "storeTitle": "Extension Repo", + "@storeTitle": { + "description": "Store screen title" + }, + "storeSearch": "Search extensions...", + "@storeSearch": { + "description": "Store search placeholder" + }, + "storeInstall": "Install", + "@storeInstall": { + "description": "Install extension button" + }, + "storeInstalled": "Installed", + "@storeInstalled": { + "description": "Already installed badge" + }, + "storeUpdate": "Update", + "@storeUpdate": { + "description": "Update available button" + }, + "aboutTitle": "About", + "@aboutTitle": { + "description": "About page title" + }, + "aboutContributors": "Contributors", + "@aboutContributors": { + "description": "Section for contributors" + }, + "aboutMobileDeveloper": "Mobile version developer", + "@aboutMobileDeveloper": { + "description": "Role description for mobile dev" + }, + "aboutOriginalCreator": "Creator of the original SpotiFLAC", + "@aboutOriginalCreator": { + "description": "Role description for original creator" + }, + "aboutLogoArtist": "The talented artist who created our beautiful app logo!", + "@aboutLogoArtist": { + "description": "Role description for logo artist" + }, + "aboutTranslators": "Translators", + "@aboutTranslators": { + "description": "Section for translators" + }, + "aboutSpecialThanks": "Special Thanks", + "@aboutSpecialThanks": { + "description": "Section for special thanks" + }, + "aboutLinks": "Links", + "@aboutLinks": { + "description": "Section for external links" + }, + "aboutMobileSource": "Mobile source code", + "@aboutMobileSource": { + "description": "Link to mobile GitHub repo" + }, + "aboutPCSource": "PC source code", + "@aboutPCSource": { + "description": "Link to PC GitHub repo" + }, + "aboutKeepAndroidOpen": "Keep Android Open", + "@aboutKeepAndroidOpen": { + "description": "Link to Keep Android Open campaign website" + }, + "aboutReportIssue": "Report an issue", + "@aboutReportIssue": { + "description": "Link to report bugs" + }, + "aboutReportIssueSubtitle": "Report any problems you encounter", + "@aboutReportIssueSubtitle": { + "description": "Subtitle for report issue" + }, + "aboutFeatureRequest": "Feature request", + "@aboutFeatureRequest": { + "description": "Link to suggest features" + }, + "aboutFeatureRequestSubtitle": "Suggest new features for the app", + "@aboutFeatureRequestSubtitle": { + "description": "Subtitle for feature request" + }, + "aboutTelegramChannel": "Telegram Channel", + "@aboutTelegramChannel": { + "description": "Link to Telegram channel" + }, + "aboutTelegramChannelSubtitle": "Announcements and updates", + "@aboutTelegramChannelSubtitle": { + "description": "Subtitle for Telegram channel" + }, + "aboutTelegramChat": "Telegram Community", + "@aboutTelegramChat": { + "description": "Link to Telegram chat group" + }, + "aboutTelegramChatSubtitle": "Chat with other users", + "@aboutTelegramChatSubtitle": { + "description": "Subtitle for Telegram chat" + }, + "aboutSocial": "Social", + "@aboutSocial": { + "description": "Section for social links" + }, + "aboutApp": "App", + "@aboutApp": { + "description": "Section for app info" + }, + "aboutVersion": "Version", + "@aboutVersion": { + "description": "Version info label" + }, + "aboutBinimumDesc": "The creator of QQDL & HiFi API. Without this API, Tidal downloads wouldn't exist!", + "@aboutBinimumDesc": { + "description": "Credit description for binimum" + }, + "aboutSachinsenalDesc": "The original HiFi project creator. The foundation of Tidal integration!", + "@aboutSachinsenalDesc": { + "description": "Credit description for sachinsenal0x64" + }, + "aboutSjdonadoDesc": "Creator of I Don't Have Spotify (IDHS). The fallback link resolver that saves the day!", + "@aboutSjdonadoDesc": { + "description": "Credit description for sjdonado" + }, + "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", + "@aboutAppDescription": { + "description": "App description in header card" + }, + "artistAlbums": "Albums", + "@artistAlbums": { + "description": "Section header for artist albums" + }, + "artistSingles": "Singles & EPs", + "@artistSingles": { + "description": "Section header for singles/EPs" + }, + "artistCompilations": "Compilations", + "@artistCompilations": { + "description": "Section header for compilations" + }, + "artistPopular": "Popular", + "@artistPopular": { + "description": "Section header for popular/top tracks" + }, + "artistMonthlyListeners": "{count} monthly listeners", + "@artistMonthlyListeners": { + "description": "Monthly listener count display", + "placeholders": { + "count": { + "type": "String", + "description": "Formatted listener count" + } + } + }, + "trackMetadataService": "Service", + "@trackMetadataService": { + "description": "Metadata field - download service used" + }, + "trackMetadataPlay": "Play", + "@trackMetadataPlay": { + "description": "Action button - play track" + }, + "trackMetadataShare": "Share", + "@trackMetadataShare": { + "description": "Action button - share track" + }, + "trackMetadataDelete": "Delete", + "@trackMetadataDelete": { + "description": "Action button - delete track" + }, + "setupGrantPermission": "Grant Permission", + "@setupGrantPermission": { + "description": "Button to request permission" + }, + "setupSkip": "Skip for now", + "@setupSkip": { + "description": "Skip current step button" + }, + "setupStorageAccessRequired": "Storage Access Required", + "@setupStorageAccessRequired": { + "description": "Title when storage access needed" + }, + "setupStorageAccessMessageAndroid11": "Android 11+ requires \"All files access\" permission to save files to your chosen download folder.", + "@setupStorageAccessMessageAndroid11": { + "description": "Android 11+ specific explanation" + }, + "setupOpenSettings": "Open Settings", + "@setupOpenSettings": { + "description": "Button to open system settings" + }, + "setupPermissionDeniedMessage": "Permission denied. Please grant all permissions to continue.", + "@setupPermissionDeniedMessage": { + "description": "Error when permission denied" + }, + "setupPermissionRequired": "{permissionType} Permission Required", + "@setupPermissionRequired": { + "description": "Generic permission required title", + "placeholders": { + "permissionType": { + "type": "String", + "description": "Type of permission (Storage/Notification)" + } + } + }, + "setupPermissionRequiredMessage": "{permissionType} permission is required for the best experience. You can change this later in Settings.", + "@setupPermissionRequiredMessage": { + "description": "Generic permission required message", + "placeholders": { + "permissionType": { + "type": "String" + } + } + }, + "setupUseDefaultFolder": "Use Default Folder?", + "@setupUseDefaultFolder": { + "description": "Dialog title for default folder" + }, + "setupNoFolderSelected": "No folder selected. Would you like to use the default Music folder?", + "@setupNoFolderSelected": { + "description": "Prompt when no folder selected" + }, + "setupUseDefault": "Use Default", + "@setupUseDefault": { + "description": "Button to use default folder" + }, + "setupDownloadLocationTitle": "Download Location", + "@setupDownloadLocationTitle": { + "description": "Download location dialog title" + }, + "setupDownloadLocationIosMessage": "On iOS, downloads are saved to the app's Documents folder. You can access them via the Files app.", + "@setupDownloadLocationIosMessage": { + "description": "iOS-specific folder info" + }, + "setupAppDocumentsFolder": "App Documents Folder", + "@setupAppDocumentsFolder": { + "description": "iOS documents folder option" + }, + "setupAppDocumentsFolderSubtitle": "Recommended - accessible via Files app", + "@setupAppDocumentsFolderSubtitle": { + "description": "Subtitle for documents folder" + }, + "setupChooseFromFiles": "Choose from Files", + "@setupChooseFromFiles": { + "description": "iOS file picker option" + }, + "setupChooseFromFilesSubtitle": "Select iCloud or other location", + "@setupChooseFromFilesSubtitle": { + "description": "Subtitle for file picker" + }, + "setupIosEmptyFolderWarning": "iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.", + "@setupIosEmptyFolderWarning": { + "description": "iOS folder selection warning" + }, + "setupIcloudNotSupported": "iCloud Drive is not supported. Please use the app Documents folder.", + "@setupIcloudNotSupported": { + "description": "Error when user selects iCloud Drive on iOS" + }, + "setupDownloadInFlac": "Download Spotify tracks in FLAC", + "@setupDownloadInFlac": { + "description": "App tagline in setup" + }, + "setupStorageGranted": "Storage Permission Granted!", + "@setupStorageGranted": { + "description": "Success message for storage permission" + }, + "setupStorageRequired": "Storage Permission Required", + "@setupStorageRequired": { + "description": "Title when storage permission needed" + }, + "setupStorageDescription": "SpotiFLAC needs storage permission to save your downloaded music files.", + "@setupStorageDescription": { + "description": "Explanation for storage permission" + }, + "setupNotificationGranted": "تم منح إذن الإشعارات!", + "@setupNotificationGranted": { + "description": "Success message for notification permission" + }, + "setupNotificationEnable": "Enable Notifications", + "@setupNotificationEnable": { + "description": "Button to enable notifications" + }, + "setupFolderChoose": "Choose Download Folder", + "@setupFolderChoose": { + "description": "Button to choose folder" + }, + "setupFolderDescription": "Select a folder where your downloaded music will be saved.", + "@setupFolderDescription": { + "description": "Explanation for folder selection" + }, + "setupSelectFolder": "Select Folder", + "@setupSelectFolder": { + "description": "Button to select folder" + }, + "setupEnableNotifications": "Enable Notifications", + "@setupEnableNotifications": { + "description": "Button to enable notifications" + }, + "setupNotificationBackgroundDescription": "Get notified about download progress and completion. This helps you track downloads when the app is in background.", + "@setupNotificationBackgroundDescription": { + "description": "Detailed notification explanation" + }, + "setupSkipForNow": "Skip for now", + "@setupSkipForNow": { + "description": "Skip button text" + }, + "setupNext": "Next", + "@setupNext": { + "description": "Next button text" + }, + "setupGetStarted": "Get Started", + "@setupGetStarted": { + "description": "Final setup button" + }, + "setupAllowAccessToManageFiles": "Please enable \"Allow access to manage all files\" in the next screen.", + "@setupAllowAccessToManageFiles": { + "description": "Instruction for file access permission" + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "dialogCancel": "Cancel", + "@dialogCancel": { + "description": "Dialog button - cancel action" + }, + "dialogSave": "Save", + "@dialogSave": { + "description": "Dialog button - save changes" + }, + "dialogDelete": "Delete", + "@dialogDelete": { + "description": "Dialog button - delete item" + }, + "dialogRetry": "Retry", + "@dialogRetry": { + "description": "Dialog button - retry action" + }, + "dialogClear": "Clear", + "@dialogClear": { + "description": "Dialog button - clear items" + }, + "dialogDone": "Done", + "@dialogDone": { + "description": "Dialog button - action completed" + }, + "dialogImport": "Import", + "@dialogImport": { + "description": "Dialog button - import data" + }, + "dialogDownload": "Download", + "@dialogDownload": { + "description": "Confirm button in Download All dialog" + }, + "dialogDiscard": "Discard", + "@dialogDiscard": { + "description": "Dialog button - discard changes" + }, + "dialogRemove": "Remove", + "@dialogRemove": { + "description": "Dialog button - remove item" + }, + "dialogUninstall": "Uninstall", + "@dialogUninstall": { + "description": "Dialog button - uninstall extension" + }, + "dialogDiscardChanges": "Discard Changes?", + "@dialogDiscardChanges": { + "description": "Dialog title - unsaved changes warning" + }, + "dialogUnsavedChanges": "You have unsaved changes. Do you want to discard them?", + "@dialogUnsavedChanges": { + "description": "Dialog message - unsaved changes" + }, + "dialogClearAll": "Clear All", + "@dialogClearAll": { + "description": "Dialog title - clear all items" + }, + "dialogRemoveExtension": "Remove Extension", + "@dialogRemoveExtension": { + "description": "Dialog title - uninstall extension" + }, + "dialogRemoveExtensionMessage": "Are you sure you want to remove this extension? This cannot be undone.", + "@dialogRemoveExtensionMessage": { + "description": "Dialog message - uninstall confirmation" + }, + "dialogUninstallExtension": "Uninstall Extension?", + "@dialogUninstallExtension": { + "description": "Dialog title - uninstall extension" + }, + "dialogUninstallExtensionMessage": "Are you sure you want to remove {extensionName}?", + "@dialogUninstallExtensionMessage": { + "description": "Dialog message - uninstall specific extension", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "dialogClearHistoryTitle": "Clear History", + "@dialogClearHistoryTitle": { + "description": "Dialog title - clear download history" + }, + "dialogClearHistoryMessage": "Are you sure you want to clear all download history? This cannot be undone.", + "@dialogClearHistoryMessage": { + "description": "Dialog message - clear history confirmation" + }, + "dialogDeleteSelectedTitle": "Delete Selected", + "@dialogDeleteSelectedTitle": { + "description": "Dialog title - delete selected items" + }, + "dialogDeleteSelectedMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from history?\n\nThis will also delete the files from storage.", + "@dialogDeleteSelectedMessage": { + "description": "Dialog message - delete selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dialogImportPlaylistTitle": "Import Playlist", + "@dialogImportPlaylistTitle": { + "description": "Dialog title - import CSV playlist" + }, + "dialogImportPlaylistMessage": "Found {count} tracks in CSV. Add them to download queue?", + "csvImportTracks": "{count} tracks from CSV", + "@csvImportTracks": { + "description": "Label shown in quality picker for CSV import", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@dialogImportPlaylistMessage": { + "description": "Dialog message - import playlist confirmation", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAddedToQueue": "Added \"{trackName}\" to queue", + "@snackbarAddedToQueue": { + "description": "Snackbar - track added to download queue", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarAddedTracksToQueue": "Added {count} tracks to queue", + "@snackbarAddedTracksToQueue": { + "description": "Snackbar - multiple tracks added to queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAlreadyDownloaded": "\"{trackName}\" already downloaded", + "@snackbarAlreadyDownloaded": { + "description": "Snackbar - track already exists", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarAlreadyInLibrary": "\"{trackName}\" already exists in your library", + "@snackbarAlreadyInLibrary": { + "description": "Snackbar - track already exists in local library", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarHistoryCleared": "History cleared", + "@snackbarHistoryCleared": { + "description": "Snackbar - history deleted" + }, + "snackbarCredentialsSaved": "Credentials saved", + "@snackbarCredentialsSaved": { + "description": "Snackbar - Spotify credentials saved" + }, + "snackbarCredentialsCleared": "Credentials cleared", + "@snackbarCredentialsCleared": { + "description": "Snackbar - Spotify credentials removed" + }, + "snackbarDeletedTracks": "Deleted {count} {count, plural, =1{track} other{tracks}}", + "@snackbarDeletedTracks": { + "description": "Snackbar - tracks deleted", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarCannotOpenFile": "Cannot open file: {error}", + "@snackbarCannotOpenFile": { + "description": "Snackbar - file open error", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "snackbarFillAllFields": "Please fill all fields", + "@snackbarFillAllFields": { + "description": "Snackbar - validation error" + }, + "snackbarViewQueue": "View Queue", + "@snackbarViewQueue": { + "description": "Snackbar action - view download queue" + }, + "snackbarUrlCopied": "{platform} URL copied to clipboard", + "@snackbarUrlCopied": { + "description": "Snackbar - URL copied", + "placeholders": { + "platform": { + "type": "String", + "description": "Platform name (Spotify/Deezer)" + } + } + }, + "snackbarFileNotFound": "File not found", + "@snackbarFileNotFound": { + "description": "Snackbar - file doesn't exist" + }, + "snackbarSelectExtFile": "Please select a .spotiflac-ext file", + "@snackbarSelectExtFile": { + "description": "Snackbar - wrong file type selected" + }, + "snackbarProviderPrioritySaved": "Provider priority saved", + "@snackbarProviderPrioritySaved": { + "description": "Snackbar - provider order saved" + }, + "snackbarMetadataProviderSaved": "Metadata provider priority saved", + "@snackbarMetadataProviderSaved": { + "description": "Snackbar - metadata provider order saved" + }, + "snackbarExtensionInstalled": "{extensionName} installed.", + "@snackbarExtensionInstalled": { + "description": "Snackbar - extension installed successfully", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarExtensionUpdated": "{extensionName} updated.", + "@snackbarExtensionUpdated": { + "description": "Snackbar - extension updated successfully", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarFailedToInstall": "Failed to install extension", + "@snackbarFailedToInstall": { + "description": "Snackbar - extension install error" + }, + "snackbarFailedToUpdate": "Failed to update extension", + "@snackbarFailedToUpdate": { + "description": "Snackbar - extension update error" + }, + "errorRateLimited": "Rate Limited", + "@errorRateLimited": { + "description": "Error title - too many requests" + }, + "errorRateLimitedMessage": "Too many requests. Please wait a moment before searching again.", + "@errorRateLimitedMessage": { + "description": "Error message - rate limit explanation" + }, + "errorNoTracksFound": "No tracks found", + "@errorNoTracksFound": { + "description": "Error - search returned no results" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "errorUrlNotRecognized": "Link not recognized", + "@errorUrlNotRecognized": { + "description": "Error title - URL not handled by any extension or service" + }, + "errorUrlNotRecognizedMessage": "This link is not supported. Make sure the URL is correct and a compatible extension is installed.", + "@errorUrlNotRecognizedMessage": { + "description": "Error message - URL not recognized explanation" + }, + "errorUrlFetchFailed": "Failed to load content from this link. Please try again.", + "@errorUrlFetchFailed": { + "description": "Error message - generic URL fetch failure" + }, + "errorMissingExtensionSource": "Cannot load {item}: missing extension source", + "@errorMissingExtensionSource": { + "description": "Error - extension source not available", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "actionPause": "Pause", + "@actionPause": { + "description": "Action button - pause download" + }, + "actionResume": "Resume", + "@actionResume": { + "description": "Action button - resume download" + }, + "actionCancel": "Cancel", + "@actionCancel": { + "description": "Action button - cancel operation" + }, + "actionSelectAll": "Select All", + "@actionSelectAll": { + "description": "Action button - select all items" + }, + "actionDeselect": "Deselect", + "@actionDeselect": { + "description": "Action button - deselect all" + }, + "actionRemoveCredentials": "Remove Credentials", + "@actionRemoveCredentials": { + "description": "Action button - delete Spotify credentials" + }, + "actionSaveCredentials": "Save Credentials", + "@actionSaveCredentials": { + "description": "Action button - save Spotify credentials" + }, + "selectionSelected": "{count} selected", + "@selectionSelected": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionAllSelected": "All tracks selected", + "@selectionAllSelected": { + "description": "Status - all items selected" + }, + "selectionSelectToDelete": "Select tracks to delete", + "@selectionSelectToDelete": { + "description": "Placeholder when nothing selected" + }, + "progressFetchingMetadata": "Fetching metadata... {current}/{total}", + "@progressFetchingMetadata": { + "description": "Progress indicator - loading track info", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "progressReadingCsv": "Reading CSV...", + "@progressReadingCsv": { + "description": "Progress indicator - parsing CSV file" + }, + "searchSongs": "Songs", + "@searchSongs": { + "description": "Search result category - songs" + }, + "searchArtists": "Artists", + "@searchArtists": { + "description": "Search result category - artists" + }, + "searchAlbums": "Albums", + "@searchAlbums": { + "description": "Search result category - albums" + }, + "searchPlaylists": "Playlists", + "@searchPlaylists": { + "description": "Search result category - playlists" + }, + "searchSortTitle": "Sort Results", + "@searchSortTitle": { + "description": "Bottom sheet title for search sort options" + }, + "searchSortDefault": "Default", + "@searchSortDefault": { + "description": "Sort option - default API order" + }, + "searchSortTitleAZ": "Title (A-Z)", + "@searchSortTitleAZ": { + "description": "Sort option - title ascending" + }, + "searchSortTitleZA": "Title (Z-A)", + "@searchSortTitleZA": { + "description": "Sort option - title descending" + }, + "searchSortArtistAZ": "Artist (A-Z)", + "@searchSortArtistAZ": { + "description": "Sort option - artist ascending" + }, + "searchSortArtistZA": "Artist (Z-A)", + "@searchSortArtistZA": { + "description": "Sort option - artist descending" + }, + "searchSortDurationShort": "Duration (Shortest)", + "@searchSortDurationShort": { + "description": "Sort option - shortest duration first" + }, + "searchSortDurationLong": "Duration (Longest)", + "@searchSortDurationLong": { + "description": "Sort option - longest duration first" + }, + "searchSortDateOldest": "Release Date (Oldest)", + "@searchSortDateOldest": { + "description": "Sort option - oldest release first" + }, + "searchSortDateNewest": "Release Date (Newest)", + "@searchSortDateNewest": { + "description": "Sort option - newest release first" + }, + "tooltipPlay": "Play", + "@tooltipPlay": { + "description": "Tooltip - play button" + }, + "filenameFormat": "Filename Format", + "@filenameFormat": { + "description": "Setting title - filename pattern" + }, + "filenameShowAdvancedTags": "Show advanced tags", + "@filenameShowAdvancedTags": { + "description": "Toggle label for showing advanced filename tags" + }, + "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", + "@filenameShowAdvancedTagsDescription": { + "description": "Description for advanced filename tag toggle" + }, + "folderOrganizationNone": "No organization", + "@folderOrganizationNone": { + "description": "Folder option - flat structure" + }, + "folderOrganizationByPlaylist": "By Playlist", + "@folderOrganizationByPlaylist": { + "description": "Folder option - playlist folders" + }, + "folderOrganizationByPlaylistSubtitle": "Separate folder for each playlist", + "@folderOrganizationByPlaylistSubtitle": { + "description": "Subtitle for playlist folder option" + }, + "folderOrganizationByArtist": "By Artist", + "@folderOrganizationByArtist": { + "description": "Folder option - artist folders" + }, + "folderOrganizationByAlbum": "By Album", + "@folderOrganizationByAlbum": { + "description": "Folder option - album folders" + }, + "folderOrganizationByArtistAlbum": "Artist/Album", + "@folderOrganizationByArtistAlbum": { + "description": "Folder option - nested folders" + }, + "folderOrganizationDescription": "Organize downloaded files into folders", + "@folderOrganizationDescription": { + "description": "Folder organization sheet description" + }, + "folderOrganizationNoneSubtitle": "All files in download folder", + "@folderOrganizationNoneSubtitle": { + "description": "Subtitle for no organization option" + }, + "folderOrganizationByArtistSubtitle": "Separate folder for each artist", + "@folderOrganizationByArtistSubtitle": { + "description": "Subtitle for artist folder option" + }, + "folderOrganizationByAlbumSubtitle": "Separate folder for each album", + "@folderOrganizationByAlbumSubtitle": { + "description": "Subtitle for album folder option" + }, + "folderOrganizationByArtistAlbumSubtitle": "Nested folders for artist and album", + "@folderOrganizationByArtistAlbumSubtitle": { + "description": "Subtitle for nested folder option" + }, + "updateAvailable": "Update Available", + "@updateAvailable": { + "description": "Update dialog title" + }, + "updateLater": "Later", + "@updateLater": { + "description": "Update button - dismiss" + }, + "updateStartingDownload": "Starting download...", + "@updateStartingDownload": { + "description": "Update status - initializing" + }, + "updateDownloadFailed": "Download failed", + "@updateDownloadFailed": { + "description": "Update error title" + }, + "updateFailedMessage": "Failed to download update", + "@updateFailedMessage": { + "description": "Update error message" + }, + "updateNewVersionReady": "A new version is ready", + "@updateNewVersionReady": { + "description": "Update subtitle" + }, + "updateCurrent": "Current", + "@updateCurrent": { + "description": "Label for current version" + }, + "updateNew": "New", + "@updateNew": { + "description": "Label for new version" + }, + "updateDownloading": "Downloading...", + "@updateDownloading": { + "description": "Update status - downloading" + }, + "updateWhatsNew": "What's New", + "@updateWhatsNew": { + "description": "Changelog section title" + }, + "updateDownloadInstall": "Download & Install", + "@updateDownloadInstall": { + "description": "Update button - download and install" + }, + "updateDontRemind": "Don't remind", + "@updateDontRemind": { + "description": "Update button - skip this version" + }, + "providerPriorityTitle": "Provider Priority", + "@providerPriorityTitle": { + "description": "Provider priority page title" + }, + "providerPriorityDescription": "Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.", + "@providerPriorityDescription": { + "description": "Provider priority page description" + }, + "providerPriorityInfo": "If a track is not available on the first provider, the app will automatically try the next one.", + "@providerPriorityInfo": { + "description": "Info tip about fallback behavior" + }, + "providerPriorityFallbackExtensionsTitle": "Extension Fallback", + "@providerPriorityFallbackExtensionsTitle": { + "description": "Section title for choosing which download extensions can be used as fallback providers" + }, + "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", + "@providerPriorityFallbackExtensionsDescription": { + "description": "Section description for extension fallback selection" + }, + "providerPriorityFallbackExtensionsHint": "Only enabled extensions with download-provider capability are listed here.", + "@providerPriorityFallbackExtensionsHint": { + "description": "Hint below the extension fallback selection list" + }, + "providerBuiltIn": "Built-in", + "@providerBuiltIn": { + "description": "Label for built-in providers (Tidal/Qobuz)" + }, + "providerExtension": "Extension", + "@providerExtension": { + "description": "Label for extension-provided providers" + }, + "metadataProviderPriorityTitle": "Metadata Priority", + "@metadataProviderPriorityTitle": { + "description": "Metadata priority page title" + }, + "metadataProviderPriorityDescription": "Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.", + "@metadataProviderPriorityDescription": { + "description": "Metadata priority page description" + }, + "metadataProviderPriorityInfo": "Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.", + "@metadataProviderPriorityInfo": { + "description": "Info tip about rate limits" + }, + "metadataNoRateLimits": "No rate limits", + "@metadataNoRateLimits": { + "description": "Deezer provider description" + }, + "metadataMayRateLimit": "May rate limit", + "@metadataMayRateLimit": { + "description": "Spotify provider description" + }, + "logTitle": "Logs", + "@logTitle": { + "description": "Logs screen title" + }, + "logCopied": "Logs copied to clipboard", + "@logCopied": { + "description": "Snackbar - logs copied" + }, + "logSearchHint": "Search logs...", + "@logSearchHint": { + "description": "Log search placeholder" + }, + "logFilterLevel": "Level", + "@logFilterLevel": { + "description": "Filter by log level" + }, + "logFilterSection": "Filter", + "@logFilterSection": { + "description": "Filter section title" + }, + "logShareLogs": "Share logs", + "@logShareLogs": { + "description": "Share button tooltip" + }, + "logClearLogs": "Clear logs", + "@logClearLogs": { + "description": "Clear button tooltip" + }, + "logClearLogsTitle": "Clear Logs", + "@logClearLogsTitle": { + "description": "Clear logs dialog title" + }, + "logClearLogsMessage": "Are you sure you want to clear all logs?", + "@logClearLogsMessage": { + "description": "Clear logs confirmation message" + }, + "logFilterBySeverity": "Filter logs by severity", + "@logFilterBySeverity": { + "description": "Filter dialog title" + }, + "logNoLogsYet": "No logs yet", + "@logNoLogsYet": { + "description": "Empty state title" + }, + "logNoLogsYetSubtitle": "Logs will appear here as you use the app", + "@logNoLogsYetSubtitle": { + "description": "Empty state subtitle" + }, + "logEntriesFiltered": "Entries ({count} filtered)", + "@logEntriesFiltered": { + "description": "Log count with filter active", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logEntries": "Entries ({count})", + "@logEntries": { + "description": "Total log count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "credentialsTitle": "Spotify Credentials", + "@credentialsTitle": { + "description": "Credentials dialog title" + }, + "credentialsDescription": "Enter your Client ID and Secret to use your own Spotify application quota.", + "@credentialsDescription": { + "description": "Credentials dialog explanation" + }, + "credentialsClientId": "Client ID", + "@credentialsClientId": { + "description": "Client ID field label - DO NOT TRANSLATE" + }, + "credentialsClientIdHint": "Paste Client ID", + "@credentialsClientIdHint": { + "description": "Client ID placeholder" + }, + "credentialsClientSecret": "Client Secret", + "@credentialsClientSecret": { + "description": "Client Secret field label - DO NOT TRANSLATE" + }, + "credentialsClientSecretHint": "Paste Client Secret", + "@credentialsClientSecretHint": { + "description": "Client Secret placeholder" + }, + "channelStable": "Stable", + "@channelStable": { + "description": "Update channel - stable releases" + }, + "channelPreview": "Preview", + "@channelPreview": { + "description": "Update channel - beta/preview releases" + }, + "sectionSearchSource": "Search Source", + "@sectionSearchSource": { + "description": "Settings section header" + }, + "sectionDownload": "Download", + "@sectionDownload": { + "description": "Settings section header" + }, + "sectionPerformance": "Performance", + "@sectionPerformance": { + "description": "Settings section header" + }, + "sectionApp": "App", + "@sectionApp": { + "description": "Settings section header" + }, + "sectionData": "Data", + "@sectionData": { + "description": "Settings section header" + }, + "sectionDebug": "Debug", + "@sectionDebug": { + "description": "Settings section header" + }, + "sectionService": "Service", + "@sectionService": { + "description": "Settings section header" + }, + "sectionAudioQuality": "Audio Quality", + "@sectionAudioQuality": { + "description": "Settings section header" + }, + "sectionFileSettings": "File Settings", + "@sectionFileSettings": { + "description": "Settings section header" + }, + "sectionLyrics": "Lyrics", + "@sectionLyrics": { + "description": "Settings section header" + }, + "lyricsMode": "Lyrics Mode", + "@lyricsMode": { + "description": "Setting - how to save lyrics" + }, + "lyricsModeDescription": "Choose how lyrics are saved with your downloads", + "@lyricsModeDescription": { + "description": "Lyrics mode picker description" + }, + "lyricsModeEmbed": "Embed in file", + "@lyricsModeEmbed": { + "description": "Lyrics mode option - embed in audio file" + }, + "lyricsModeEmbedSubtitle": "Lyrics stored inside FLAC metadata", + "@lyricsModeEmbedSubtitle": { + "description": "Subtitle for embed option" + }, + "lyricsModeExternal": "External .lrc file", + "@lyricsModeExternal": { + "description": "Lyrics mode option - separate LRC file" + }, + "lyricsModeExternalSubtitle": "Separate .lrc file for players like Samsung Music", + "@lyricsModeExternalSubtitle": { + "description": "Subtitle for external option" + }, + "lyricsModeBoth": "Both", + "@lyricsModeBoth": { + "description": "Lyrics mode option - embed and external" + }, + "lyricsModeBothSubtitle": "Embed and save .lrc file", + "@lyricsModeBothSubtitle": { + "description": "Subtitle for both option" + }, + "sectionColor": "Color", + "@sectionColor": { + "description": "Settings section header" + }, + "sectionTheme": "Theme", + "@sectionTheme": { + "description": "Settings section header" + }, + "sectionLayout": "Layout", + "@sectionLayout": { + "description": "Settings section header" + }, + "sectionLanguage": "Language", + "@sectionLanguage": { + "description": "Settings section header for language" + }, + "appearanceLanguage": "App Language", + "@appearanceLanguage": { + "description": "Language setting title" + }, + "settingsAppearanceSubtitle": "Theme, colors, display", + "@settingsAppearanceSubtitle": { + "description": "Appearance settings description" + }, + "settingsDownloadSubtitle": "Service, quality, fallback", + "@settingsDownloadSubtitle": { + "description": "Download settings description" + }, + "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", + "@settingsOptionsSubtitle": { + "description": "Options settings description" + }, + "settingsExtensionsSubtitle": "Manage download providers", + "@settingsExtensionsSubtitle": { + "description": "Extensions settings description" + }, + "settingsLogsSubtitle": "View app logs for debugging", + "@settingsLogsSubtitle": { + "description": "Logs settings description" + }, + "loadingSharedLink": "Loading shared link...", + "@loadingSharedLink": { + "description": "Status when opening shared URL" + }, + "pressBackAgainToExit": "Press back again to exit", + "@pressBackAgainToExit": { + "description": "Exit confirmation message" + }, + "downloadAllCount": "Download All ({count})", + "@downloadAllCount": { + "description": "Download all button with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tracksCount": "{count, plural, =1{1 track} other{{count} tracks}}", + "@tracksCount": { + "description": "Track count display", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackCopyFilePath": "Copy file path", + "@trackCopyFilePath": { + "description": "Action - copy file path" + }, + "trackRemoveFromDevice": "Remove from device", + "@trackRemoveFromDevice": { + "description": "Action - delete downloaded file" + }, + "trackLoadLyrics": "Load Lyrics", + "@trackLoadLyrics": { + "description": "Action - fetch lyrics" + }, + "trackMetadata": "Metadata", + "@trackMetadata": { + "description": "Tab title - track metadata" + }, + "trackFileInfo": "File Info", + "@trackFileInfo": { + "description": "Tab title - file information" + }, + "trackLyrics": "Lyrics", + "@trackLyrics": { + "description": "Tab title - lyrics" + }, + "trackFileNotFound": "File not found", + "@trackFileNotFound": { + "description": "Error - file doesn't exist" + }, + "trackOpenInDeezer": "Open in Deezer", + "@trackOpenInDeezer": { + "description": "Action - open track in Deezer app" + }, + "trackOpenInSpotify": "Open in Spotify", + "@trackOpenInSpotify": { + "description": "Action - open track in Spotify app" + }, + "trackTrackName": "Track name", + "@trackTrackName": { + "description": "Metadata label - track title" + }, + "trackArtist": "Artist", + "@trackArtist": { + "description": "Metadata label - artist name" + }, + "trackAlbumArtist": "Album artist", + "@trackAlbumArtist": { + "description": "Metadata label - album artist" + }, + "trackAlbum": "Album", + "@trackAlbum": { + "description": "Metadata label - album name" + }, + "trackTrackNumber": "Track number", + "@trackTrackNumber": { + "description": "Metadata label - track number" + }, + "trackDiscNumber": "Disc number", + "@trackDiscNumber": { + "description": "Metadata label - disc number" + }, + "trackDuration": "Duration", + "@trackDuration": { + "description": "Metadata label - track length" + }, + "trackAudioQuality": "Audio quality", + "@trackAudioQuality": { + "description": "Metadata label - audio quality" + }, + "trackReleaseDate": "Release date", + "@trackReleaseDate": { + "description": "Metadata label - release date" + }, + "trackGenre": "Genre", + "@trackGenre": { + "description": "Metadata label - music genre" + }, + "trackLabel": "Label", + "@trackLabel": { + "description": "Metadata label - record label" + }, + "trackCopyright": "Copyright", + "@trackCopyright": { + "description": "Metadata label - copyright information" + }, + "trackDownloaded": "Downloaded", + "@trackDownloaded": { + "description": "Metadata label - download date" + }, + "trackCopyLyrics": "Copy lyrics", + "@trackCopyLyrics": { + "description": "Action - copy lyrics to clipboard" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "trackLyricsNotAvailable": "Lyrics not available for this track", + "@trackLyricsNotAvailable": { + "description": "Message when lyrics not found" + }, + "trackLyricsNotInFile": "No lyrics found in this file", + "@trackLyricsNotInFile": { + "description": "Message when no embedded lyrics in audio file" + }, + "trackFetchOnlineLyrics": "Fetch from Online", + "@trackFetchOnlineLyrics": { + "description": "Action - fetch lyrics from online providers" + }, + "trackLyricsTimeout": "Request timed out. Try again later.", + "@trackLyricsTimeout": { + "description": "Message when lyrics request times out" + }, + "trackLyricsLoadFailed": "Failed to load lyrics", + "@trackLyricsLoadFailed": { + "description": "Message when lyrics loading fails" + }, + "trackEmbedLyrics": "Embed Lyrics", + "@trackEmbedLyrics": { + "description": "Action - embed lyrics into audio file" + }, + "trackLyricsEmbedded": "Lyrics embedded successfully", + "@trackLyricsEmbedded": { + "description": "Snackbar - lyrics saved to file" + }, + "trackInstrumental": "Instrumental track", + "@trackInstrumental": { + "description": "Message when track is instrumental (no lyrics)" + }, + "trackCopiedToClipboard": "Copied to clipboard", + "@trackCopiedToClipboard": { + "description": "Snackbar - content copied" + }, + "trackDeleteConfirmTitle": "Remove from device?", + "@trackDeleteConfirmTitle": { + "description": "Delete confirmation title" + }, + "trackDeleteConfirmMessage": "This will permanently delete the downloaded file and remove it from your history.", + "@trackDeleteConfirmMessage": { + "description": "Delete confirmation message" + }, + "dateToday": "Today", + "@dateToday": { + "description": "Relative date - today" + }, + "dateYesterday": "Yesterday", + "@dateYesterday": { + "description": "Relative date - yesterday" + }, + "dateDaysAgo": "{count} days ago", + "@dateDaysAgo": { + "description": "Relative date - days ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dateWeeksAgo": "{count} weeks ago", + "@dateWeeksAgo": { + "description": "Relative date - weeks ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dateMonthsAgo": "{count} months ago", + "@dateMonthsAgo": { + "description": "Relative date - months ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeFilterAll": "All", + "@storeFilterAll": { + "description": "Store filter - all extensions" + }, + "storeFilterMetadata": "Metadata", + "@storeFilterMetadata": { + "description": "Store filter - metadata providers" + }, + "storeFilterDownload": "Download", + "@storeFilterDownload": { + "description": "Store filter - download providers" + }, + "storeFilterUtility": "Utility", + "@storeFilterUtility": { + "description": "Store filter - utility extensions" + }, + "storeFilterLyrics": "Lyrics", + "@storeFilterLyrics": { + "description": "Store filter - lyrics providers" + }, + "storeFilterIntegration": "Integration", + "@storeFilterIntegration": { + "description": "Store filter - integrations" + }, + "storeClearFilters": "Clear filters", + "@storeClearFilters": { + "description": "Button to clear all filters" + }, + "storeAddRepoTitle": "Add Extension Repository", + "@storeAddRepoTitle": { + "description": "Store setup screen - heading when no repo is configured" + }, + "storeAddRepoDescription": "Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.", + "@storeAddRepoDescription": { + "description": "Store setup screen - explanatory text" + }, + "storeRepoUrlLabel": "Repository URL", + "@storeRepoUrlLabel": { + "description": "Label for the repository URL input field" + }, + "storeRepoUrlHint": "https://github.com/user/repo", + "@storeRepoUrlHint": { + "description": "Hint/placeholder for the repository URL input field" + }, + "storeRepoUrlHelper": "e.g. https://github.com/user/extensions-repo", + "@storeRepoUrlHelper": { + "description": "Helper text below the repository URL input field" + }, + "storeAddRepoButton": "Add Repository", + "@storeAddRepoButton": { + "description": "Button to submit a new repository URL" + }, + "storeChangeRepoTooltip": "Change repository", + "@storeChangeRepoTooltip": { + "description": "Tooltip for the change-repository icon button in the app bar" + }, + "storeRepoDialogTitle": "Extension Repository", + "@storeRepoDialogTitle": { + "description": "Title of the change/remove repository dialog" + }, + "storeRepoDialogCurrent": "Current repository:", + "@storeRepoDialogCurrent": { + "description": "Label shown above the current repository URL in the dialog" + }, + "storeNewRepoUrlLabel": "New Repository URL", + "@storeNewRepoUrlLabel": { + "description": "Label for the new repository URL field inside the dialog" + }, + "storeLoadError": "Failed to load repository", + "@storeLoadError": { + "description": "Error heading when the store cannot be loaded" + }, + "storeEmptyNoExtensions": "No extensions available", + "@storeEmptyNoExtensions": { + "description": "Message when store has no extensions" + }, + "storeEmptyNoResults": "No extensions found", + "@storeEmptyNoResults": { + "description": "Message when search/filter returns no results" + }, + "extensionDefaultProvider": "Default (Deezer)", + "@extensionDefaultProvider": { + "description": "Default search provider option" + }, + "extensionDefaultProviderSubtitle": "Use built-in search", + "@extensionDefaultProviderSubtitle": { + "description": "Subtitle for default provider" + }, + "extensionAuthor": "Author", + "@extensionAuthor": { + "description": "Extension detail - author" + }, + "extensionId": "ID", + "@extensionId": { + "description": "Extension detail - unique ID" + }, + "extensionError": "Error", + "@extensionError": { + "description": "Extension detail - error message" + }, + "extensionCapabilities": "Capabilities", + "@extensionCapabilities": { + "description": "Section header - extension features" + }, + "extensionMetadataProvider": "Metadata Provider", + "@extensionMetadataProvider": { + "description": "Capability - provides metadata" + }, + "extensionDownloadProvider": "Download Provider", + "@extensionDownloadProvider": { + "description": "Capability - provides downloads" + }, + "extensionLyricsProvider": "Lyrics Provider", + "@extensionLyricsProvider": { + "description": "Capability - provides lyrics" + }, + "extensionUrlHandler": "URL Handler", + "@extensionUrlHandler": { + "description": "Capability - handles URLs" + }, + "extensionQualityOptions": "Quality Options", + "@extensionQualityOptions": { + "description": "Capability - quality selection" + }, + "extensionPostProcessingHooks": "Post-Processing Hooks", + "@extensionPostProcessingHooks": { + "description": "Capability - post-processing" + }, + "extensionPermissions": "Permissions", + "@extensionPermissions": { + "description": "Section header - required permissions" + }, + "extensionSettings": "Settings", + "@extensionSettings": { + "description": "Section header - extension settings" + }, + "extensionRemoveButton": "Remove Extension", + "@extensionRemoveButton": { + "description": "Button to uninstall extension" + }, + "extensionUpdated": "Updated", + "@extensionUpdated": { + "description": "Extension detail - last update" + }, + "extensionMinAppVersion": "Min App Version", + "@extensionMinAppVersion": { + "description": "Extension detail - minimum app version" + }, + "extensionCustomTrackMatching": "Custom Track Matching", + "@extensionCustomTrackMatching": { + "description": "Capability - custom track matching algorithm" + }, + "extensionPostProcessing": "Post-Processing", + "@extensionPostProcessing": { + "description": "Capability - post-download processing" + }, + "extensionHooksAvailable": "{count} hook(s) available", + "@extensionHooksAvailable": { + "description": "Post-processing hooks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionPatternsCount": "{count} pattern(s)", + "@extensionPatternsCount": { + "description": "URL patterns count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionStrategy": "Strategy: {strategy}", + "@extensionStrategy": { + "description": "Track matching strategy name", + "placeholders": { + "strategy": { + "type": "String" + } + } + }, + "extensionsProviderPrioritySection": "Provider Priority", + "@extensionsProviderPrioritySection": { + "description": "Section header - provider priority" + }, + "extensionsInstalledSection": "Installed Extensions", + "@extensionsInstalledSection": { + "description": "Section header - installed extensions" + }, + "extensionsNoExtensions": "No extensions installed", + "@extensionsNoExtensions": { + "description": "Empty state - no extensions" + }, + "extensionsNoExtensionsSubtitle": "Install .spotiflac-ext files to add new providers", + "@extensionsNoExtensionsSubtitle": { + "description": "Empty state subtitle" + }, + "extensionsInstallButton": "Install Extension", + "@extensionsInstallButton": { + "description": "Button to install extension from file" + }, + "extensionsInfoTip": "Extensions can add new metadata and download providers. Only install extensions from trusted sources.", + "@extensionsInfoTip": { + "description": "Security warning about extensions" + }, + "extensionsInstalledSuccess": "Extension installed successfully", + "@extensionsInstalledSuccess": { + "description": "Success message after install" + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "extensionsDownloadPriority": "Download Priority", + "@extensionsDownloadPriority": { + "description": "Setting - download provider order" + }, + "extensionsDownloadPrioritySubtitle": "Set download service order", + "@extensionsDownloadPrioritySubtitle": { + "description": "Subtitle for download priority" + }, + "extensionsFallbackTitle": "Fallback Extensions", + "@extensionsFallbackTitle": { + "description": "Setting and page title for choosing which download extensions can be used during fallback" + }, + "extensionsFallbackSubtitle": "Choose which installed download extensions can be used as fallback", + "@extensionsFallbackSubtitle": { + "description": "Subtitle for download fallback extensions menu" + }, + "extensionsNoDownloadProvider": "No extensions with download provider", + "@extensionsNoDownloadProvider": { + "description": "Empty state - no download providers" + }, + "extensionsMetadataPriority": "Metadata Priority", + "@extensionsMetadataPriority": { + "description": "Setting - metadata provider order" + }, + "extensionsMetadataPrioritySubtitle": "Set search & metadata source order", + "@extensionsMetadataPrioritySubtitle": { + "description": "Subtitle for metadata priority" + }, + "extensionsNoMetadataProvider": "No extensions with metadata provider", + "@extensionsNoMetadataProvider": { + "description": "Empty state - no metadata providers" + }, + "extensionsSearchProvider": "Search Provider", + "@extensionsSearchProvider": { + "description": "Setting - search provider selection" + }, + "extensionsNoCustomSearch": "No extensions with custom search", + "@extensionsNoCustomSearch": { + "description": "Empty state - no search providers" + }, + "extensionsSearchProviderDescription": "Choose which service to use for searching tracks", + "@extensionsSearchProviderDescription": { + "description": "Search provider setting description" + }, + "extensionsCustomSearch": "Custom search", + "@extensionsCustomSearch": { + "description": "Label for custom search provider" + }, + "extensionsErrorLoading": "Error loading extension", + "@extensionsErrorLoading": { + "description": "Error message when extension fails to load" + }, + "qualityFlacLossless": "FLAC Lossless", + "@qualityFlacLossless": { + "description": "Quality option - CD quality FLAC" + }, + "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", + "@qualityFlacLosslessSubtitle": { + "description": "Technical spec for lossless" + }, + "qualityHiResFlac": "Hi-Res FLAC", + "@qualityHiResFlac": { + "description": "Quality option - high resolution FLAC" + }, + "qualityHiResFlacSubtitle": "24-bit / up to 96kHz", + "@qualityHiResFlacSubtitle": { + "description": "Technical spec for hi-res" + }, + "qualityHiResFlacMax": "Hi-Res FLAC Max", + "@qualityHiResFlacMax": { + "description": "Quality option - maximum resolution FLAC" + }, + "qualityHiResFlacMaxSubtitle": "24-bit / up to 192kHz", + "@qualityHiResFlacMaxSubtitle": { + "description": "Technical spec for hi-res max" + }, + "downloadLossy320": "Lossy 320kbps", + "@downloadLossy320": { + "description": "Quality option label for Tidal lossy 320kbps" + }, + "downloadLossyFormat": "Lossy Format", + "@downloadLossyFormat": { + "description": "Setting title to pick output format for Tidal lossy downloads" + }, + "downloadLossy320Format": "Lossy 320kbps Format", + "@downloadLossy320Format": { + "description": "Title of the Tidal lossy format picker bottom sheet" + }, + "downloadLossy320FormatDesc": "Choose the output format for Tidal 320kbps lossy downloads. The original AAC stream will be converted to your selected format.", + "@downloadLossy320FormatDesc": { + "description": "Description in the Tidal lossy format picker" + }, + "downloadLossyMp3": "MP3 320kbps", + "@downloadLossyMp3": { + "description": "Tidal lossy format option - MP3 320kbps" + }, + "downloadLossyMp3Subtitle": "Best compatibility, ~10MB per track", + "@downloadLossyMp3Subtitle": { + "description": "Subtitle for MP3 320kbps Tidal lossy option" + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "downloadLossyOpus256": "Opus 256kbps", + "@downloadLossyOpus256": { + "description": "Tidal lossy format option - Opus 256kbps" + }, + "downloadLossyOpus256Subtitle": "Best quality Opus, ~8MB per track", + "@downloadLossyOpus256Subtitle": { + "description": "Subtitle for Opus 256kbps Tidal lossy option" + }, + "downloadLossyOpus128": "Opus 128kbps", + "@downloadLossyOpus128": { + "description": "Tidal lossy format option - Opus 128kbps" + }, + "downloadLossyOpus128Subtitle": "Smallest size, ~4MB per track", + "@downloadLossyOpus128Subtitle": { + "description": "Subtitle for Opus 128kbps Tidal lossy option" + }, + "qualityNote": "Actual quality depends on track availability from the service", + "@qualityNote": { + "description": "Note about quality availability" + }, + "downloadAskBeforeDownload": "Ask Before Download", + "@downloadAskBeforeDownload": { + "description": "Setting - show quality picker" + }, + "downloadDirectory": "Download Directory", + "@downloadDirectory": { + "description": "Setting - download folder" + }, + "downloadSeparateSinglesFolder": "Separate Singles Folder", + "@downloadSeparateSinglesFolder": { + "description": "Setting - separate folder for singles" + }, + "downloadAlbumFolderStructure": "Album Folder Structure", + "@downloadAlbumFolderStructure": { + "description": "Setting - album folder organization" + }, + "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", + "@downloadUseAlbumArtistForFolders": { + "description": "Setting - choose whether artist folders use Album Artist or Track Artist" + }, + "downloadUsePrimaryArtistOnly": "Primary artist only for folders", + "@downloadUsePrimaryArtistOnly": { + "description": "Setting - strip featured artists from folder name" + }, + "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", + "@downloadUsePrimaryArtistOnlyEnabled": { + "description": "Subtitle when primary artist only is enabled" + }, + "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", + "@downloadUsePrimaryArtistOnlyDisabled": { + "description": "Subtitle when primary artist only is disabled" + }, + "downloadSelectQuality": "Select Quality", + "@downloadSelectQuality": { + "description": "Dialog title - choose audio quality" + }, + "downloadFrom": "Download From", + "@downloadFrom": { + "description": "Label - download source" + }, + "appearanceAmoledDark": "AMOLED Dark", + "@appearanceAmoledDark": { + "description": "Theme option - pure black" + }, + "appearanceAmoledDarkSubtitle": "Pure black background", + "@appearanceAmoledDarkSubtitle": { + "description": "Subtitle for AMOLED dark" + }, + "queueClearAll": "Clear All", + "@queueClearAll": { + "description": "Button - clear all queue items" + }, + "queueClearAllMessage": "Are you sure you want to clear all downloads?", + "@queueClearAllMessage": { + "description": "Clear queue confirmation" + }, + "settingsAutoExportFailed": "Auto-export failed downloads", + "@settingsAutoExportFailed": { + "description": "Setting toggle for auto-export" + }, + "settingsAutoExportFailedSubtitle": "Save failed downloads to TXT file automatically", + "@settingsAutoExportFailedSubtitle": { + "description": "Subtitle for auto-export setting" + }, + "settingsDownloadNetwork": "Download Network", + "@settingsDownloadNetwork": { + "description": "Setting for network type preference" + }, + "settingsDownloadNetworkAny": "WiFi + Mobile Data", + "@settingsDownloadNetworkAny": { + "description": "Network option - use any connection" + }, + "settingsDownloadNetworkWifiOnly": "WiFi Only", + "@settingsDownloadNetworkWifiOnly": { + "description": "Network option - only use WiFi" + }, + "settingsDownloadNetworkSubtitle": "Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.", + "@settingsDownloadNetworkSubtitle": { + "description": "Subtitle explaining network preference" + }, + "albumFolderArtistAlbum": "Artist / Album", + "@albumFolderArtistAlbum": { + "description": "Album folder option" + }, + "albumFolderArtistAlbumSubtitle": "Albums/Artist Name/Album Name/", + "@albumFolderArtistAlbumSubtitle": { + "description": "Folder structure example" + }, + "albumFolderArtistYearAlbum": "Artist / [Year] Album", + "@albumFolderArtistYearAlbum": { + "description": "Album folder option with year" + }, + "albumFolderArtistYearAlbumSubtitle": "Albums/Artist Name/[2005] Album Name/", + "@albumFolderArtistYearAlbumSubtitle": { + "description": "Folder structure example" + }, + "albumFolderAlbumOnly": "Album Only", + "@albumFolderAlbumOnly": { + "description": "Album folder option" + }, + "albumFolderAlbumOnlySubtitle": "Albums/Album Name/", + "@albumFolderAlbumOnlySubtitle": { + "description": "Folder structure example" + }, + "albumFolderYearAlbum": "[Year] Album", + "@albumFolderYearAlbum": { + "description": "Album folder option with year" + }, + "albumFolderYearAlbumSubtitle": "Albums/[2005] Album Name/", + "@albumFolderYearAlbumSubtitle": { + "description": "Folder structure example" + }, + "albumFolderArtistAlbumSingles": "Artist / Album + Singles", + "@albumFolderArtistAlbumSingles": { + "description": "Album folder option with singles inside artist" + }, + "albumFolderArtistAlbumSinglesSubtitle": "Artist/Album/ and Artist/Singles/", + "@albumFolderArtistAlbumSinglesSubtitle": { + "description": "Folder structure example" + }, + "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", + "@albumFolderArtistAlbumFlat": { + "description": "Album folder option with singles directly in artist folder" + }, + "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", + "@albumFolderArtistAlbumFlatSubtitle": { + "description": "Folder structure example for flat singles" + }, + "downloadedAlbumDeleteSelected": "Delete Selected", + "@downloadedAlbumDeleteSelected": { + "description": "Button - delete selected tracks" + }, + "downloadedAlbumDeleteMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from this album?\n\nThis will also delete the files from storage.", + "@downloadedAlbumDeleteMessage": { + "description": "Delete confirmation with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadedAlbumSelectedCount": "{count} selected", + "@downloadedAlbumSelectedCount": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadedAlbumAllSelected": "All tracks selected", + "@downloadedAlbumAllSelected": { + "description": "Status - all items selected" + }, + "downloadedAlbumTapToSelect": "Tap tracks to select", + "@downloadedAlbumTapToSelect": { + "description": "Selection hint" + }, + "downloadedAlbumDeleteCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@downloadedAlbumDeleteCount": { + "description": "Delete button text with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadedAlbumSelectToDelete": "Select tracks to delete", + "@downloadedAlbumSelectToDelete": { + "description": "Placeholder when nothing selected" + }, + "downloadedAlbumDiscHeader": "Disc {discNumber}", + "@downloadedAlbumDiscHeader": { + "description": "Header for disc separator in multi-disc albums", + "placeholders": { + "discNumber": { + "type": "int", + "example": "1" + } + } + }, + "recentTypeArtist": "Artist", + "@recentTypeArtist": { + "description": "Recent access item type - artist" + }, + "recentTypeAlbum": "Album", + "@recentTypeAlbum": { + "description": "Recent access item type - album" + }, + "recentTypeSong": "Song", + "@recentTypeSong": { + "description": "Recent access item type - song/track" + }, + "recentTypePlaylist": "Playlist", + "@recentTypePlaylist": { + "description": "Recent access item type - playlist" + }, + "recentEmpty": "No recent items yet", + "@recentEmpty": { + "description": "Empty state text for recent access list" + }, + "recentShowAllDownloads": "Show All Downloads", + "@recentShowAllDownloads": { + "description": "Button label to unhide hidden downloads in recent access" + }, + "recentPlaylistInfo": "Playlist: {name}", + "@recentPlaylistInfo": { + "description": "Snackbar message when tapping playlist in recent access", + "placeholders": { + "name": { + "type": "String", + "description": "Playlist name" + } + } + }, + "discographyDownload": "Download Discography", + "@discographyDownload": { + "description": "Button - download artist discography" + }, + "discographyDownloadAll": "Download All", + "@discographyDownloadAll": { + "description": "Option - download entire discography" + }, + "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", + "@discographyDownloadAllSubtitle": { + "description": "Subtitle showing total tracks and albums", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographyAlbumsOnly": "Albums Only", + "@discographyAlbumsOnly": { + "description": "Option - download only albums" + }, + "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", + "@discographyAlbumsOnlySubtitle": { + "description": "Subtitle showing album tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySinglesOnly": "Singles & EPs Only", + "@discographySinglesOnly": { + "description": "Option - download only singles" + }, + "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", + "@discographySinglesOnlySubtitle": { + "description": "Subtitle showing singles tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySelectAlbums": "Select Albums...", + "@discographySelectAlbums": { + "description": "Option - manually select albums to download" + }, + "discographySelectAlbumsSubtitle": "Choose specific albums or singles", + "@discographySelectAlbumsSubtitle": { + "description": "Subtitle for select albums option" + }, + "discographyFetchingTracks": "Fetching tracks...", + "@discographyFetchingTracks": { + "description": "Progress - fetching album tracks" + }, + "discographyFetchingAlbum": "Fetching {current} of {total}...", + "@discographyFetchingAlbum": { + "description": "Progress - fetching specific album", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "discographySelectedCount": "{count} selected", + "@discographySelectedCount": { + "description": "Selection count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographyDownloadSelected": "Download Selected", + "@discographyDownloadSelected": { + "description": "Button - download selected albums" + }, + "discographyAddedToQueue": "Added {count} tracks to queue", + "@discographyAddedToQueue": { + "description": "Snackbar - tracks added from discography", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", + "@discographySkippedDownloaded": { + "description": "Snackbar - with skipped tracks count", + "placeholders": { + "added": { + "type": "int" + }, + "skipped": { + "type": "int" + } + } + }, + "discographyNoAlbums": "No albums available", + "@discographyNoAlbums": { + "description": "Error - no albums found for artist" + }, + "discographyFailedToFetch": "Failed to fetch some albums", + "@discographyFailedToFetch": { + "description": "Error - some albums failed to load" + }, + "sectionStorageAccess": "Storage Access", + "@sectionStorageAccess": { + "description": "Section header for storage access settings" + }, + "allFilesAccess": "All Files Access", + "@allFilesAccess": { + "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" + }, + "allFilesAccessEnabledSubtitle": "Can write to any folder", + "@allFilesAccessEnabledSubtitle": { + "description": "Subtitle when all files access is enabled" + }, + "allFilesAccessDisabledSubtitle": "Limited to media folders only", + "@allFilesAccessDisabledSubtitle": { + "description": "Subtitle when all files access is disabled" + }, + "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", + "@allFilesAccessDescription": { + "description": "Description explaining when to enable all files access" + }, + "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", + "@allFilesAccessDeniedMessage": { + "description": "Message when permission is permanently denied" + }, + "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", + "@allFilesAccessDisabledMessage": { + "description": "Snackbar message when user disables all files access" + }, + "settingsLocalLibrary": "Local Library", + "@settingsLocalLibrary": { + "description": "Settings menu item - local library" + }, + "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", + "@settingsLocalLibrarySubtitle": { + "description": "Subtitle for local library settings" + }, + "settingsCache": "Storage & Cache", + "@settingsCache": { + "description": "Settings menu item - cache management" + }, + "settingsCacheSubtitle": "View size and clear cached data", + "@settingsCacheSubtitle": { + "description": "Subtitle for cache management menu" + }, + "libraryTitle": "Local Library", + "@libraryTitle": { + "description": "Library settings page title" + }, + "libraryScanSettings": "Scan Settings", + "@libraryScanSettings": { + "description": "Section header for scan settings" + }, + "libraryEnableLocalLibrary": "Enable Local Library", + "@libraryEnableLocalLibrary": { + "description": "Toggle to enable library scanning" + }, + "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", + "@libraryEnableLocalLibrarySubtitle": { + "description": "Subtitle for enable toggle" + }, + "libraryFolder": "Library Folder", + "@libraryFolder": { + "description": "Folder selection setting" + }, + "libraryFolderHint": "Tap to select folder", + "@libraryFolderHint": { + "description": "Placeholder when no folder selected" + }, + "libraryShowDuplicateIndicator": "Show Duplicate Indicator", + "@libraryShowDuplicateIndicator": { + "description": "Toggle for duplicate indicator in search" + }, + "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", + "@libraryShowDuplicateIndicatorSubtitle": { + "description": "Subtitle for duplicate indicator toggle" + }, + "libraryAutoScan": "Auto Scan", + "@libraryAutoScan": { + "description": "Setting for automatic library scanning" + }, + "libraryAutoScanSubtitle": "Automatically scan your library for new files", + "@libraryAutoScanSubtitle": { + "description": "Subtitle for auto scan setting" + }, + "libraryAutoScanOff": "Off", + "@libraryAutoScanOff": { + "description": "Auto scan disabled" + }, + "libraryAutoScanOnOpen": "Every app open", + "@libraryAutoScanOnOpen": { + "description": "Auto scan when app opens" + }, + "libraryAutoScanDaily": "Daily", + "@libraryAutoScanDaily": { + "description": "Auto scan once per day" + }, + "libraryAutoScanWeekly": "Weekly", + "@libraryAutoScanWeekly": { + "description": "Auto scan once per week" + }, + "libraryActions": "Actions", + "@libraryActions": { + "description": "Section header for library actions" + }, + "libraryScan": "Scan Library", + "@libraryScan": { + "description": "Button to start library scan" + }, + "libraryScanSubtitle": "Scan for audio files", + "@libraryScanSubtitle": { + "description": "Subtitle for scan button" + }, + "libraryScanSelectFolderFirst": "Select a folder first", + "@libraryScanSelectFolderFirst": { + "description": "Message when trying to scan without folder" + }, + "libraryCleanupMissingFiles": "Cleanup Missing Files", + "@libraryCleanupMissingFiles": { + "description": "Button to remove entries for missing files" + }, + "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", + "@libraryCleanupMissingFilesSubtitle": { + "description": "Subtitle for cleanup button" + }, + "libraryClear": "Clear Library", + "@libraryClear": { + "description": "Button to clear all library entries" + }, + "libraryClearSubtitle": "Remove all scanned tracks", + "@libraryClearSubtitle": { + "description": "Subtitle for clear button" + }, + "libraryClearConfirmTitle": "Clear Library", + "@libraryClearConfirmTitle": { + "description": "Dialog title for clear confirmation" + }, + "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", + "@libraryClearConfirmMessage": { + "description": "Dialog message for clear confirmation" + }, + "libraryAbout": "About Local Library", + "@libraryAbout": { + "description": "Section header for about info" + }, + "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", + "@libraryAboutDescription": { + "description": "Description of local library feature" + }, + "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", + "@libraryTracksUnit": { + "description": "Unit label for tracks count (without the number itself)", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryFilesUnit": "{count, plural, =1{file} other{files}}", + "@libraryFilesUnit": { + "description": "Unit label for files count during library scanning", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryLastScanned": "Last scanned: {time}", + "@libraryLastScanned": { + "description": "Last scan time display", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "libraryLastScannedNever": "Never", + "@libraryLastScannedNever": { + "description": "Shown when library has never been scanned" + }, + "libraryScanning": "Scanning...", + "@libraryScanning": { + "description": "Status during scan" + }, + "libraryScanFinalizing": "Finalizing library...", + "@libraryScanFinalizing": { + "description": "Status shown after file scanning finishes but library persistence is still running" + }, + "libraryScanProgress": "{progress}% of {total} files", + "@libraryScanProgress": { + "description": "Scan progress display", + "placeholders": { + "progress": { + "type": "String" + }, + "total": { + "type": "int" + } + } + }, + "libraryInLibrary": "In Library", + "@libraryInLibrary": { + "description": "Badge shown on tracks that exist in local library" + }, + "libraryRemovedMissingFiles": "Removed {count} missing files from library", + "@libraryRemovedMissingFiles": { + "description": "Snackbar after cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryCleared": "Library cleared", + "@libraryCleared": { + "description": "Snackbar after clearing library" + }, + "libraryStorageAccessRequired": "Storage Access Required", + "@libraryStorageAccessRequired": { + "description": "Dialog title for storage permission" + }, + "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", + "@libraryStorageAccessMessage": { + "description": "Dialog message for storage permission" + }, + "libraryFolderNotExist": "Selected folder does not exist", + "@libraryFolderNotExist": { + "description": "Error when folder doesn't exist" + }, + "librarySourceDownloaded": "Downloaded", + "@librarySourceDownloaded": { + "description": "Badge for tracks downloaded via SpotiFLAC" + }, + "librarySourceLocal": "Local", + "@librarySourceLocal": { + "description": "Badge for tracks from local library scan" + }, + "libraryFilterAll": "All", + "@libraryFilterAll": { + "description": "Filter chip - show all library items" + }, + "libraryFilterDownloaded": "Downloaded", + "@libraryFilterDownloaded": { + "description": "Filter chip - show only downloaded items" + }, + "libraryFilterLocal": "Local", + "@libraryFilterLocal": { + "description": "Filter chip - show only local library items" + }, + "libraryFilterTitle": "Filters", + "@libraryFilterTitle": { + "description": "Filter bottom sheet title" + }, + "libraryFilterReset": "Reset", + "@libraryFilterReset": { + "description": "Reset all filters button" + }, + "libraryFilterApply": "Apply", + "@libraryFilterApply": { + "description": "Apply filters button" + }, + "libraryFilterSource": "Source", + "@libraryFilterSource": { + "description": "Filter section - source type" + }, + "libraryFilterQuality": "Quality", + "@libraryFilterQuality": { + "description": "Filter section - audio quality" + }, + "libraryFilterQualityHiRes": "Hi-Res (24bit)", + "@libraryFilterQualityHiRes": { + "description": "Filter option - high resolution audio" + }, + "libraryFilterQualityCD": "CD (16bit)", + "@libraryFilterQualityCD": { + "description": "Filter option - CD quality audio" + }, + "libraryFilterQualityLossy": "Lossy", + "@libraryFilterQualityLossy": { + "description": "Filter option - lossy compressed audio" + }, + "libraryFilterFormat": "Format", + "@libraryFilterFormat": { + "description": "Filter section - file format" + }, + "libraryFilterMetadata": "Metadata", + "@libraryFilterMetadata": { + "description": "Filter section - metadata completeness" + }, + "libraryFilterMetadataComplete": "Complete metadata", + "@libraryFilterMetadataComplete": { + "description": "Filter option - items with complete metadata" + }, + "libraryFilterMetadataMissingAny": "Missing any metadata", + "@libraryFilterMetadataMissingAny": { + "description": "Filter option - items missing any tracked metadata field" + }, + "libraryFilterMetadataMissingYear": "Missing year", + "@libraryFilterMetadataMissingYear": { + "description": "Filter option - items missing release year/date" + }, + "libraryFilterMetadataMissingGenre": "Missing genre", + "@libraryFilterMetadataMissingGenre": { + "description": "Filter option - items missing genre" + }, + "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", + "@libraryFilterMetadataMissingAlbumArtist": { + "description": "Filter option - items missing album artist" + }, + "libraryFilterSort": "Sort", + "@libraryFilterSort": { + "description": "Filter section - sort order" + }, + "libraryFilterSortLatest": "Latest", + "@libraryFilterSortLatest": { + "description": "Sort option - newest first" + }, + "libraryFilterSortOldest": "Oldest", + "@libraryFilterSortOldest": { + "description": "Sort option - oldest first" + }, + "libraryFilterSortAlbumAsc": "Album (A-Z)", + "@libraryFilterSortAlbumAsc": { + "description": "Sort option - album ascending" + }, + "libraryFilterSortAlbumDesc": "Album (Z-A)", + "@libraryFilterSortAlbumDesc": { + "description": "Sort option - album descending" + }, + "libraryFilterSortGenreAsc": "Genre (A-Z)", + "@libraryFilterSortGenreAsc": { + "description": "Sort option - genre ascending" + }, + "libraryFilterSortGenreDesc": "Genre (Z-A)", + "@libraryFilterSortGenreDesc": { + "description": "Sort option - genre descending" + }, + "timeJustNow": "Just now", + "@timeJustNow": { + "description": "Relative time - less than a minute ago" + }, + "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", + "@timeMinutesAgo": { + "description": "Relative time - minutes ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", + "@timeHoursAgo": { + "description": "Relative time - hours ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tutorialWelcomeTitle": "Welcome to SpotiFLAC!", + "@tutorialWelcomeTitle": { + "description": "Tutorial welcome page title" + }, + "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "@tutorialWelcomeDesc": { + "description": "Tutorial welcome page description" + }, + "tutorialWelcomeTip1": "Download music from Spotify, Deezer, or paste any supported URL", + "@tutorialWelcomeTip1": { + "description": "Tutorial welcome tip 1" + }, + "tutorialWelcomeTip2": "Get FLAC quality audio from Tidal, Qobuz, or Deezer", + "@tutorialWelcomeTip2": { + "description": "Tutorial welcome tip 2" + }, + "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "@tutorialWelcomeTip3": { + "description": "Tutorial welcome tip 3" + }, + "tutorialSearchTitle": "Finding Music", + "@tutorialSearchTitle": { + "description": "Tutorial search page title" + }, + "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "@tutorialSearchDesc": { + "description": "Tutorial search page description" + }, + "tutorialDownloadTitle": "Downloading Music", + "@tutorialDownloadTitle": { + "description": "Tutorial download page title" + }, + "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "@tutorialDownloadDesc": { + "description": "Tutorial download page description" + }, + "tutorialLibraryTitle": "Your Library", + "@tutorialLibraryTitle": { + "description": "Tutorial library page title" + }, + "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "@tutorialLibraryDesc": { + "description": "Tutorial library page description" + }, + "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "@tutorialLibraryTip1": { + "description": "Tutorial library tip 1" + }, + "tutorialLibraryTip2": "Tap any track to play it with your music player", + "@tutorialLibraryTip2": { + "description": "Tutorial library tip 2" + }, + "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "@tutorialLibraryTip3": { + "description": "Tutorial library tip 3" + }, + "tutorialExtensionsTitle": "Extensions", + "@tutorialExtensionsTitle": { + "description": "Tutorial extensions page title" + }, + "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "@tutorialExtensionsDesc": { + "description": "Tutorial extensions page description" + }, + "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", + "@tutorialExtensionsTip1": { + "description": "Tutorial extensions tip 1" + }, + "tutorialExtensionsTip2": "Add new download providers or search sources", + "@tutorialExtensionsTip2": { + "description": "Tutorial extensions tip 2" + }, + "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "@tutorialExtensionsTip3": { + "description": "Tutorial extensions tip 3" + }, + "tutorialSettingsTitle": "Customize Your Experience", + "@tutorialSettingsTitle": { + "description": "Tutorial settings page title" + }, + "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "@tutorialSettingsDesc": { + "description": "Tutorial settings page description" + }, + "tutorialSettingsTip1": "Change download location and folder organization", + "@tutorialSettingsTip1": { + "description": "Tutorial settings tip 1" + }, + "tutorialSettingsTip2": "Set default audio quality and format preferences", + "@tutorialSettingsTip2": { + "description": "Tutorial settings tip 2" + }, + "tutorialSettingsTip3": "Customize app theme and appearance", + "@tutorialSettingsTip3": { + "description": "Tutorial settings tip 3" + }, + "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "@tutorialReadyMessage": { + "description": "Tutorial completion message" + }, + "libraryForceFullScan": "Force Full Scan", + "@libraryForceFullScan": { + "description": "Button to force a complete rescan of library" + }, + "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", + "@libraryForceFullScanSubtitle": { + "description": "Subtitle for force full scan button" + }, + "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", + "@cleanupOrphanedDownloads": { + "description": "Button to remove history entries for deleted files" + }, + "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", + "@cleanupOrphanedDownloadsSubtitle": { + "description": "Subtitle for orphaned cleanup button" + }, + "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", + "@cleanupOrphanedDownloadsResult": { + "description": "Snackbar after orphan cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cleanupOrphanedDownloadsNone": "No orphaned entries found", + "@cleanupOrphanedDownloadsNone": { + "description": "Snackbar when no orphans found" + }, + "cacheTitle": "Storage & Cache", + "@cacheTitle": { + "description": "Cache management page title" + }, + "cacheSummaryTitle": "Cache overview", + "@cacheSummaryTitle": { + "description": "Heading for cache summary card" + }, + "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", + "@cacheSummarySubtitle": { + "description": "Helper text for cache summary card" + }, + "cacheEstimatedTotal": "Estimated cache usage: {size}", + "@cacheEstimatedTotal": { + "description": "Total cache size shown in summary", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheSectionStorage": "Cached Data", + "@cacheSectionStorage": { + "description": "Section header for cache entries" + }, + "cacheSectionMaintenance": "Maintenance", + "@cacheSectionMaintenance": { + "description": "Section header for cleanup actions" + }, + "cacheAppDirectory": "App cache directory", + "@cacheAppDirectory": { + "description": "Cache item title for app cache directory" + }, + "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", + "@cacheAppDirectoryDesc": { + "description": "Description of what app cache directory contains" + }, + "cacheTempDirectory": "Temporary directory", + "@cacheTempDirectory": { + "description": "Cache item title for temporary files directory" + }, + "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", + "@cacheTempDirectoryDesc": { + "description": "Description of what temporary directory contains" + }, + "cacheCoverImage": "Cover image cache", + "@cacheCoverImage": { + "description": "Cache item title for persistent cover images" + }, + "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", + "@cacheCoverImageDesc": { + "description": "Description of what cover image cache contains" + }, + "cacheLibraryCover": "Library cover cache", + "@cacheLibraryCover": { + "description": "Cache item title for local library cover art images" + }, + "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", + "@cacheLibraryCoverDesc": { + "description": "Description of what library cover cache contains" + }, + "cacheExploreFeed": "Explore feed cache", + "@cacheExploreFeed": { + "description": "Cache item title for explore home feed cache" + }, + "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", + "@cacheExploreFeedDesc": { + "description": "Description of what explore feed cache contains" + }, + "cacheTrackLookup": "Track lookup cache", + "@cacheTrackLookup": { + "description": "Cache item title for track ID lookup cache" + }, + "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", + "@cacheTrackLookupDesc": { + "description": "Description of what track lookup cache contains" + }, + "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", + "@cacheCleanupUnusedDesc": { + "description": "Description of what cleanup unused data does" + }, + "cacheNoData": "No cached data", + "@cacheNoData": { + "description": "Label when cache category has no data" + }, + "cacheSizeWithFiles": "{size} in {count} files", + "@cacheSizeWithFiles": { + "description": "Cache size and file count", + "placeholders": { + "size": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cacheSizeOnly": "{size}", + "@cacheSizeOnly": { + "description": "Cache size only", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheEntries": "{count} entries", + "@cacheEntries": { + "description": "Track cache entry count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cacheClearSuccess": "Cleared: {target}", + "@cacheClearSuccess": { + "description": "Snackbar after clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearConfirmTitle": "Clear cache?", + "@cacheClearConfirmTitle": { + "description": "Dialog title before clearing one cache category" + }, + "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", + "@cacheClearConfirmMessage": { + "description": "Dialog message before clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearAllConfirmTitle": "Clear all cache?", + "@cacheClearAllConfirmTitle": { + "description": "Dialog title before clearing all caches" + }, + "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", + "@cacheClearAllConfirmMessage": { + "description": "Dialog message before clearing all caches" + }, + "cacheClearAll": "Clear all cache", + "@cacheClearAll": { + "description": "Button label to clear all caches" + }, + "cacheCleanupUnused": "Cleanup unused data", + "@cacheCleanupUnused": { + "description": "Action title for cleaning unused entries" + }, + "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", + "@cacheCleanupUnusedSubtitle": { + "description": "Subtitle for cleanup unused data action" + }, + "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", + "@cacheCleanupResult": { + "description": "Snackbar after unused data cleanup", + "placeholders": { + "downloadCount": { + "type": "int" + }, + "libraryCount": { + "type": "int" + } + } + }, + "cacheRefreshStats": "Refresh stats", + "@cacheRefreshStats": { + "description": "Button label to refresh cache statistics" + }, + "trackSaveCoverArt": "Save Cover Art", + "@trackSaveCoverArt": { + "description": "Menu action - save album cover art as file" + }, + "trackSaveCoverArtSubtitle": "Save album art as .jpg file", + "@trackSaveCoverArtSubtitle": { + "description": "Subtitle for save cover art action" + }, + "trackSaveLyrics": "Save Lyrics (.lrc)", + "@trackSaveLyrics": { + "description": "Menu action - save lyrics as .lrc file" + }, + "trackSaveLyricsSubtitle": "Fetch and save lyrics as .lrc file", + "@trackSaveLyricsSubtitle": { + "description": "Subtitle for save lyrics action" + }, + "trackSaveLyricsProgress": "Saving lyrics...", + "@trackSaveLyricsProgress": { + "description": "Snackbar while saving lyrics to file" + }, + "trackReEnrich": "Re-enrich", + "@trackReEnrich": { + "description": "Menu action - re-embed metadata into audio file" + }, + "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", + "@trackReEnrichOnlineSubtitle": { + "description": "Subtitle for re-enrich metadata action for local items" + }, + "trackReEnrichFieldsTitle": "Fields to update", + "@trackReEnrichFieldsTitle": { + "description": "Section title for field selection in re-enrich dialog" + }, + "trackReEnrichFieldCover": "Cover Art", + "@trackReEnrichFieldCover": { + "description": "Checkbox label for cover art field in re-enrich" + }, + "trackReEnrichFieldLyrics": "Lyrics", + "@trackReEnrichFieldLyrics": { + "description": "Checkbox label for lyrics field in re-enrich" + }, + "trackReEnrichFieldBasicTags": "Album, Album Artist", + "@trackReEnrichFieldBasicTags": { + "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" + }, + "trackReEnrichFieldTrackInfo": "Track & Disc Number", + "@trackReEnrichFieldTrackInfo": { + "description": "Checkbox label for track info in re-enrich" + }, + "trackReEnrichFieldReleaseInfo": "Date & ISRC", + "@trackReEnrichFieldReleaseInfo": { + "description": "Checkbox label for release info in re-enrich" + }, + "trackReEnrichFieldExtra": "Genre, Label, Copyright", + "@trackReEnrichFieldExtra": { + "description": "Checkbox label for extra metadata in re-enrich" + }, + "trackReEnrichSelectAll": "Select All", + "@trackReEnrichSelectAll": { + "description": "Select all fields checkbox in re-enrich" + }, + "trackEditMetadata": "Edit Metadata", + "@trackEditMetadata": { + "description": "Menu action - edit embedded metadata" + }, + "trackCoverSaved": "Cover art saved to {fileName}", + "@trackCoverSaved": { + "description": "Snackbar after cover art saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackCoverNoSource": "No cover art source available", + "@trackCoverNoSource": { + "description": "Snackbar when no cover art URL or embedded cover" + }, + "trackLyricsSaved": "Lyrics saved to {fileName}", + "@trackLyricsSaved": { + "description": "Snackbar after lyrics saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackReEnrichProgress": "Re-enriching metadata...", + "@trackReEnrichProgress": { + "description": "Snackbar while re-enriching metadata" + }, + "trackReEnrichSearching": "Searching metadata online...", + "@trackReEnrichSearching": { + "description": "Snackbar while searching metadata from internet for local items" + }, + "trackReEnrichSuccess": "Metadata re-enriched successfully", + "@trackReEnrichSuccess": { + "description": "Snackbar after successful re-enrichment" + }, + "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", + "@trackReEnrichFfmpegFailed": { + "description": "Snackbar when FFmpeg embed fails for MP3/Opus" + }, + "queueFlacAction": "Queue FLAC", + "@queueFlacAction": { + "description": "Action/button label for queueing FLAC redownloads for local tracks" + }, + "queueFlacConfirmMessage": "Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n{count} selected", + "@queueFlacConfirmMessage": { + "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", + "@queueFlacFindingProgress": { + "description": "Snackbar while resolving remote matches for local FLAC redownloads", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "queueFlacNoReliableMatches": "No reliable online matches found for the selection", + "@queueFlacNoReliableMatches": { + "description": "Snackbar when no safe FLAC redownload matches were found" + }, + "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", + "@queueFlacQueuedWithSkipped": { + "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", + "placeholders": { + "addedCount": { + "type": "int" + }, + "skippedCount": { + "type": "int" + } + } + }, + "trackSaveFailed": "Failed: {error}", + "@trackSaveFailed": { + "description": "Snackbar when save operation fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "trackConvertFormat": "Convert Format", + "@trackConvertFormat": { + "description": "Menu item - convert audio format" + }, + "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", + "@trackConvertFormatSubtitle": { + "description": "Subtitle for convert format menu item" + }, + "trackConvertTitle": "Convert Audio", + "@trackConvertTitle": { + "description": "Title of convert bottom sheet" + }, + "trackConvertTargetFormat": "Target Format", + "@trackConvertTargetFormat": { + "description": "Label for format selection" + }, + "trackConvertBitrate": "Bitrate", + "@trackConvertBitrate": { + "description": "Label for bitrate selection" + }, + "trackConvertConfirmTitle": "Confirm Conversion", + "@trackConvertConfirmTitle": { + "description": "Confirmation dialog title" + }, + "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", + "@trackConvertConfirmMessage": { + "description": "Confirmation dialog message", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", + "@trackConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless-to-lossless conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "trackConvertLosslessHint": "Lossless conversion — no quality loss", + "@trackConvertLosslessHint": { + "description": "Hint shown when converting between lossless formats" + }, + "trackConvertConverting": "Converting audio...", + "@trackConvertConverting": { + "description": "Snackbar while converting" + }, + "trackConvertSuccess": "Converted to {format} successfully", + "@trackConvertSuccess": { + "description": "Snackbar after successful conversion", + "placeholders": { + "format": { + "type": "String" + } + } + }, + "trackConvertFailed": "Conversion failed", + "@trackConvertFailed": { + "description": "Snackbar when conversion fails" + }, + "cueSplitTitle": "Split CUE Sheet", + "@cueSplitTitle": { + "description": "Title for CUE split bottom sheet" + }, + "cueSplitSubtitle": "Split CUE+FLAC into individual tracks", + "@cueSplitSubtitle": { + "description": "Subtitle for CUE split menu item" + }, + "cueSplitAlbum": "Album: {album}", + "@cueSplitAlbum": { + "description": "Album name in CUE split sheet", + "placeholders": { + "album": { + "type": "String" + } + } + }, + "cueSplitArtist": "Artist: {artist}", + "@cueSplitArtist": { + "description": "Artist name in CUE split sheet", + "placeholders": { + "artist": { + "type": "String" + } + } + }, + "cueSplitTrackCount": "{count} tracks", + "@cueSplitTrackCount": { + "description": "Number of tracks in CUE sheet", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitConfirmTitle": "Split CUE Album", + "@cueSplitConfirmTitle": { + "description": "CUE split confirmation dialog title" + }, + "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", + "@cueSplitConfirmMessage": { + "description": "CUE split confirmation dialog message", + "placeholders": { + "album": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", + "@cueSplitSplitting": { + "description": "Snackbar while splitting CUE", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "cueSplitSuccess": "Split into {count} tracks successfully", + "@cueSplitSuccess": { + "description": "Snackbar after successful CUE split", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitFailed": "CUE split failed", + "@cueSplitFailed": { + "description": "Snackbar when CUE split fails" + }, + "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", + "@cueSplitNoAudioFile": { + "description": "Error when CUE audio file is missing" + }, + "cueSplitButton": "Split into Tracks", + "@cueSplitButton": { + "description": "Button text to start CUE splitting" + }, + "actionCreate": "Create", + "@actionCreate": { + "description": "Generic action button - create" + }, + "collectionFoldersTitle": "My folders", + "@collectionFoldersTitle": { + "description": "Library section title for custom folders" + }, + "collectionWishlist": "Wishlist", + "@collectionWishlist": { + "description": "Custom folder for saved tracks to download later" + }, + "collectionLoved": "Loved", + "@collectionLoved": { + "description": "Custom folder for favorite tracks" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionPlaylists": "Playlists", + "@collectionPlaylists": { + "description": "Custom user playlists folder" + }, + "collectionPlaylist": "Playlist", + "@collectionPlaylist": { + "description": "Single playlist label" + }, + "collectionAddToPlaylist": "Add to playlist", + "@collectionAddToPlaylist": { + "description": "Action to add a track to user playlist" + }, + "collectionCreatePlaylist": "Create playlist", + "@collectionCreatePlaylist": { + "description": "Action to create a new playlist" + }, + "collectionNoPlaylistsYet": "No playlists yet", + "@collectionNoPlaylistsYet": { + "description": "Empty state title when user has no playlists" + }, + "collectionNoPlaylistsSubtitle": "Create a playlist to start categorizing tracks", + "@collectionNoPlaylistsSubtitle": { + "description": "Empty state subtitle when user has no playlists" + }, + "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", + "@collectionPlaylistTracks": { + "description": "Track count label for custom playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedToPlaylist": "Added to \"{playlistName}\"", + "@collectionAddedToPlaylist": { + "description": "Snackbar after adding track to playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", + "@collectionAlreadyInPlaylist": { + "description": "Snackbar when track already exists in playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionPlaylistCreated": "Playlist created", + "@collectionPlaylistCreated": { + "description": "Snackbar after creating playlist" + }, + "collectionPlaylistNameHint": "Playlist name", + "@collectionPlaylistNameHint": { + "description": "Hint text for playlist name input" + }, + "collectionPlaylistNameRequired": "Playlist name is required", + "@collectionPlaylistNameRequired": { + "description": "Validation error for empty playlist name" + }, + "collectionRenamePlaylist": "Rename playlist", + "@collectionRenamePlaylist": { + "description": "Action to rename playlist" + }, + "collectionDeletePlaylist": "Delete playlist", + "@collectionDeletePlaylist": { + "description": "Action to delete playlist" + }, + "collectionDeletePlaylistMessage": "Delete \"{playlistName}\" and all tracks inside it?", + "@collectionDeletePlaylistMessage": { + "description": "Confirmation message for deleting playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionPlaylistDeleted": "Playlist deleted", + "@collectionPlaylistDeleted": { + "description": "Snackbar after deleting playlist" + }, + "collectionPlaylistRenamed": "Playlist renamed", + "@collectionPlaylistRenamed": { + "description": "Snackbar after renaming playlist" + }, + "collectionWishlistEmptyTitle": "Wishlist is empty", + "@collectionWishlistEmptyTitle": { + "description": "Wishlist empty state title" + }, + "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", + "@collectionWishlistEmptySubtitle": { + "description": "Wishlist empty state subtitle" + }, + "collectionLovedEmptyTitle": "Loved folder is empty", + "@collectionLovedEmptyTitle": { + "description": "Loved empty state title" + }, + "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", + "@collectionLovedEmptySubtitle": { + "description": "Loved empty state subtitle" + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionPlaylistEmptyTitle": "Playlist is empty", + "@collectionPlaylistEmptyTitle": { + "description": "Playlist empty state title" + }, + "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", + "@collectionPlaylistEmptySubtitle": { + "description": "Playlist empty state subtitle" + }, + "collectionRemoveFromPlaylist": "Remove from playlist", + "@collectionRemoveFromPlaylist": { + "description": "Tooltip for removing track from playlist" + }, + "collectionRemoveFromFolder": "Remove from folder", + "@collectionRemoveFromFolder": { + "description": "Tooltip for removing track from wishlist/loved folder" + }, + "collectionRemoved": "\"{trackName}\" removed", + "@collectionRemoved": { + "description": "Snackbar after removing a track from a collection", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToLoved": "\"{trackName}\" added to Loved", + "@collectionAddedToLoved": { + "description": "Snackbar after adding track to loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", + "@collectionRemovedFromLoved": { + "description": "Snackbar after removing track from loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", + "@collectionAddedToWishlist": { + "description": "Snackbar after adding track to wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", + "@collectionRemovedFromWishlist": { + "description": "Snackbar after removing track from wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "trackOptionAddToLoved": "Add to Loved", + "@trackOptionAddToLoved": { + "description": "Bottom sheet action label - add track to loved folder" + }, + "trackOptionRemoveFromLoved": "Remove from Loved", + "@trackOptionRemoveFromLoved": { + "description": "Bottom sheet action label - remove track from loved folder" + }, + "trackOptionAddToWishlist": "Add to Wishlist", + "@trackOptionAddToWishlist": { + "description": "Bottom sheet action label - add track to wishlist" + }, + "trackOptionRemoveFromWishlist": "Remove from Wishlist", + "@trackOptionRemoveFromWishlist": { + "description": "Bottom sheet action label - remove track from wishlist" + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "collectionPlaylistChangeCover": "Change cover image", + "@collectionPlaylistChangeCover": { + "description": "Bottom sheet action to pick a custom cover image for a playlist" + }, + "collectionPlaylistRemoveCover": "Remove cover image", + "@collectionPlaylistRemoveCover": { + "description": "Bottom sheet action to remove custom cover image from a playlist" + }, + "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", + "@selectionShareCount": { + "description": "Share button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionShareNoFiles": "No shareable files found", + "@selectionShareNoFiles": { + "description": "Snackbar when no selected files exist on disk" + }, + "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", + "@selectionConvertCount": { + "description": "Convert button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionConvertNoConvertible": "No convertible tracks selected", + "@selectionConvertNoConvertible": { + "description": "Snackbar when no selected tracks support conversion" + }, + "selectionBatchConvertConfirmTitle": "Batch Convert", + "@selectionBatchConvertConfirmTitle": { + "description": "Confirmation dialog title for batch conversion" + }, + "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessage": { + "description": "Confirmation dialog message for batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "selectionBatchConvertProgress": "Converting {current} of {total}...", + "@selectionBatchConvertProgress": { + "description": "Snackbar during batch conversion progress", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", + "@selectionBatchConvertSuccess": { + "description": "Snackbar after batch conversion completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadedAlbumDownloadedCount": "{count} downloaded", + "@downloadedAlbumDownloadedCount": { + "description": "Downloaded tracks count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", + "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { + "description": "Subtitle when album artist is used for folder names" + }, + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", + "@downloadUseAlbumArtistForFoldersTrackSubtitle": { + "description": "Subtitle when track artist is used for folder names" + }, + "lyricsProvidersTitle": "Lyrics Provider Priority", + "@lyricsProvidersTitle": { + "description": "Settings item title for lyrics provider order" + }, + "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", + "@lyricsProvidersDescription": { + "description": "Description on the lyrics provider priority page" + }, + "lyricsProvidersInfoText": "Extension lyrics providers always run before built-in providers. At least one provider must remain enabled.", + "@lyricsProvidersInfoText": { + "description": "Info tip on lyrics provider priority page" + }, + "lyricsProvidersEnabledSection": "Enabled ({count})", + "@lyricsProvidersEnabledSection": { + "description": "Section header for enabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersDisabledSection": "Disabled ({count})", + "@lyricsProvidersDisabledSection": { + "description": "Section header for disabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", + "@lyricsProvidersAtLeastOne": { + "description": "Snackbar when user tries to disable the last enabled provider" + }, + "lyricsProvidersSaved": "Lyrics provider priority saved", + "@lyricsProvidersSaved": { + "description": "Snackbar after saving lyrics provider priority" + }, + "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", + "@lyricsProvidersDiscardContent": { + "description": "Body text of the discard-changes dialog on lyrics provider page" + }, + "lyricsProviderLrclibDesc": "Open-source synced lyrics database", + "@lyricsProviderLrclibDesc": { + "description": "Description for LRCLIB provider" + }, + "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", + "@lyricsProviderNeteaseDesc": { + "description": "Description for Netease provider" + }, + "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", + "@lyricsProviderMusixmatchDesc": { + "description": "Description for Musixmatch provider" + }, + "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", + "@lyricsProviderAppleMusicDesc": { + "description": "Description for Apple Music provider" + }, + "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", + "@lyricsProviderQqMusicDesc": { + "description": "Description for QQ Music provider" + }, + "lyricsProviderExtensionDesc": "Extension provider", + "@lyricsProviderExtensionDesc": { + "description": "Generic description for extension-based lyrics providers" + }, + "safMigrationTitle": "Storage Update Required", + "@safMigrationTitle": { + "description": "Title of SAF migration dialog" + }, + "safMigrationMessage1": "SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.", + "@safMigrationMessage1": { + "description": "First paragraph of SAF migration dialog" + }, + "safMigrationMessage2": "Please select your download folder again to switch to the new storage system.", + "@safMigrationMessage2": { + "description": "Second paragraph of SAF migration dialog" + }, + "safMigrationSuccess": "Download folder updated to SAF mode", + "@safMigrationSuccess": { + "description": "Snackbar after successfully migrating to SAF" + }, + "settingsDonate": "Support Development", + "@settingsDonate": { + "description": "Settings menu item - donate page" + }, + "settingsDonateSubtitle": "Buy the developer a coffee", + "@settingsDonateSubtitle": { + "description": "Subtitle for donate menu item" + }, + "tooltipLoveAll": "Love All", + "@tooltipLoveAll": { + "description": "Tooltip for the Love All button on album/playlist screens" + }, + "tooltipAddToPlaylist": "Add to Playlist", + "@tooltipAddToPlaylist": { + "description": "Tooltip for the Add to Playlist button" + }, + "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", + "@snackbarRemovedTracksFromLoved": { + "description": "Snackbar after removing multiple tracks from Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", + "@snackbarAddedTracksToLoved": { + "description": "Snackbar after adding multiple tracks to Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dialogDownloadAllTitle": "Download All", + "@dialogDownloadAllTitle": { + "description": "Dialog title for bulk download confirmation" + }, + "dialogDownloadAllMessage": "Download {count} tracks?", + "@dialogDownloadAllMessage": { + "description": "Body of the Download All confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "homeSkipAlreadyDownloaded": "Skip already downloaded songs", + "@homeSkipAlreadyDownloaded": { + "description": "Checkbox label in import dialog to skip already-downloaded songs" + }, + "homeGoToAlbum": "Go to Album", + "@homeGoToAlbum": { + "description": "Context menu item to navigate to the album page" + }, + "homeAlbumInfoUnavailable": "Album info not available", + "@homeAlbumInfoUnavailable": { + "description": "Snackbar when album info cannot be loaded" + }, + "snackbarLoadingCueSheet": "Loading CUE sheet...", + "@snackbarLoadingCueSheet": { + "description": "Snackbar while loading a CUE sheet file" + }, + "snackbarMetadataSaved": "Metadata saved successfully", + "@snackbarMetadataSaved": { + "description": "Snackbar after successfully saving track metadata" + }, + "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", + "@snackbarFailedToEmbedLyrics": { + "description": "Snackbar when lyrics embedding fails" + }, + "snackbarFailedToWriteStorage": "Failed to write back to storage", + "@snackbarFailedToWriteStorage": { + "description": "Snackbar when writing metadata back to file fails" + }, + "snackbarError": "Error: {error}", + "@snackbarError": { + "description": "Generic error snackbar with error detail", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "snackbarNoActionDefined": "No action defined for this button", + "@snackbarNoActionDefined": { + "description": "Snackbar when an extension button has no action configured" + }, + "noTracksFoundForAlbum": "No tracks found for this album", + "@noTracksFoundForAlbum": { + "description": "Empty state message when an album has no tracks" + }, + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", + "@downloadLocationSubtitle": { + "description": "Subtitle shown in the download location picker sheet" + }, + "storageModeAppFolder": "App Folder (Recommended)", + "@storageModeAppFolder": { + "description": "Storage mode option - app-managed folder" + }, + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", + "@storageModeAppFolderSubtitle": { + "description": "Subtitle for app folder storage mode" + }, + "storageModeSaf": "Custom Folder (SAF)", + "@storageModeSaf": { + "description": "Storage mode option - Storage Access Framework" + }, + "storageModeSafSubtitle": "Pick any folder, including SD card", + "@storageModeSafSubtitle": { + "description": "Subtitle for SAF storage mode" + }, + "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", + "@downloadFilenameDescription": { + "description": "Description shown in filename format editor" + }, + "downloadFilenameInsertTag": "Tap to insert tag:", + "@downloadFilenameInsertTag": { + "description": "Label above filename tag chips" + }, + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", + "@downloadSeparateSinglesEnabled": { + "description": "Subtitle when separate singles folder is on" + }, + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", + "@downloadSeparateSinglesDisabled": { + "description": "Subtitle when separate singles folder is off" + }, + "downloadArtistNameFilters": "Artist Name Filters", + "@downloadArtistNameFilters": { + "description": "Setting title for artist folder filter options" + }, + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", + "@downloadCreatePlaylistSourceFolder": { + "description": "Setting to create a subfolder per playlist source" + }, + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", + "@downloadCreatePlaylistSourceFolderEnabled": { + "description": "Subtitle when playlist folder is enabled" + }, + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", + "@downloadCreatePlaylistSourceFolderDisabled": { + "description": "Subtitle when playlist folder is disabled" + }, + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", + "@downloadCreatePlaylistSourceFolderRedundant": { + "description": "Subtitle when folder organization is already set to playlist" + }, + "downloadSongLinkRegion": "SongLink Region", + "@downloadSongLinkRegion": { + "description": "Setting for SongLink region used during fallback resolution" + }, + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", + "@downloadNetworkCompatibilityMode": { + "description": "Setting for legacy TLS/network handling" + }, + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", + "@downloadNetworkCompatibilityModeEnabled": { + "description": "Subtitle when network compatibility mode is on" + }, + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", + "@downloadNetworkCompatibilityModeDisabled": { + "description": "Subtitle when network compatibility mode is off" + }, + "downloadSelectServiceToEnable": "Select Tidal or Qobuz to enable this option", + "@downloadSelectServiceToEnable": { + "description": "Subtitle when quality picker is disabled due to extension service" + }, + "downloadSelectTidalQobuz": "Select Tidal or Qobuz to choose audio quality", + "@downloadSelectTidalQobuz": { + "description": "Info shown when a non-built-in service is selected" + }, + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", + "@downloadEmbedLyricsDisabled": { + "description": "Subtitle when lyrics embedding is blocked by metadata toggle" + }, + "downloadNeteaseIncludeTranslation": "Netease: Include Translation", + "@downloadNeteaseIncludeTranslation": { + "description": "Setting to include translated lyrics from Netease" + }, + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", + "@downloadNeteaseIncludeTranslationEnabled": { + "description": "Subtitle when Netease translation is on" + }, + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", + "@downloadNeteaseIncludeTranslationDisabled": { + "description": "Subtitle when Netease translation is off" + }, + "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", + "@downloadNeteaseIncludeRomanization": { + "description": "Setting to include romanized lyrics from Netease" + }, + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", + "@downloadNeteaseIncludeRomanizationEnabled": { + "description": "Subtitle when Netease romanization is on" + }, + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", + "@downloadNeteaseIncludeRomanizationDisabled": { + "description": "Subtitle when Netease romanization is off" + }, + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", + "@downloadAppleQqMultiPerson": { + "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" + }, + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", + "@downloadAppleQqMultiPersonEnabled": { + "description": "Subtitle when multi-person lyrics is on" + }, + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", + "@downloadAppleQqMultiPersonDisabled": { + "description": "Subtitle when multi-person lyrics is off" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "downloadMusixmatchLanguage": "Musixmatch Language", + "@downloadMusixmatchLanguage": { + "description": "Setting for Musixmatch lyrics translation language" + }, + "downloadMusixmatchLanguageAuto": "Auto (original language)", + "@downloadMusixmatchLanguageAuto": { + "description": "Subtitle when no language is set" + }, + "downloadFilterContributing": "Filter Contributing Artists", + "@downloadFilterContributing": { + "description": "Setting to strip contributing artists from Album Artist folder name" + }, + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", + "@downloadFilterContributingEnabled": { + "description": "Subtitle when contributing artist filter is on" + }, + "downloadFilterContributingDisabled": "Full Album Artist string used", + "@downloadFilterContributingDisabled": { + "description": "Subtitle when contributing artist filter is off" + }, + "downloadProvidersNoneEnabled": "No providers enabled", + "@downloadProvidersNoneEnabled": { + "description": "Shown when no lyrics providers are active" + }, + "downloadMusixmatchLanguageCode": "Language code", + "@downloadMusixmatchLanguageCode": { + "description": "Label for Musixmatch language input field" + }, + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", + "@downloadMusixmatchLanguageHint": { + "description": "Placeholder for Musixmatch language input" + }, + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", + "@downloadMusixmatchLanguageDesc": { + "description": "Description in Musixmatch language picker" + }, + "downloadMusixmatchAuto": "Auto", + "@downloadMusixmatchAuto": { + "description": "Button to clear Musixmatch language (use auto)" + }, + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", + "@downloadNetworkAnySubtitle": { + "description": "Subtitle for any-network option in picker" + }, + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", + "@downloadNetworkWifiOnlySubtitle": { + "description": "Subtitle for WiFi-only option in picker" + }, + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", + "@downloadSongLinkRegionDesc": { + "description": "Description in SongLink region picker" + }, + "snackbarUnsupportedAudioFormat": "Unsupported audio format", + "@snackbarUnsupportedAudioFormat": { + "description": "Snackbar when the audio format is not supported for the requested operation" + }, + "cacheRefresh": "Refresh", + "@cacheRefresh": { + "description": "Tooltip for refresh button on cache management page" + }, + "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", + "@dialogDownloadPlaylistsMessage": { + "description": "Dialog message for bulk playlist download confirmation", + "placeholders": { + "trackCount": { + "type": "int" + }, + "playlistCount": { + "type": "int" + } + } + }, + "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", + "@bulkDownloadPlaylistsButton": { + "description": "Button label for bulk downloading selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "bulkDownloadSelectPlaylists": "Select playlists to download", + "@bulkDownloadSelectPlaylists": { + "description": "Button label when no playlists are selected for download" + }, + "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", + "@snackbarSelectedPlaylistsEmpty": { + "description": "Snackbar when selected playlists contain no tracks" + }, + "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@playlistsCount": { + "description": "Playlist count display", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFill": "Auto-fill from online", + "@editMetadataAutoFill": { + "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" + }, + "editMetadataAutoFillDesc": "Select fields to fill automatically from online metadata", + "@editMetadataAutoFillDesc": { + "description": "Description for the auto-fill section" + }, + "editMetadataAutoFillFetch": "Fetch & Fill", + "@editMetadataAutoFillFetch": { + "description": "Button label to fetch online metadata and fill selected fields" + }, + "editMetadataAutoFillSearching": "Searching online...", + "@editMetadataAutoFillSearching": { + "description": "Snackbar shown while searching for online metadata" + }, + "editMetadataAutoFillNoResults": "No matching metadata found online", + "@editMetadataAutoFillNoResults": { + "description": "Snackbar when online metadata search returns no results" + }, + "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", + "@editMetadataAutoFillDone": { + "description": "Snackbar confirming how many fields were auto-filled", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", + "@editMetadataAutoFillNoneSelected": { + "description": "Snackbar when user taps Fetch without selecting any fields" + }, + "editMetadataFieldTitle": "Title", + "@editMetadataFieldTitle": { + "description": "Chip label for title field in auto-fill selector" + }, + "editMetadataFieldArtist": "Artist", + "@editMetadataFieldArtist": { + "description": "Chip label for artist field in auto-fill selector" + }, + "editMetadataFieldAlbum": "Album", + "@editMetadataFieldAlbum": { + "description": "Chip label for album field in auto-fill selector" + }, + "editMetadataFieldAlbumArtist": "Album Artist", + "@editMetadataFieldAlbumArtist": { + "description": "Chip label for album artist field in auto-fill selector" + }, + "editMetadataFieldDate": "Date", + "@editMetadataFieldDate": { + "description": "Chip label for date field in auto-fill selector" + }, + "editMetadataFieldTrackNum": "Track #", + "@editMetadataFieldTrackNum": { + "description": "Chip label for track number field in auto-fill selector" + }, + "editMetadataFieldDiscNum": "Disc #", + "@editMetadataFieldDiscNum": { + "description": "Chip label for disc number field in auto-fill selector" + }, + "editMetadataFieldGenre": "Genre", + "@editMetadataFieldGenre": { + "description": "Chip label for genre field in auto-fill selector" + }, + "editMetadataFieldIsrc": "ISRC", + "@editMetadataFieldIsrc": { + "description": "Chip label for ISRC field in auto-fill selector" + }, + "editMetadataFieldLabel": "Label", + "@editMetadataFieldLabel": { + "description": "Chip label for label field in auto-fill selector" + }, + "editMetadataFieldCopyright": "Copyright", + "@editMetadataFieldCopyright": { + "description": "Chip label for copyright field in auto-fill selector" + }, + "editMetadataFieldCover": "Cover Art", + "@editMetadataFieldCover": { + "description": "Chip label for cover art field in auto-fill selector" + }, + "editMetadataSelectAll": "All", + "@editMetadataSelectAll": { + "description": "Button to select all fields for auto-fill" + }, + "editMetadataSelectEmpty": "Empty only", + "@editMetadataSelectEmpty": { + "description": "Button to select only fields that are currently empty" + }, + "queueDownloadingCount": "Downloading ({count})", + "@queueDownloadingCount": { + "description": "Header for active downloads section with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadedHeader": "Downloaded", + "@queueDownloadedHeader": { + "description": "Header label for downloaded items section in library" + }, + "queueFilteringIndicator": "Filtering...", + "@queueFilteringIndicator": { + "description": "Shown while filter results are being computed" + }, + "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", + "@queueTrackCount": { + "description": "Track count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueAlbumCount": "{count, plural, =1{1 album} other{{count} albums}}", + "@queueAlbumCount": { + "description": "Album count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyAlbums": "No album downloads", + "@queueEmptyAlbums": { + "description": "Empty state title when no album downloads exist" + }, + "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", + "@queueEmptyAlbumsSubtitle": { + "description": "Empty state subtitle for album downloads" + }, + "queueEmptySingles": "No single downloads", + "@queueEmptySingles": { + "description": "Empty state title when no single track downloads exist" + }, + "queueEmptySinglesSubtitle": "Single track downloads will appear here", + "@queueEmptySinglesSubtitle": { + "description": "Empty state subtitle for single track downloads" + }, + "queueEmptyHistory": "No download history", + "@queueEmptyHistory": { + "description": "Empty state title when download history is empty" + }, + "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", + "@queueEmptyHistorySubtitle": { + "description": "Empty state subtitle for download history" + }, + "selectionAllPlaylistsSelected": "All playlists selected", + "@selectionAllPlaylistsSelected": { + "description": "Shown when all playlists are selected in selection mode" + }, + "selectionTapPlaylistsToSelect": "Tap playlists to select", + "@selectionTapPlaylistsToSelect": { + "description": "Hint shown in playlist selection mode" + }, + "selectionSelectPlaylistsToDelete": "Select playlists to delete", + "@selectionSelectPlaylistsToDelete": { + "description": "Hint shown when no playlists are selected for deletion" + }, + "audioAnalysisTitle": "Audio Quality Analysis", + "@audioAnalysisTitle": { + "description": "Title for audio analysis section" + }, + "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", + "@audioAnalysisDescription": { + "description": "Description for audio analysis tap-to-analyze prompt" + }, + "audioAnalysisAnalyzing": "Analyzing audio...", + "@audioAnalysisAnalyzing": { + "description": "Loading text while analyzing audio" + }, + "audioAnalysisSampleRate": "Sample Rate", + "@audioAnalysisSampleRate": { + "description": "Sample rate metric label" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisBitDepth": "Bit Depth", + "@audioAnalysisBitDepth": { + "description": "Bit depth metric label" + }, + "audioAnalysisChannels": "Channels", + "@audioAnalysisChannels": { + "description": "Channels metric label" + }, + "audioAnalysisDuration": "Duration", + "@audioAnalysisDuration": { + "description": "Duration metric label" + }, + "audioAnalysisNyquist": "Nyquist", + "@audioAnalysisNyquist": { + "description": "Nyquist frequency metric label" + }, + "audioAnalysisFileSize": "Size", + "@audioAnalysisFileSize": { + "description": "File size metric label" + }, + "audioAnalysisDynamicRange": "Dynamic Range", + "@audioAnalysisDynamicRange": { + "description": "Dynamic range metric label" + }, + "audioAnalysisPeak": "Peak", + "@audioAnalysisPeak": { + "description": "Peak amplitude metric label" + }, + "audioAnalysisRms": "RMS", + "@audioAnalysisRms": { + "description": "RMS level metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "audioAnalysisSamples": "Samples", + "@audioAnalysisSamples": { + "description": "Total samples metric label" + }, + "audioAnalysisRescan": "Re-analyze", + "@audioAnalysisRescan": { + "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" + }, + "audioAnalysisRescanning": "Re-analyzing audio...", + "@audioAnalysisRescanning": { + "description": "Loading text while audio is being re-analyzed after an explicit refresh" + }, + "extensionsSearchWith": "Search with {providerName}", + "@extensionsSearchWith": { + "description": "Extensions page - subtitle for built-in search provider option", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "extensionsHomeFeedProvider": "Home Feed Provider", + "@extensionsHomeFeedProvider": { + "description": "Extensions page - label for home feed provider selector" + }, + "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", + "@extensionsHomeFeedDescription": { + "description": "Extensions page - description for home feed provider picker" + }, + "extensionsHomeFeedAuto": "Auto", + "@extensionsHomeFeedAuto": { + "description": "Label for auto-selected search provider" + }, + "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", + "@extensionsHomeFeedAutoSubtitle": { + "description": "Extensions page - subtitle for auto home feed option" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "extensionsHomeFeedUse": "Use {extensionName} home feed", + "@extensionsHomeFeedUse": { + "description": "Extensions page - subtitle for a specific extension home feed option", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "extensionsNoHomeFeedExtensions": "No extensions with home feed", + "@extensionsNoHomeFeedExtensions": { + "description": "Extensions page - shown when no installed extension has home feed" + }, + "sortAlphaAsc": "A-Z", + "@sortAlphaAsc": { + "description": "Sort option - alphabetical ascending" + }, + "sortAlphaDesc": "Z-A", + "@sortAlphaDesc": { + "description": "Sort option - alphabetical descending" + }, + "cancelDownloadTitle": "Cancel download?", + "@cancelDownloadTitle": { + "description": "Dialog title when confirming cancellation of an active download" + }, + "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", + "@cancelDownloadContent": { + "description": "Dialog body when confirming cancellation of an active download", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "cancelDownloadKeep": "Keep", + "@cancelDownloadKeep": { + "description": "Dialog button - keep the active download (do not cancel)" + }, + "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", + "@metadataSaveFailedFfmpeg": { + "description": "Snackbar error when FFmpeg fails to write metadata" + }, + "metadataSaveFailedStorage": "Failed to write metadata back to storage", + "@metadataSaveFailedStorage": { + "description": "Snackbar error when writing metadata file back to storage fails" + }, + "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", + "@snackbarFolderPickerFailed": { + "description": "Snackbar shown when folder picker fails to open", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "errorLoadAlbum": "Failed to load album", + "@errorLoadAlbum": { + "description": "Error state shown when album fails to load" + }, + "errorLoadPlaylist": "Failed to load playlist", + "@errorLoadPlaylist": { + "description": "Error state shown when playlist fails to load" + }, + "errorLoadArtist": "Failed to load artist", + "@errorLoadArtist": { + "description": "Error state shown when artist fails to load" + }, + "notifChannelDownloadName": "Download Progress", + "@notifChannelDownloadName": { + "description": "Android notification channel name for download progress" + }, + "notifChannelDownloadDesc": "Shows download progress for tracks", + "@notifChannelDownloadDesc": { + "description": "Android notification channel description for download progress" + }, + "notifChannelLibraryScanName": "Library Scan", + "@notifChannelLibraryScanName": { + "description": "Android notification channel name for library scan" + }, + "notifChannelLibraryScanDesc": "Shows local library scan progress", + "@notifChannelLibraryScanDesc": { + "description": "Android notification channel description for library scan" + }, + "notifDownloadingTrack": "Downloading {trackName}", + "@notifDownloadingTrack": { + "description": "Notification title while downloading a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifFinalizingTrack": "Finalizing {trackName}", + "@notifFinalizingTrack": { + "description": "Notification title while finalizing (embedding metadata) a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifEmbeddingMetadata": "Embedding metadata...", + "@notifEmbeddingMetadata": { + "description": "Notification body while embedding metadata into a downloaded track" + }, + "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", + "@notifAlreadyInLibraryCount": { + "description": "Notification title when track is already in library, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifAlreadyInLibrary": "Already in Library", + "@notifAlreadyInLibrary": { + "description": "Notification title when track is already in library" + }, + "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", + "@notifDownloadCompleteCount": { + "description": "Notification title when download is complete, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifDownloadComplete": "Download Complete", + "@notifDownloadComplete": { + "description": "Notification title when a single download is complete" + }, + "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", + "@notifDownloadsFinished": { + "description": "Notification title when queue finishes with some failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifAllDownloadsComplete": "All Downloads Complete", + "@notifAllDownloadsComplete": { + "description": "Notification title when all downloads finish successfully" + }, + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", + "@notifTracksDownloadedSuccess": { + "description": "Notification body for queue complete - how many tracks were downloaded", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifScanningLibrary": "Scanning local library", + "@notifScanningLibrary": { + "description": "Notification title while scanning local library" + }, + "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", + "@notifLibraryScanProgressWithTotal": { + "description": "Notification body for library scan progress when total is known", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", + "@notifLibraryScanProgressNoTotal": { + "description": "Notification body for library scan progress when total is unknown", + "placeholders": { + "scanned": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanComplete": "Library scan complete", + "@notifLibraryScanComplete": { + "description": "Notification title when library scan finishes" + }, + "notifLibraryScanCompleteBody": "{count} tracks indexed", + "@notifLibraryScanCompleteBody": { + "description": "Notification body for library scan complete - number of indexed tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanExcluded": "{count} excluded", + "@notifLibraryScanExcluded": { + "description": "Library scan complete suffix - excluded track count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanErrors": "{count} errors", + "@notifLibraryScanErrors": { + "description": "Library scan complete suffix - error count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanFailed": "Library scan failed", + "@notifLibraryScanFailed": { + "description": "Notification title when library scan fails" + }, + "notifLibraryScanCancelled": "Library scan cancelled", + "@notifLibraryScanCancelled": { + "description": "Notification title when library scan is cancelled by the user" + }, + "notifLibraryScanStopped": "Scan stopped before completion.", + "@notifLibraryScanStopped": { + "description": "Notification body when library scan is cancelled" + }, + "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", + "@notifDownloadingUpdate": { + "description": "Notification title while downloading an app update", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateProgress": "{received} / {total} MB • {percentage}%", + "@notifUpdateProgress": { + "description": "Notification body showing update download progress", + "placeholders": { + "received": { + "type": "String" + }, + "total": { + "type": "String" + }, + "percentage": { + "type": "int" + } + } + }, + "notifUpdateReady": "Update Ready", + "@notifUpdateReady": { + "description": "Notification title when app update download is complete" + }, + "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", + "@notifUpdateReadyBody": { + "description": "Notification body when app update is ready to install", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateFailed": "Update Failed", + "@notifUpdateFailed": { + "description": "Notification title when app update download fails" + }, + "notifUpdateFailedBody": "Could not download update. Try again later.", + "@notifUpdateFailedBody": { + "description": "Notification body when app update download fails" + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import CSV", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Search tracks...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Search for tracks", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "optionsDefaultSearchTabAlbums": "Albums", + "@optionsDefaultSearchTabAlbums": { + "description": "Default search tab option - Albums tab" + }, + "optionsDefaultSearchTabTracks": "Tracks", + "@optionsDefaultSearchTabTracks": { + "description": "Default search tab option - Tracks tab" + }, + "settingsFiles": "Files & Folders", + "@settingsFiles": { + "description": "Settings menu item - file and folder settings" + }, + "settingsFilesSubtitle": "Download location, filename, folder structure", + "@settingsFilesSubtitle": { + "description": "Subtitle for files & folders settings" + }, + "settingsMetadata": "Metadata", + "@settingsMetadata": { + "description": "Settings menu item - metadata settings" + }, + "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", + "@settingsMetadataSubtitle": { + "description": "Subtitle for metadata settings" + }, + "settingsLyrics": "Lyrics", + "@settingsLyrics": { + "description": "Settings menu item - lyrics settings" + }, + "settingsLyricsSubtitle": "Embed, mode, providers, language options", + "@settingsLyricsSubtitle": { + "description": "Subtitle for lyrics settings" + }, + "settingsApp": "App", + "@settingsApp": { + "description": "Settings menu item - app settings" + }, + "settingsAppSubtitle": "Updates, data, extension repo, debug", + "@settingsAppSubtitle": { + "description": "Subtitle for app settings" + }, + "sectionMetadataProviders": "Providers", + "@sectionMetadataProviders": { + "description": "Settings section header for metadata providers" + }, + "sectionDuplicates": "Duplicates", + "@sectionDuplicates": { + "description": "Settings section header for deduplication" + }, + "sectionLyricsProviderOptions": "Provider Options", + "@sectionLyricsProviderOptions": { + "description": "Settings section header for per-provider lyrics options" + }, + "metadataProvidersTitle": "Metadata Provider Priority", + "@metadataProvidersTitle": { + "description": "Settings item title for metadata provider order" + }, + "metadataProvidersSubtitle": "Drag to set search and metadata source order", + "@metadataProvidersSubtitle": { + "description": "Subtitle for metadata provider priority item" + }, + "downloadDeduplication": "Skip Duplicate Downloads", + "@downloadDeduplication": { + "description": "Setting - skip tracks already in download history" + }, + "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", + "@downloadDeduplicationEnabled": { + "description": "Subtitle when deduplication is on" + }, + "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", + "@downloadDeduplicationDisabled": { + "description": "Subtitle when deduplication is off" + }, + "downloadFallbackExtensions": "Fallback Extensions", + "@downloadFallbackExtensions": { + "description": "Settings item for configuring fallback extension providers" + }, + "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", + "@downloadFallbackExtensionsSubtitle": { + "description": "Subtitle for fallback extensions item" + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "Starting...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BETA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } + } +} \ No newline at end of file diff --git a/lib/l10n/arb/app_de.arb b/lib/l10n/arb/app_de.arb index e5484160..a457d3d1 100644 --- a/lib/l10n/arb/app_de.arb +++ b/lib/l10n/arb/app_de.arb @@ -1,6 +1,6 @@ { "@@locale": "de", - "@@last_modified": "2026-01-16", + "@@last_modified": "2026-04-28", "appName": "SpotiFLAC Mobile", "@appName": { "description": "App name - DO NOT TRANSLATE" @@ -89,11 +89,11 @@ "@downloadFilenameFormat": { "description": "Setting for output filename pattern" }, - "downloadSingleFilenameFormat": "Single Filename Format", + "downloadSingleFilenameFormat": "Einzelnes Dateinamenformat", "@downloadSingleFilenameFormat": { "description": "Setting for output filename pattern for singles/EPs" }, - "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", + "downloadSingleFilenameFormatDescription": "Dateinamenmuster für Singles und EPs. Verwendet die gleichen Tags wie das Albumformat.", "@downloadSingleFilenameFormatDescription": { "description": "Subtitle description for single filename format setting" }, @@ -145,7 +145,7 @@ "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Dienst für die Suche nach Titelnamen.", + "optionsPrimaryProviderSubtitle": "Dienst zur Suche nach Titel oder Albumnamen", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, @@ -158,19 +158,19 @@ } } }, - "optionsDefaultSearchTab": "Default Search Tab", + "optionsDefaultSearchTab": "Standard Such-Tab", "@optionsDefaultSearchTab": { "description": "Title for the preferred default search tab setting" }, - "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "optionsDefaultSearchTabSubtitle": "Wähle aus, welcher Tab zuerst für neue Suchergebnisse geöffnet wird.", "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsDefaultSearchTabAlbums": "Albums", + "optionsDefaultSearchTabAlbums": "Alben", "@optionsDefaultSearchTabAlbums": { "description": "Default search tab option - Albums tab" }, - "optionsDefaultSearchTabTracks": "Tracks", + "optionsDefaultSearchTabTracks": "Titel", "@optionsDefaultSearchTabTracks": { "description": "Default search tab option - Tracks tab" }, @@ -202,7 +202,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Synchronisierte Songtexte neben heruntergeladenen Titeln speichern", + "optionsEmbedLyricsSubtitle": "Speichere synchronisierte Liedtexte zusammen mit heruntergeladenen Titeln", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -218,11 +218,11 @@ "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" }, - "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", + "optionsReplayGainSubtitleOn": "Scanne Lautstärke und füge ReplayGain-Tags ein (EBU R128)", "@optionsReplayGainSubtitleOn": { "description": "Subtitle when ReplayGain is enabled" }, - "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", + "optionsReplayGainSubtitleOff": "Deaktiviert: keine Lautstärke-Normalisierungs-Tags", "@optionsReplayGainSubtitleOff": { "description": "Subtitle when ReplayGain is disabled" }, @@ -238,7 +238,7 @@ "@optionsArtistTagModeJoined": { "description": "Artist tag mode option that joins multiple artists into one value" }, - "optionsArtistTagModeJoinedSubtitle": "Einen Künstler-Wert wie \"Künstler A, Künstler B\" für maximale Player-Kompatibilität schreiben.", + "optionsArtistTagModeJoinedSubtitle": "Einen Künstler wert wie \"Artist A, Artist B\" für maximale Spieler-Kompatibilität schreiben.", "@optionsArtistTagModeJoinedSubtitle": { "description": "Subtitle for joined artist tag mode" }, @@ -246,7 +246,7 @@ "@optionsArtistTagModeSplitVorbis": { "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" }, - "optionsArtistTagModeSplitVorbisSubtitle": "Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.", + "optionsArtistTagModeSplitVorbisSubtitle": "Schreibe einen Künstler Tag pro Künstler für FLAC und Opus; MP3 und M4A bleiben beigetreten.", "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, @@ -315,7 +315,7 @@ "@optionsDetailedLogging": { "description": "Enable verbose logs for debugging" }, - "optionsDetailedLoggingOn": "Detaillierte Protokolle werden aufgezeichnet", + "optionsDetailedLoggingOn": "Detaillierte Logs werden aufgezeichnet", "@optionsDetailedLoggingOn": { "description": "Status when logging enabled" }, @@ -498,7 +498,7 @@ "@aboutSjdonadoDesc": { "description": "Credit description for sjdonado" }, - "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", + "aboutAppDescription": "Musik-Metadaten durchsuchen, Erweiterungen verwalten und deine Bibliothek organisieren.", "@aboutAppDescription": { "description": "App description in header card" }, @@ -780,7 +780,7 @@ "@dialogDeleteSelectedTitle": { "description": "Dialog title - delete selected items" }, - "dialogDeleteSelectedMessage": "Lösche {count} {count, plural, =1{Track} other{Tracks}} aus dem Verlauf?\n\nDies löscht auch die Dateien aus dem Speicher.", + "dialogDeleteSelectedMessage": "Lösche {count} {count, plural, one {}=1{Track} other{Tracks}} aus dem Verlauf?\n\nDies löscht auch die Dateien aus dem Speicher.", "@dialogDeleteSelectedMessage": { "description": "Dialog message - delete selected tracks", "placeholders": { @@ -859,7 +859,7 @@ "@snackbarCredentialsCleared": { "description": "Snackbar - Spotify credentials removed" }, - "snackbarDeletedTracks": "{count} {count, plural, =1{Titel gelöscht} other{Titel gelöscht}}", + "snackbarDeletedTracks": "{count} {count, plural, one {}=1{Titel} other{Titel}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", "placeholders": { @@ -1207,15 +1207,15 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Extension Fallback", + "providerPriorityFallbackExtensionsTitle": "Erweiterungs-Fallback", "@providerPriorityFallbackExtensionsTitle": { "description": "Section title for choosing which download extensions can be used as fallback providers" }, - "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", + "providerPriorityFallbackExtensionsDescription": "Wähle aus, welche installierten Download-Erweiterungen beim automatischen Fallback verwendet werden sollen.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" }, - "providerPriorityFallbackExtensionsHint": "Only enabled extensions with download-provider capability are listed here.", + "providerPriorityFallbackExtensionsHint": "Hier werden nur aktivierte Erweiterungen mit Download-Provider-Funktion aufgelistet.", "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, @@ -1247,15 +1247,15 @@ "@metadataMayRateLimit": { "description": "Spotify provider description" }, - "logTitle": "Protokolle", + "logTitle": "Logs", "@logTitle": { "description": "Logs screen title" }, - "logCopied": "Protokolle in Zwischenablage kopiert", + "logCopied": "Logs in Zwischenablage kopiert", "@logCopied": { "description": "Snackbar - logs copied" }, - "logSearchHint": "Protokolle durchsuchen...", + "logSearchHint": "Logs durchsuchen ...", "@logSearchHint": { "description": "Log search placeholder" }, @@ -1267,31 +1267,31 @@ "@logFilterSection": { "description": "Filter section title" }, - "logShareLogs": "Protokolle teilen", + "logShareLogs": "Logs teilen", "@logShareLogs": { "description": "Share button tooltip" }, - "logClearLogs": "Protokolle löschen", + "logClearLogs": "Logs löschen", "@logClearLogs": { "description": "Clear button tooltip" }, - "logClearLogsTitle": "Protokolle leeren", + "logClearLogsTitle": "Logs leeren", "@logClearLogsTitle": { "description": "Clear logs dialog title" }, - "logClearLogsMessage": "Bist du sicher, dass du alle Protokolle löschen möchtest?", + "logClearLogsMessage": "Bist du dir sicher, dass Sie alle Logs löschen möchtest?", "@logClearLogsMessage": { "description": "Clear logs confirmation message" }, - "logFilterBySeverity": "Protokolle nach Schweregrad filtern", + "logFilterBySeverity": "Logs nach Schweregrad filtern", "@logFilterBySeverity": { "description": "Filter dialog title" }, - "logNoLogsYet": "Keine Protokolle bisher", + "logNoLogsYet": "Noch keine Logs", "@logNoLogsYet": { "description": "Empty state title" }, - "logNoLogsYetSubtitle": "Protokolle werden hier angezeigt, während du die App benutzt", + "logNoLogsYetSubtitle": "Logs werden hier angezeigt, während du die App benutzt", "@logNoLogsYetSubtitle": { "description": "Empty state subtitle" }, @@ -1441,11 +1441,11 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Dienst, Qualität, Dateinamen-Format", + "settingsDownloadSubtitle": "Anbieter, Qualität, Rückfall", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, Lyrics, Covers, Updates", + "settingsOptionsSubtitle": "Fallback, Metadaten, Lyrics, Cover-Art", "@settingsOptionsSubtitle": { "description": "Options settings description" }, @@ -1579,11 +1579,11 @@ "@trackLyricsNotAvailable": { "description": "Message when lyrics not found" }, - "trackLyricsNotInFile": "No lyrics found in this file", + "trackLyricsNotInFile": "Keine Lyrics in dieser Datei gefunden", "@trackLyricsNotInFile": { "description": "Message when no embedded lyrics in audio file" }, - "trackFetchOnlineLyrics": "Fetch from Online", + "trackFetchOnlineLyrics": "Online abrufen", "@trackFetchOnlineLyrics": { "description": "Action - fetch lyrics from online providers" }, @@ -1722,15 +1722,15 @@ "@storeNewRepoUrlLabel": { "description": "Label for the new repository URL field inside the dialog" }, - "storeLoadError": "Failed to load repository", + "storeLoadError": "Fehler beim Laden der Repository", "@storeLoadError": { "description": "Error heading when the store cannot be loaded" }, - "storeEmptyNoExtensions": "No extensions available", + "storeEmptyNoExtensions": "Keine Erweiterung verfügbar", "@storeEmptyNoExtensions": { "description": "Message when store has no extensions" }, - "storeEmptyNoResults": "No extensions found", + "storeEmptyNoResults": "Keine Erweiterungen gefunden", "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, @@ -1873,11 +1873,11 @@ "@extensionsDownloadPrioritySubtitle": { "description": "Subtitle for download priority" }, - "extensionsFallbackTitle": "Fallback Extensions", + "extensionsFallbackTitle": "Fallback-Erweiterungen", "@extensionsFallbackTitle": { "description": "Setting and page title for choosing which download extensions can be used during fallback" }, - "extensionsFallbackSubtitle": "Choose which installed download extensions can be used as fallback", + "extensionsFallbackSubtitle": "Wähle welche installierten Download-Erweiterungen als Fallback verwendet werden sollen", "@extensionsFallbackSubtitle": { "description": "Subtitle for download fallback extensions menu" }, @@ -1921,7 +1921,7 @@ "@qualityFlacLossless": { "description": "Quality option - CD quality FLAC" }, - "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", + "qualityFlacLosslessSubtitle": "16-bit / 44,1kHz", "@qualityFlacLosslessSubtitle": { "description": "Technical spec for lossless" }, @@ -1949,7 +1949,7 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for Tidal lossy downloads" }, - "downloadLossy320Format": "Lossy 320kbps Format", + "downloadLossy320Format": "Verlustbehaftetes 320kbps-Format", "@downloadLossy320Format": { "description": "Title of the Tidal lossy format picker bottom sheet" }, @@ -2105,11 +2105,11 @@ "@albumFolderArtistAlbumSinglesSubtitle": { "description": "Folder structure example" }, - "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", + "albumFolderArtistAlbumFlat": "Künstler / Album (Singles flach)", "@albumFolderArtistAlbumFlat": { "description": "Album folder option with singles directly in artist folder" }, - "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", + "albumFolderArtistAlbumFlatSubtitle": "Künstler/Album/ Und Künstler/Lied.flac", "@albumFolderArtistAlbumFlatSubtitle": { "description": "Folder structure example for flat singles" }, @@ -2117,7 +2117,7 @@ "@downloadedAlbumDeleteSelected": { "description": "Button - delete selected tracks" }, - "downloadedAlbumDeleteMessage": "{count} {count, plural, =1{Titel} other{Titel}} aus diesem Album löschen?\n\nDadurch werden auch die Dateien aus dem Speicher gelöscht.", + "downloadedAlbumDeleteMessage": "{count} {count, plural, one {}=1{Titel} other{Titel}} aus diesem Album löschen?\n\nDadurch werden auch die Dateien aus dem Speicher gelöscht.", "@downloadedAlbumDeleteMessage": { "description": "Delete confirmation with count", "placeholders": { @@ -2143,7 +2143,7 @@ "@downloadedAlbumTapToSelect": { "description": "Selection hint" }, - "downloadedAlbumDeleteCount": "Lösche {count} {count, plural, =1{Titel}other{Titel}}", + "downloadedAlbumDeleteCount": "Lösche {count} {count, plural, one {}=1{Titel}other{Titel}}", "@downloadedAlbumDeleteCount": { "description": "Delete button text with count", "placeholders": { @@ -2398,7 +2398,7 @@ "@libraryAutoScan": { "description": "Setting for automatic library scanning" }, - "libraryAutoScanSubtitle": "Automatically scan your library for new files", + "libraryAutoScanSubtitle": "Scanne die Bibliothek automatisch nach neuen Dateien", "@libraryAutoScanSubtitle": { "description": "Subtitle for auto scan setting" }, @@ -2658,7 +2658,7 @@ "@timeJustNow": { "description": "Relative time - less than a minute ago" }, - "timeMinutesAgo": "{count, plural, =1{vor 1 Minute} other{vor {count} Minuten}}", + "timeMinutesAgo": "{count, plural, one {}=1{vor 1 Minute} other{vor {count} Minuten}}", "@timeMinutesAgo": { "description": "Relative time - minutes ago", "placeholders": { @@ -2667,7 +2667,7 @@ } } }, - "timeHoursAgo": "{count, plural, =1{vor 1 Stunde} other{vor {count} Stunden}}", + "timeHoursAgo": "{count, plural, one {}=1{vor 1 Stunde} other{vor {count} Stunden}}", "@timeHoursAgo": { "description": "Relative time - hours ago", "placeholders": { @@ -2740,7 +2740,7 @@ "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, - "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", + "tutorialExtensionsTip1": "Im Repo Tab findest du nützliche Erweiterungen", "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, @@ -3006,11 +3006,11 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Fields to update", + "trackReEnrichFieldsTitle": "Felder zum Aktualisieren", "@trackReEnrichFieldsTitle": { "description": "Section title for field selection in re-enrich dialog" }, - "trackReEnrichFieldCover": "Cover Art", + "trackReEnrichFieldCover": "Cover-Art", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" }, @@ -3018,15 +3018,15 @@ "@trackReEnrichFieldLyrics": { "description": "Checkbox label for lyrics field in re-enrich" }, - "trackReEnrichFieldBasicTags": "Album, Album Artist", + "trackReEnrichFieldBasicTags": "Album, Album-Künstler", "@trackReEnrichFieldBasicTags": { "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" }, - "trackReEnrichFieldTrackInfo": "Track & Disc Number", + "trackReEnrichFieldTrackInfo": "Track & Disc Nummer", "@trackReEnrichFieldTrackInfo": { "description": "Checkbox label for track info in re-enrich" }, - "trackReEnrichFieldReleaseInfo": "Date & ISRC", + "trackReEnrichFieldReleaseInfo": "Datum & ISRC", "@trackReEnrichFieldReleaseInfo": { "description": "Checkbox label for release info in re-enrich" }, @@ -3034,7 +3034,7 @@ "@trackReEnrichFieldExtra": { "description": "Checkbox label for extra metadata in re-enrich" }, - "trackReEnrichSelectAll": "Select All", + "trackReEnrichSelectAll": "Alles Auswählen", "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, @@ -3093,7 +3093,7 @@ } } }, - "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", + "queueFlacFindingProgress": "Suche nach FLAC-Übereinstimmungen... ({current}/{total})", "@queueFlacFindingProgress": { "description": "Snackbar while resolving remote matches for local FLAC redownloads", "placeholders": { @@ -3105,11 +3105,11 @@ } } }, - "queueFlacNoReliableMatches": "No reliable online matches found for the selection", + "queueFlacNoReliableMatches": "Keine zuverlässigen Online-Übereinstimmungen für die Auswahl gefunden", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" }, - "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", + "queueFlacQueuedWithSkipped": "{addedCount} Titel zur Warteschlange hinzugefügt, {skippedCount} übersprungen", "@queueFlacQueuedWithSkipped": { "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", "placeholders": { @@ -3134,7 +3134,7 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to MP3, Opus, ALAC, or FLAC", + "trackConvertFormatSubtitle": "Zu AAC/M4A, MP3, Opus, ALAC oder FLAC konvertieren", "@trackConvertFormatSubtitle": { "description": "Subtitle for convert format menu item" }, @@ -3181,7 +3181,7 @@ } } }, - "trackConvertLosslessHint": "Lossless conversion — no quality loss", + "trackConvertLosslessHint": "Verlustfreie Konvertierung kein Qualitätsverlust", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" }, @@ -3491,7 +3491,7 @@ "@collectionPlaylistRemoveCover": { "description": "Bottom sheet action to remove custom cover image from a playlist" }, - "selectionShareCount": "Teile {count} {count, plural, =1{Titel}other{Titel}}", + "selectionShareCount": "Teile {count} {count, plural, one {}=1{Titel}other{Titel}}", "@selectionShareCount": { "description": "Share button text with count in selection mode", "placeholders": { @@ -3504,7 +3504,7 @@ "@selectionShareNoFiles": { "description": "Snackbar when no selected files exist on disk" }, - "selectionConvertCount": "Konvertiere {count} {count, plural, =1{Titel}other{Titel}}", + "selectionConvertCount": "Konvertiere {count} {count, plural, one {}=1{Titel}other{Titel}}", "@selectionConvertCount": { "description": "Convert button text with count in selection mode", "placeholders": { @@ -3521,7 +3521,7 @@ "@selectionBatchConvertConfirmTitle": { "description": "Confirmation dialog title for batch conversion" }, - "selectionBatchConvertConfirmMessage": "Konvertiere {count} {format} {count, plural, =1{Titel} other{Titel}} zu {bitrate}?\n\nOriginaldateien werden nach der Konvertierung gelöscht.", + "selectionBatchConvertConfirmMessage": "Konvertiere {count} {format} {count, plural, one {}=1{Titel} other{Titel}} zu {bitrate}?\n\nOriginaldateien werden nach der Konvertierung gelöscht.", "@selectionBatchConvertConfirmMessage": { "description": "Confirmation dialog message for batch conversion", "placeholders": { @@ -3536,7 +3536,7 @@ } } }, - "selectionBatchConvertConfirmMessageLossless": "Konvertiere {count} {count, plural, =1{Titel} other{Titel}} in {format}? (kein Qualitätsverlust)\n\nOriginaldateien werden nach der Konvertierung gelöscht.", + "selectionBatchConvertConfirmMessageLossless": "Konvertiere {count} {count, plural, one {}=1{Titel} other{Titel}} in {format}? (kein Qualitätsverlust)\n\nOriginaldateien werden nach der Konvertierung gelöscht.", "@selectionBatchConvertConfirmMessageLossless": { "description": "Confirmation dialog message for lossless batch conversion", "placeholders": { @@ -3584,15 +3584,15 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Interpret-Ordner verwenden Album-Interpret, sofern vorhanden", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Ordner benannt nach dem Tag des Albumkünstlers", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when Album Artist is used for folder naming" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Künstler-Ordner nur für Titel-Künstler", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Ordner benannt nach dem Tag des Künstlers", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when Track Artist is used for folder naming" }, - "lyricsProvidersTitle": "Lyrics-Anbieter", + "lyricsProvidersTitle": "Priorität des Lyrics-Anbieters", "@lyricsProvidersTitle": { "description": "Title for the lyrics provider priority page" }, @@ -3622,19 +3622,19 @@ } } }, - "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", + "lyricsProvidersAtLeastOne": "Mindestens ein Anbieter muss aktiviert bleiben", "@lyricsProvidersAtLeastOne": { "description": "Snackbar when user tries to disable the last enabled provider" }, - "lyricsProvidersSaved": "Lyrics provider priority saved", + "lyricsProvidersSaved": "Priorität des Lyrics-Anbieters gespeichert", "@lyricsProvidersSaved": { "description": "Snackbar after saving lyrics provider priority" }, - "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", + "lyricsProvidersDiscardContent": "Ungespeicherte Änderungen die verloren gehen.", "@lyricsProvidersDiscardContent": { "description": "Body text of the discard-changes dialog on lyrics provider page" }, - "lyricsProviderLrclibDesc": "Open-source synced lyrics database", + "lyricsProviderLrclibDesc": "Open-Source-Synchronisierte Lyrics-Datenbank", "@lyricsProviderLrclibDesc": { "description": "Description for LRCLIB provider" }, @@ -3670,15 +3670,15 @@ "@safMigrationMessage2": { "description": "Second paragraph of SAF migration dialog" }, - "safMigrationSuccess": "Download folder updated to SAF mode", + "safMigrationSuccess": "Download-Ordner auf SAF-Modus aktualisiert", "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Unterstützen", + "settingsDonate": "Unterstütze die Entwicklung", "@settingsDonate": { "description": "Settings menu item - donate" }, - "settingsDonateSubtitle": "Unterstütze die SpotiFLAC-Mobile Entwickler", + "settingsDonateSubtitle": "Kaufe dem Entwickler einen Kaffee", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, @@ -3699,7 +3699,7 @@ } } }, - "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", + "snackbarAddedTracksToLoved": "{count} titel zu geliebt hinzugefügt", "@snackbarAddedTracksToLoved": { "description": "Snackbar after adding multiple tracks to Loved folder", "placeholders": { @@ -3712,7 +3712,7 @@ "@dialogDownloadAllTitle": { "description": "Dialog title for bulk download confirmation" }, - "dialogDownloadAllMessage": "Download {count} tracks?", + "dialogDownloadAllMessage": "{count} titel herunterladen?", "@dialogDownloadAllMessage": { "description": "Body of the Download All confirmation dialog", "placeholders": { @@ -3721,7 +3721,7 @@ } } }, - "homeSkipAlreadyDownloaded": "Skip already downloaded songs", + "homeSkipAlreadyDownloaded": "Bereits heruntergeladene Titel überspringen", "@homeSkipAlreadyDownloaded": { "description": "Checkbox label in import dialog to skip already-downloaded songs" }, @@ -3729,23 +3729,23 @@ "@homeGoToAlbum": { "description": "Context menu item to navigate to the album page" }, - "homeAlbumInfoUnavailable": "Album info not available", + "homeAlbumInfoUnavailable": "Albuminfo nicht verfügbar", "@homeAlbumInfoUnavailable": { "description": "Snackbar when album info cannot be loaded" }, - "snackbarLoadingCueSheet": "Loading CUE sheet...", + "snackbarLoadingCueSheet": "CAE-Sheet wird geladen...", "@snackbarLoadingCueSheet": { "description": "Snackbar while loading a CUE sheet file" }, - "snackbarMetadataSaved": "Metadata saved successfully", + "snackbarMetadataSaved": "Metadaten erfolgreich gespeichert", "@snackbarMetadataSaved": { "description": "Snackbar after successfully saving track metadata" }, - "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", + "snackbarFailedToEmbedLyrics": "Fehler beim Einbinden der Lyrics", "@snackbarFailedToEmbedLyrics": { "description": "Snackbar when lyrics embedding fails" }, - "snackbarFailedToWriteStorage": "Failed to write back to storage", + "snackbarFailedToWriteStorage": "Fehler beim Zurückschreiben in den Speicher", "@snackbarFailedToWriteStorage": { "description": "Snackbar when writing metadata back to file fails" }, @@ -3758,35 +3758,35 @@ } } }, - "snackbarNoActionDefined": "No action defined for this button", + "snackbarNoActionDefined": "Keine Aktion für Taste definiert", "@snackbarNoActionDefined": { "description": "Snackbar when an extension button has no action configured" }, - "noTracksFoundForAlbum": "No tracks found for this album", + "noTracksFoundForAlbum": "Keine Titel in diesem Album gefunden", "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose storage mode for downloaded files.", + "downloadLocationSubtitle": "Wählen Sie den Speicherort für Ihre heruntergeladenen Titel", "@downloadLocationSubtitle": { "description": "Subtitle text in Android download location bottom sheet" }, - "storageModeAppFolder": "App folder (non-SAF)", + "storageModeAppFolder": "App-Ordner (empfohlen)", "@storageModeAppFolder": { "description": "Storage mode option - use legacy app folder" }, - "storageModeAppFolderSubtitle": "Use default Music/SpotiFLAC path", + "storageModeAppFolderSubtitle": "Standardmäßig in Music/SpotiFLAC speichern", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "SAF-Ordner", + "storageModeSaf": "Benutzerdefinierter Ordner (SAF)", "@storageModeSaf": { "description": "Storage mode option - use Android SAF picker" }, - "storageModeSafSubtitle": "Pick folder via Android Storage Access Framework", + "storageModeSafSubtitle": "Wähle einen beliebigen Ordner, inklusive SD-Karte", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFilenameDescription": "Customize how your files are named.", + "downloadFilenameDescription": "Verwende {artist}, {title}, {album}, {track}, {year}, {date}, {disc} als Platzhalter.", "@downloadFilenameDescription": { "description": "Description text in filename format bottom sheet" }, @@ -3794,31 +3794,31 @@ "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Albums/ and Singles/ folders", + "downloadSeparateSinglesEnabled": "Singles und EPs werden in einem separaten Ordner gespeichert", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is enabled" }, - "downloadSeparateSinglesDisabled": "All files in same structure", + "downloadSeparateSinglesDisabled": "Singles und Alben im selben Ordner gespeichert", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is disabled" }, - "downloadArtistNameFilters": "Artist Name Filters", + "downloadArtistNameFilters": "Künstlernamen-Filter", "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Create playlist source folder", + "downloadCreatePlaylistSourceFolder": "Playlist-Quellordner", "@downloadCreatePlaylistSourceFolder": { "description": "Setting title for adding a playlist folder prefix before the normal organization structure" }, - "downloadCreatePlaylistSourceFolderEnabled": "Playlist downloads use Playlist/ plus your normal folder structure.", + "downloadCreatePlaylistSourceFolderEnabled": "Für jede Playlist wird ein Unterordner erstellt", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist source folder prefix is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "Playlist downloads use the normal folder structure only.", + "downloadCreatePlaylistSourceFolderDisabled": "Alle Titel direkt im Download-Ordner gespeichert", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist source folder prefix is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "By Playlist already places downloads inside a playlist folder.", + "downloadCreatePlaylistSourceFolderRedundant": "Wird durch die Ordnerorganisationseinstellung verarbeitet", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when playlist folder prefix setting is redundant because folder organization is already by playlist" }, @@ -3830,83 +3830,83 @@ "@downloadNetworkCompatibilityMode": { "description": "Setting title for network compatibility toggle" }, - "downloadNetworkCompatibilityModeEnabled": "Enabled: try HTTP + accept invalid TLS certificates (unsafe)", + "downloadNetworkCompatibilityModeEnabled": "Verwendung der Legacy-TLS-Einstellungen für ältere Netzwerke", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is enabled" }, - "downloadNetworkCompatibilityModeDisabled": "Off: strict HTTPS certificate validation (recommended)", + "downloadNetworkCompatibilityModeDisabled": "Standard-Netzwerkeinstellungen verwenden", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is disabled" }, - "downloadSelectServiceToEnable": "Select a built-in service to enable", + "downloadSelectServiceToEnable": "Wähle Tidal oder Qobuz, um diese Option zu aktivieren", "@downloadSelectServiceToEnable": { "description": "Hint shown instead of Ask-quality subtitle when no built-in service selected" }, - "downloadSelectTidalQobuz": "Select Tidal or Qobuz above to configure quality", + "downloadSelectTidalQobuz": "Wähle Tidal oder Qobuz, um die Audioqualität auszuwählen", "@downloadSelectTidalQobuz": { "description": "Info hint when non-Tidal/Qobuz service is selected" }, - "downloadEmbedLyricsDisabled": "Disabled while Embed Metadata is turned off", + "downloadEmbedLyricsDisabled": "Metadaten-Einbettung zuerst aktivieren", "@downloadEmbedLyricsDisabled": { "description": "Subtitle for Embed Lyrics when Embed Metadata is disabled" }, - "downloadNeteaseIncludeTranslation": "Netease: Include Translation", + "downloadNeteaseIncludeTranslation": "Netease: Übersetzung einschließen", "@downloadNeteaseIncludeTranslation": { "description": "Toggle title for including Netease translated lyrics" }, - "downloadNeteaseIncludeTranslationEnabled": "Append translated lyrics when available", + "downloadNeteaseIncludeTranslationEnabled": "Chinesische Übersetzungszeilen enthalten", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is enabled" }, - "downloadNeteaseIncludeTranslationDisabled": "Use original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Original Lyrics verwenden", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is disabled" }, - "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", + "downloadNeteaseIncludeRomanization": "Netease: Romanisierung einschließen", "@downloadNeteaseIncludeRomanization": { "description": "Toggle title for including Netease romanized lyrics" }, - "downloadNeteaseIncludeRomanizationEnabled": "Append romanized lyrics when available", + "downloadNeteaseIncludeRomanizationEnabled": "Romanisierungszeilen enthalten", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is enabled" }, - "downloadNeteaseIncludeRomanizationDisabled": "Deaktiviert", + "downloadNeteaseIncludeRomanizationDisabled": "Keine Romanisierung", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is disabled" }, - "downloadAppleQqMultiPerson": "Apple/QQ Multi-Person Word-by-Word", + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Personen-Lyrics", "@downloadAppleQqMultiPerson": { "description": "Toggle title for Apple/QQ multi-person word-by-word lyrics" }, - "downloadAppleQqMultiPersonEnabled": "Enable v1/v2 speaker and [bg:] tags", + "downloadAppleQqMultiPersonEnabled": "Sängerlabel für Duette und Gruppentitel enthalten", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person word-by-word is enabled" }, - "downloadAppleQqMultiPersonDisabled": "Simplified word-by-word formatting", + "downloadAppleQqMultiPersonDisabled": "Standardlyrics ohne Lautsprecher-Labels", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person word-by-word is disabled" }, - "downloadMusixmatchLanguage": "Musixmatch Language", + "downloadMusixmatchLanguage": "Musixmatch Sprache", "@downloadMusixmatchLanguage": { "description": "Setting title for Musixmatch language preference" }, - "downloadMusixmatchLanguageAuto": "Auto (original)", + "downloadMusixmatchLanguageAuto": "Auto (Originalsprache)", "@downloadMusixmatchLanguageAuto": { "description": "Option label when Musixmatch uses original language" }, - "downloadFilterContributing": "Filter contributing artists in Album Artist", + "downloadFilterContributing": "Mitwirkende Künstler filtern", "@downloadFilterContributing": { "description": "Toggle title for filtering contributing artists in Album Artist metadata" }, - "downloadFilterContributingEnabled": "Album Artist metadata uses primary artist only", + "downloadFilterContributingEnabled": "Mitwirkende Künstler vom Albumname des Künstlers entfernt", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is enabled" }, - "downloadFilterContributingDisabled": "Keep full Album Artist metadata value", + "downloadFilterContributingDisabled": "Volle Album Künstler String verwendet", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is disabled" }, - "downloadProvidersNoneEnabled": "Keine aktiviert", + "downloadProvidersNoneEnabled": "Keine Anbieter aktiviert", "@downloadProvidersNoneEnabled": { "description": "Subtitle for lyrics providers setting when no providers are enabled" }, @@ -3914,11 +3914,11 @@ "@downloadMusixmatchLanguageCode": { "description": "Label for the Musixmatch language code text field" }, - "downloadMusixmatchLanguageHint": "auto / en / es / ja", + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Hint text for the Musixmatch language code field" }, - "downloadMusixmatchLanguageDesc": "Set preferred language code (example: en, es, ja). Leave empty for auto.", + "downloadMusixmatchLanguageDesc": "Gib einen BCP-47 Sprachcode ein (z.B. en, de, ja), um übersetzte Lyrics von Musixmatch anzufordern.", "@downloadMusixmatchLanguageDesc": { "description": "Description in the Musixmatch language picker" }, @@ -3926,19 +3926,19 @@ "@downloadMusixmatchAuto": { "description": "Button to reset Musixmatch language to automatic" }, - "downloadNetworkAnySubtitle": "WLAN + Mobile Daten", + "downloadNetworkAnySubtitle": "WLAN oder mobile Daten verwenden", "@downloadNetworkAnySubtitle": { "description": "Subtitle for 'Any' network mode option" }, - "downloadNetworkWifiOnlySubtitle": "Pause downloads on mobile data", + "downloadNetworkWifiOnlySubtitle": "Downloads bei mobilen Daten pausieren", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for 'WiFi only' network mode option" }, - "downloadSongLinkRegionDesc": "Used as userCountry for SongLink API lookup.", + "downloadSongLinkRegionDesc": "Region, die beim Auflösen von Titellinks über SongLink verwendet wird. Wähle das Land, in dem der Streaming-Dienste verfügbar sind.", "@downloadSongLinkRegionDesc": { "description": "Description in the SongLink region picker" }, - "snackbarUnsupportedAudioFormat": "Unsupported audio format", + "snackbarUnsupportedAudioFormat": "Nicht unterstütztes Audioformat", "@snackbarUnsupportedAudioFormat": { "description": "Snackbar when the audio format is not supported for the requested operation" }, @@ -3946,7 +3946,7 @@ "@cacheRefresh": { "description": "Tooltip for refresh button on cache management page" }, - "dialogDownloadPlaylistsMessage": "Lade {trackCount} {trackCount, plural, =1{Titel} other{Titel}} von {playlistCount} {playlistCount, plural, =1{Playlist} other{Playlists}}?", + "dialogDownloadPlaylistsMessage": "Lade {trackCount} {trackCount, plural, one {}=1{Titel} other{Titel}} von {playlistCount} {playlistCount, plural, one {}=1{Playlist} other{Playlists}}?", "@dialogDownloadPlaylistsMessage": { "description": "Dialog message for bulk playlist download confirmation", "placeholders": { @@ -3958,7 +3958,7 @@ } } }, - "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", + "bulkDownloadPlaylistsButton": "Lade {count} {count, plural, one {}=1{Playlist} other{Playlists}} herunter", "@bulkDownloadPlaylistsButton": { "description": "Button label for bulk downloading selected playlists", "placeholders": { @@ -3967,15 +3967,15 @@ } } }, - "bulkDownloadSelectPlaylists": "Select playlists to download", + "bulkDownloadSelectPlaylists": "Playlist zum Herunterladen wählen", "@bulkDownloadSelectPlaylists": { "description": "Button label when no playlists are selected for download" }, - "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", + "snackbarSelectedPlaylistsEmpty": "Ausgewählte Playlisten haben keine Titel", "@snackbarSelectedPlaylistsEmpty": { "description": "Snackbar when selected playlists contain no tracks" }, - "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "playlistsCount": "{count, plural, one {}=1{1 Playlist} other{{count} Playlists}}", "@playlistsCount": { "description": "Playlist count display", "placeholders": { @@ -3984,11 +3984,11 @@ } } }, - "editMetadataAutoFill": "Auto-fill from online", + "editMetadataAutoFill": "Aus online ausfüllen", "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Select fields to fill automatically from online metadata", + "editMetadataAutoFillDesc": "Wähle Felder aus, die automatisch aus Online-Metadaten ausgefüllt werden sollen", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, @@ -3996,15 +3996,15 @@ "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" }, - "editMetadataAutoFillSearching": "Searching online...", + "editMetadataAutoFillSearching": "Online suchen...", "@editMetadataAutoFillSearching": { "description": "Snackbar shown while searching for online metadata" }, - "editMetadataAutoFillNoResults": "No matching metadata found online", + "editMetadataAutoFillNoResults": "Keine passenden Metadaten online gefunden", "@editMetadataAutoFillNoResults": { "description": "Snackbar when online metadata search returns no results" }, - "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", + "editMetadataAutoFillDone": "{count} {count, plural, one {}=1{Feld} other{Felder}} aus Online-Metadaten gefüllt", "@editMetadataAutoFillDone": { "description": "Snackbar confirming how many fields were auto-filled", "placeholders": { @@ -4013,7 +4013,7 @@ } } }, - "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", + "editMetadataAutoFillNoneSelected": "Wähle mindestens ein Feld zum automatischen Ausfüllen aus", "@editMetadataAutoFillNoneSelected": { "description": "Snackbar when user taps Fetch without selecting any fields" }, @@ -4073,7 +4073,7 @@ "@editMetadataSelectEmpty": { "description": "Button to select only fields that are currently empty" }, - "queueDownloadingCount": "Downloading ({count})", + "queueDownloadingCount": "{count} werden heruntergeladen", "@queueDownloadingCount": { "description": "Header for active downloads section with count", "placeholders": { @@ -4090,7 +4090,7 @@ "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" }, - "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", + "queueTrackCount": "{count, plural, =1{1 Titel} other{{count} Titel}}", "@queueTrackCount": { "description": "Track count label with plural support", "placeholders": { @@ -4099,7 +4099,7 @@ } } }, - "queueAlbumCount": "{count, plural, =1{1 album} other{{count} albums}}", + "queueAlbumCount": "{count, plural, =1{1 Album} other{{count} Alben}}", "@queueAlbumCount": { "description": "Album count label with plural support", "placeholders": { @@ -4112,31 +4112,31 @@ "@queueEmptyAlbums": { "description": "Empty state title when no album downloads exist" }, - "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", + "queueEmptyAlbumsSubtitle": "Lade mehrere Titel eines Albums herunter, um sie hier zu sehen", "@queueEmptyAlbumsSubtitle": { "description": "Empty state subtitle for album downloads" }, - "queueEmptySingles": "No single downloads", + "queueEmptySingles": "Kein Single Download", "@queueEmptySingles": { "description": "Empty state title when no single track downloads exist" }, - "queueEmptySinglesSubtitle": "Single track downloads will appear here", + "queueEmptySinglesSubtitle": "Einzelne Titel-Downloads werden hier angezeigt", "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, - "queueEmptyHistory": "No download history", + "queueEmptyHistory": "Kein Download-Verlauf", "@queueEmptyHistory": { "description": "Empty state title when download history is empty" }, - "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", + "queueEmptyHistorySubtitle": "Heruntergeladene Titel werden hier angezeigt", "@queueEmptyHistorySubtitle": { "description": "Empty state subtitle for download history" }, - "selectionAllPlaylistsSelected": "All playlists selected", + "selectionAllPlaylistsSelected": "Alle Playlists ausgewählt", "@selectionAllPlaylistsSelected": { "description": "Shown when all playlists are selected in selection mode" }, - "selectionTapPlaylistsToSelect": "Tap playlists to select", + "selectionTapPlaylistsToSelect": "Zum Auswählen auf Playlists tippen", "@selectionTapPlaylistsToSelect": { "description": "Hint shown in playlist selection mode" }, @@ -4144,11 +4144,11 @@ "@selectionSelectPlaylistsToDelete": { "description": "Hint shown when no playlists are selected for deletion" }, - "audioAnalysisTitle": "Audio Quality Analysis", + "audioAnalysisTitle": "Audio-Qualitätsanalyse", "@audioAnalysisTitle": { "description": "Title for audio analysis section" }, - "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", + "audioAnalysisDescription": "Verlustfreie Qualität mit Spektrumanalyse überprüfen", "@audioAnalysisDescription": { "description": "Description for audio analysis tap-to-analyze prompt" }, @@ -4196,15 +4196,15 @@ "@audioAnalysisSamples": { "description": "Total samples metric label" }, - "audioAnalysisRescan": "Re-analyze", + "audioAnalysisRescan": "Neu analysieren", "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Audio wird analysiert...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Search with {providerName}", + "extensionsSearchWith": "Mit {providerName} suchen", "@extensionsSearchWith": { "description": "Extensions page - subtitle for built-in search provider option", "placeholders": { @@ -4217,7 +4217,7 @@ "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" }, - "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", + "extensionsHomeFeedDescription": "Wählen Sie die Erweiterung aus, die den Start-Feed auf dem Hauptbildschirm anzeigt", "@extensionsHomeFeedDescription": { "description": "Extensions page - description for home feed provider picker" }, @@ -4225,11 +4225,11 @@ "@extensionsHomeFeedAuto": { "description": "Extensions page - home feed provider option: auto" }, - "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", + "extensionsHomeFeedAutoSubtitle": "Automatisch die besten verfügbaren auswählen", "@extensionsHomeFeedAutoSubtitle": { "description": "Extensions page - subtitle for auto home feed option" }, - "extensionsHomeFeedUse": "Use {extensionName} home feed", + "extensionsHomeFeedUse": "{extensionName} Home Feed verwenden", "@extensionsHomeFeedUse": { "description": "Extensions page - subtitle for a specific extension home feed option", "placeholders": { @@ -4238,7 +4238,7 @@ } } }, - "extensionsNoHomeFeedExtensions": "No extensions with home feed", + "extensionsNoHomeFeedExtensions": "Keine Erweiterungen mit Home-Feed", "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, @@ -4254,7 +4254,7 @@ "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" }, - "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", + "cancelDownloadContent": "Dadurch wird der aktive Download für \"{trackName}\" abgebrochen.", "@cancelDownloadContent": { "description": "Dialog body when confirming cancellation of an active download", "placeholders": { @@ -4267,15 +4267,15 @@ "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, - "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", + "metadataSaveFailedFfmpeg": "Fehler beim Speichern der Metadaten über FFmpeg", "@metadataSaveFailedFfmpeg": { "description": "Snackbar error when FFmpeg fails to write metadata" }, - "metadataSaveFailedStorage": "Failed to write metadata back to storage", + "metadataSaveFailedStorage": "Metadaten konnten nicht zurück in den Speicher geschrieben werden", "@metadataSaveFailedStorage": { "description": "Snackbar error when writing metadata file back to storage fails" }, - "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", + "snackbarFolderPickerFailed": "Fehler beim Öffnen des Ordners: {error}", "@snackbarFolderPickerFailed": { "description": "Snackbar shown when folder picker fails to open", "placeholders": { @@ -4300,7 +4300,7 @@ "@notifChannelDownloadName": { "description": "Android notification channel name for download progress" }, - "notifChannelDownloadDesc": "Shows download progress for tracks", + "notifChannelDownloadDesc": "Zeigt Download-Fortschritt für Titel an", "@notifChannelDownloadDesc": { "description": "Android notification channel description for download progress" }, @@ -4308,11 +4308,11 @@ "@notifChannelLibraryScanName": { "description": "Android notification channel name for library scan" }, - "notifChannelLibraryScanDesc": "Shows local library scan progress", + "notifChannelLibraryScanDesc": "Zeigt den Fortschritt des lokalen Bibliotheksscans an", "@notifChannelLibraryScanDesc": { "description": "Android notification channel description for library scan" }, - "notifDownloadingTrack": "Downloading {trackName}", + "notifDownloadingTrack": "{trackName} wird heruntergeladen", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", "placeholders": { @@ -4321,7 +4321,7 @@ } } }, - "notifFinalizingTrack": "Finalizing {trackName}", + "notifFinalizingTrack": "{trackName} wird fertiggestellt", "@notifFinalizingTrack": { "description": "Notification title while finalizing (embedding metadata) a track", "placeholders": { @@ -4330,11 +4330,11 @@ } } }, - "notifEmbeddingMetadata": "Embedding metadata...", + "notifEmbeddingMetadata": "Bette Metadaten ein...", "@notifEmbeddingMetadata": { "description": "Notification body while embedding metadata into a downloaded track" }, - "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", + "notifAlreadyInLibraryCount": "Bereits in der Bibliothek ({completed}/{total})", "@notifAlreadyInLibraryCount": { "description": "Notification title when track is already in library, with count", "placeholders": { @@ -4350,7 +4350,7 @@ "@notifAlreadyInLibrary": { "description": "Notification title when track is already in library" }, - "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", + "notifDownloadCompleteCount": "Download abgeschlossen ({completed}/{total})", "@notifDownloadCompleteCount": { "description": "Notification title when download is complete, with count", "placeholders": { @@ -4366,7 +4366,7 @@ "@notifDownloadComplete": { "description": "Notification title when a single download is complete" }, - "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", + "notifDownloadsFinished": "Downloads abgeschlossen ({completed} fertig, {failed} fehlgeschlagen)", "@notifDownloadsFinished": { "description": "Notification title when queue finishes with some failures", "placeholders": { @@ -4378,11 +4378,11 @@ } } }, - "notifAllDownloadsComplete": "All Downloads Complete", + "notifAllDownloadsComplete": "Alle Downloads abgeschlossen", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count} tracks downloaded successfully", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 Titel erfolgreich heruntergeladen} other{{count} Titel erfolgreich heruntergeladen}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -4391,11 +4391,11 @@ } } }, - "notifScanningLibrary": "Scanning local library", + "notifScanningLibrary": "Scanne lokale Bibliothek", "@notifScanningLibrary": { "description": "Notification title while scanning local library" }, - "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", + "notifLibraryScanProgressWithTotal": "{scanned}/{total} Dateien • {percentage}%", "@notifLibraryScanProgressWithTotal": { "description": "Notification body for library scan progress when total is known", "placeholders": { @@ -4410,7 +4410,7 @@ } } }, - "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", + "notifLibraryScanProgressNoTotal": "{scanned} gescannte Dateien • {percentage}%", "@notifLibraryScanProgressNoTotal": { "description": "Notification body for library scan progress when total is unknown", "placeholders": { @@ -4422,11 +4422,11 @@ } } }, - "notifLibraryScanComplete": "Library scan complete", + "notifLibraryScanComplete": "Bibliotheksscan abgeschlossen", "@notifLibraryScanComplete": { "description": "Notification title when library scan finishes" }, - "notifLibraryScanCompleteBody": "{count} tracks indexed", + "notifLibraryScanCompleteBody": "{count} titel indiziert", "@notifLibraryScanCompleteBody": { "description": "Notification body for library scan complete - number of indexed tracks", "placeholders": { @@ -4453,19 +4453,19 @@ } } }, - "notifLibraryScanFailed": "Library scan failed", + "notifLibraryScanFailed": "Bibliotheksscan fehlgeschlagen", "@notifLibraryScanFailed": { "description": "Notification title when library scan fails" }, - "notifLibraryScanCancelled": "Library scan cancelled", + "notifLibraryScanCancelled": "Bibliotheksscan abgebrochen", "@notifLibraryScanCancelled": { "description": "Notification title when library scan is cancelled by the user" }, - "notifLibraryScanStopped": "Scan stopped before completion.", + "notifLibraryScanStopped": "Scan wurde vor Abschluss gestoppt.", "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, - "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", + "notifDownloadingUpdate": "SpotiFLAC Mobile v{version} wird heruntergeladen", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", "placeholders": { @@ -4493,7 +4493,7 @@ "@notifUpdateReady": { "description": "Notification title when app update download is complete" }, - "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", + "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} heruntergeladen. Zum Installieren tippen.", "@notifUpdateReadyBody": { "description": "Notification body when app update is ready to install", "placeholders": { @@ -4506,23 +4506,23 @@ "@notifUpdateFailed": { "description": "Notification title when app update download fails" }, - "notifUpdateFailedBody": "Could not download update. Try again later.", + "notifUpdateFailedBody": "Update konnte nicht heruntergeladen werden. Versuche es später erneut.", "@notifUpdateFailedBody": { "description": "Notification body when app update download fails" }, - "settingsFiles": "Files & Folders", + "settingsFiles": "Dateien & Ordner", "@settingsFiles": { "description": "Settings menu item - file and folder settings" }, - "settingsFilesSubtitle": "Download location, filename, folder structure", + "settingsFilesSubtitle": "Speicherort, Dateiname, Ordnerstruktur", "@settingsFilesSubtitle": { "description": "Subtitle for files & folders settings" }, - "settingsMetadata": "Metadata", + "settingsMetadata": "Metadaten", "@settingsMetadata": { "description": "Settings menu item - metadata settings" }, - "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", + "settingsMetadataSubtitle": "Cover Art, Tags, ReplayGain, Anbieter", "@settingsMetadataSubtitle": { "description": "Subtitle for metadata settings" }, @@ -4530,7 +4530,7 @@ "@settingsLyrics": { "description": "Settings menu item - lyrics settings" }, - "settingsLyricsSubtitle": "Embed, mode, providers, language options", + "settingsLyricsSubtitle": "Einbetten, Modus, Anbieter, Sprachoptionen", "@settingsLyricsSubtitle": { "description": "Subtitle for lyrics settings" }, @@ -4538,48 +4538,1021 @@ "@settingsApp": { "description": "Settings menu item - app settings" }, - "settingsAppSubtitle": "Updates, data, extension repo, debug", + "settingsAppSubtitle": "Updates, Daten, Erweiterungsrepo, Debug", "@settingsAppSubtitle": { "description": "Subtitle for app settings" }, - "sectionMetadataProviders": "Providers", + "sectionMetadataProviders": "Anbieter", "@sectionMetadataProviders": { "description": "Settings section header for metadata providers" }, - "sectionDuplicates": "Duplicates", + "sectionDuplicates": "Duplikate", "@sectionDuplicates": { "description": "Settings section header for deduplication" }, - "sectionLyricsProviderOptions": "Provider Options", + "sectionLyricsProviderOptions": "Anbieter-Optionen", "@sectionLyricsProviderOptions": { "description": "Settings section header for per-provider lyrics options" }, - "metadataProvidersTitle": "Metadata Provider Priority", + "metadataProvidersTitle": "Priorität des Metadaten-Anbieters", "@metadataProvidersTitle": { "description": "Settings item title for metadata provider order" }, - "metadataProvidersSubtitle": "Drag to set search and metadata source order", + "metadataProvidersSubtitle": "Zieh, um Such- und Metadatenquellenreihenfolge zu setzen", "@metadataProvidersSubtitle": { "description": "Subtitle for metadata provider priority item" }, - "downloadDeduplication": "Skip Duplicate Downloads", + "downloadDeduplication": "Doppelte Downloads überspringen", "@downloadDeduplication": { "description": "Setting - skip tracks already in download history" }, - "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", + "downloadDeduplicationEnabled": "Bereits heruntergeladene Titel werden übersprungen", "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, - "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", + "downloadDeduplicationDisabled": "Alle Titel werden unabhängig vom Verlauf heruntergeladen", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, - "downloadFallbackExtensions": "Fallback Extensions", + "downloadFallbackExtensions": "Fallback-Erweiterungen", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" }, - "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", + "downloadFallbackExtensionsSubtitle": "Wähle, welche Erweiterungen als Fallback verwendet werden können", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" + }, + "homeEmptyTitle": "Noch keine Suchanbieter", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Installiere eine Erweiterung um fortzufahren.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "setupLanguageTitle": "Sprache auswählen", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Wählen deine bevorzugte Sprache für die App. Dies kann später in den Einstellungen geändert werden.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "Systemstandard", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "trackLyricsSource": "Quelle: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "extensionsInstalledCount": "{count} Erweiterungen erfolgreich installiert", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "{installed} von {attempted} Erweiterungen installiert", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Beste mobile Kompatibilität, M4A Container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "collectionFavoriteArtists": "Lieblingskünstler", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionArtistCount": "{count, plural, one {}=1{1 Künstler} other{{count} Künstler}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionFavoriteArtistsEmptyTitle": "Noch keine Lieblingskünstler", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tippe auf das Herz auf einer Künstlerseite, um sie hier zu sehen", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" zu Lieblingskünstlern hinzugefügt", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" entfernt aus Lieblingskünstlern", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "artistOptionAddToFavorites": "Zu Favoriten hinzufügen", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Aus Favoriten entfernen", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Rohe Zeitstempel erhalten", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Sichere Line-by-line Apple Music Texte", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Dekodiertes Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "Kein Clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spektralschnitt", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Pro Kanal Statistik", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "extensionsHomeFeedOff": "Aus", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Start-Feed nicht auf dem Hauptbildschirm anzeigen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 Titel heruntergeladen}other{{completed} Titel heruntergeladen}}, {failed, plural, =1{1 fehlgeschlagen} other{{failed} fehlgeschlagen}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads abgebrochen", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, one {}=1{1 Download vom Nutzer abgebrochen} other{{count} Downloads vom Nutzer abgebrochen}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "searchTracks": "Titel", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Unterstützte URL einfügen oder suchen...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Mit {providerName} suchen...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "CSV-Datei importieren", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Suchanbieter ändern", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Einfügen", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Titel suchen...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Nach Titel suchen", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Einfügen oder suchen...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download abgeschlossen", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download wird ausgeführt", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Download starten", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Eingebettete Metadaten", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Schreibe Metadaten, Cover und eingebettete Songtexte in Dateien", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Deaktiviert (erweitert): Metadateneinbettung überspringen", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Deaktiviert, wenn Metadateneinbettung aus ist", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "Kein eingebettetes Albumcover gefunden", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Cover ersetzen", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Cover auswählen", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Ausgewähltes Cover löschen", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Aktuelles Cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Ausgewähltes Cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "Das ausgewählte Cover ersetzt das aktuell eingebettete Cover, wenn auf speichern gedrückt wird.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Download wird abgeschlossen", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Heruntergeladene Datei fehlt", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download abgeschlossen", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Wähle Akzentfarbe {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-Scrollen AN", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-Scrollen AUS", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Logs kopieren", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Suche löschen", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKIERUNG ERKANNT", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Dein ISP blockiert möglicherweise den Zugriff auf den Download Dienst", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Versuche es einem VPN oder ändere DNS auf 1.1.1.1 oder 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "LIMIT ERKANNT", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Zu viele Anfragen an den Dienst", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Warte ein paar Minuten, bevor du es erneut versuchst", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETZWERKFEHLER", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Verbindungsprobleme erkannt", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Überprüfe deine Internetverbindung", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TITEL NICHT GEFUNDEN", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Einige Titel konnten auf Download-Diensten nicht gefunden werden", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "Der Titel ist möglicherweise nicht in verlustfreier Qualität verfügbar", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Künstler wird gesucht...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} Informationen nicht verfügbar", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Info", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Hilfsfunktionen", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Schließen", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Ordner ändern", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Öffne Track {trackName} von {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "{itemType} {name} öffnen", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Öffne {title}, {count} {count, plural,=1{Item}other{Items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Öffne Album {albumName} von {artistName}, {trackCount} Titel", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} von {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Wähle Album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Album öffnen {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "editMetadataFieldDateHint": "JJJJ-MM-TT oder JJJJJ", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Titel insgesamt", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc gesamt", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Komponist", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Kommentar", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Erweitert", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Fehlende Tracknummer", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Fehlende Disc-Nummer", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Fehlender Künstler", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Falsches ISRC-Format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Label fehlt", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Lösche {count} {count, plural, one {}=1{Playlist} other{Playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, one {}=1{Playlist} other{Playlists}} gelöscht", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "{count} {count, plural, one {}=1{Titel} other{Titel}} zu {playlistName} hinzugefügt", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "{count} {count, plural, one {}=1{Titel} other{Titel}} zu {playlistName} ({alreadyCount} bereits in der Playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, one {}=1{Sache} other{Sachen}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadaten erfolgreich neu angereichert ({successCount}/{total}) - fehlgeschlagen: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Lösche {count} {count, plural, one {}=1{Titel}other{Titel}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Herunterladen - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "Starte...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Titel auswählen", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Titel abwählen", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Spiele {trackName} von {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, one {}=1{Erweiterung} other{Erweiterungen}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Benötigt v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Los", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Problemübersicht", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Gesamte Fehler: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Betroffen: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan abgebrochen", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "Du kannst erneut Scannen, wenn er fertig ist.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} aus dem Download-Verlauf (von der Liste ausgeschlossen)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Nativer Download Dienst", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Beta Android Dienst für Downloads von Erweiterungen", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BETA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "Dienststatus", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service-Gesundheit", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{Prüfung} other{Prüfungen}} konfiguriert", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tippe auf \"Mit Spotify verbinden\" um dieses Feld auszufüllen.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Zuletzt geprüft {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Status aktualisieren", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Benutzerdefinierte URL-Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "Diese Erweiterung kann Links von diesen Seiten benutzen", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Teile Links von diesen Seiten mit SpotiFLAC Mobile und diese Erweiterung wird sie verarbeiten.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, one {}=1{Einstellung} other{Einstellungen}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Eingeschränkt", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Nicht konfiguriert", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unbekannt", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "benötigt", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Nicht eingestellt", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Aktion fehlgeschlagen", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Wert eingeben", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Dienste online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Dienst Eingeschränkt", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Dienst offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Dienst-Status unbekannt", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Öffne in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Eingebettet", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unbekanntes Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unbekannter Künstler", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Speicher", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Benachrichtigung", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Ungültiger Ordner ausgewählt", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "Konnte nicht auf den ausgewählten Ordner zugreifen", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "Alle", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadaten", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Herunterladen", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } } } diff --git a/lib/l10n/arb/app_es_ES.arb b/lib/l10n/arb/app_es_ES.arb index 31d5f3da..c2540c05 100644 --- a/lib/l10n/arb/app_es_ES.arb +++ b/lib/l10n/arb/app_es_ES.arb @@ -1,6 +1,6 @@ { "@@locale": "es_ES", - "@@last_modified": "2026-01-16", + "@@last_modified": "2026-04-28", "appName": "SpotiFLAC Mobile", "@appName": { "description": "App name - DO NOT TRANSLATE" @@ -29,7 +29,7 @@ "@homeSubtitle": { "description": "Subtitle shown below search box" }, - "homeSupports": "Soportes: Pista, Álbum, Lista de reproducción, URLs de Artistas", + "homeSupports": "Soporte de URL: pista, álbum, listas de reproducción, artistas", "@homeSupports": { "description": "Info text about supported URL types" }, @@ -141,11 +141,11 @@ "@optionsTitle": { "description": "Options settings page title" }, - "optionsPrimaryProvider": "Proveedor Principal", + "optionsPrimaryProvider": "Proveedor principal", "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Servicio usado al buscar por nombre de la pista.", + "optionsPrimaryProviderSubtitle": "Servicio usado para buscar por canción o nombre del álbum", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, @@ -158,19 +158,19 @@ } } }, - "optionsDefaultSearchTab": "Default Search Tab", + "optionsDefaultSearchTab": "Pestaña de búsqueda por defecto", "@optionsDefaultSearchTab": { "description": "Title for the preferred default search tab setting" }, - "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "optionsDefaultSearchTabSubtitle": "Escoger cuál pestaña se abre primero para nuevos resultados de búsqueda.", "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsDefaultSearchTabAlbums": "Albums", + "optionsDefaultSearchTabAlbums": "Álbumes", "@optionsDefaultSearchTabAlbums": { "description": "Default search tab option - Albums tab" }, - "optionsDefaultSearchTabTracks": "Tracks", + "optionsDefaultSearchTabTracks": "Pistas", "@optionsDefaultSearchTabTracks": { "description": "Default search tab option - Tracks tab" }, @@ -194,15 +194,15 @@ "@optionsUseExtensionProvidersOn": { "description": "Status when extension providers enabled" }, - "optionsUseExtensionProvidersOff": "Utilizando sólo proveedores integrados", + "optionsUseExtensionProvidersOff": "Utilizando solo proveedores integrados", "@optionsUseExtensionProvidersOff": { "description": "Status when extension providers disabled" }, - "optionsEmbedLyrics": "Incrustar Letras", + "optionsEmbedLyrics": "Incrustar letras", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Insertar letras sincronizadas en archivos FLAC", + "optionsEmbedLyricsSubtitle": "Guardar letras sincronizadas con las pistas descargadas", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -214,7 +214,7 @@ "@optionsMaxQualityCoverSubtitle": { "description": "Subtitle for max quality cover" }, - "optionsReplayGain": "Nivelación de Ganancia", + "optionsReplayGain": "Nivelación de ganancia", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" }, @@ -226,7 +226,7 @@ "@optionsReplayGainSubtitleOff": { "description": "Subtitle when ReplayGain is disabled" }, - "optionsArtistTagMode": "Modo de Etiqueta de Artista", + "optionsArtistTagMode": "Modo de etiqueta de artista", "@optionsArtistTagMode": { "description": "Setting title for how artist metadata is written into files" }, @@ -242,7 +242,7 @@ "@optionsArtistTagModeJoinedSubtitle": { "description": "Subtitle for joined artist tag mode" }, - "optionsArtistTagModeSplitVorbis": "Dividir (recortar) etiquetar para FLAC/OPUS", + "optionsArtistTagModeSplitVorbis": "Dividir etiquetas para FLAC/OPUS", "@optionsArtistTagModeSplitVorbis": { "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" }, @@ -250,7 +250,7 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, - "optionsConcurrentDownloads": "Descargas Simultáneas", + "optionsConcurrentDownloads": "Descargas simultáneas", "@optionsConcurrentDownloads": { "description": "Number of parallel downloads" }, @@ -258,7 +258,7 @@ "@optionsConcurrentSequential": { "description": "Download one at a time" }, - "optionsConcurrentParallel": "{count} descargas paralelas", + "optionsConcurrentParallel": "{count} descargas en paralelo", "@optionsConcurrentParallel": { "description": "Multiple parallel downloads", "placeholders": { @@ -271,7 +271,7 @@ "@optionsConcurrentWarning": { "description": "Warning about rate limits" }, - "optionsExtensionStore": "Extensión .Repo (repositorio)", + "optionsExtensionStore": "Extensión Repo", "@optionsExtensionStore": { "description": "Show/hide store tab" }, @@ -291,7 +291,7 @@ "@optionsUpdateChannel": { "description": "Stable vs preview releases" }, - "optionsUpdateChannelStable": "Sólo versiones estables", + "optionsUpdateChannelStable": "Solo versiones estables", "@optionsUpdateChannelStable": { "description": "Only stable updates" }, @@ -378,7 +378,7 @@ "@extensionsUninstall": { "description": "Uninstall extension button" }, - "storeTitle": "Extensión .Repo", + "storeTitle": "Extensión Repo", "@storeTitle": { "description": "Store screen title" }, @@ -438,7 +438,7 @@ "@aboutPCSource": { "description": "Link to PC GitHub repo" }, - "aboutKeepAndroidOpen": "Keep Android Open", + "aboutKeepAndroidOpen": "Mantener Android activo", "@aboutKeepAndroidOpen": { "description": "Link to Keep Android Open campaign website" }, @@ -498,7 +498,7 @@ "@aboutSjdonadoDesc": { "description": "Credit description for sjdonado" }, - "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", + "aboutAppDescription": "Busca información musical, gestiona extensiones y organiza tu biblioteca.", "@aboutAppDescription": { "description": "App description in header card" }, @@ -506,7 +506,7 @@ "@artistAlbums": { "description": "Section header for artist albums" }, - "artistSingles": "Pistas y EPs", + "artistSingles": "Pistas y mini-álbumes", "@artistSingles": { "description": "Section header for singles/EPs" }, @@ -780,7 +780,7 @@ "@dialogDeleteSelectedTitle": { "description": "Dialog title - delete selected items" }, - "dialogDeleteSelectedMessage": "¿Eliminar {count} {count, plural, =1{pista} other{pistas}} del historial?\n\nEsto también eliminará los archivos del almacenamiento.", + "dialogDeleteSelectedMessage": "¿Eliminar {count} {count, plural, one {}=1{pista} other{pistas}} del historial?\n\nEsto también eliminará los archivos del almacenamiento.", "@dialogDeleteSelectedMessage": { "description": "Dialog message - delete selected tracks", "placeholders": { @@ -907,7 +907,7 @@ "@snackbarProviderPrioritySaved": { "description": "Snackbar - provider order saved" }, - "snackbarMetadataProviderSaved": "Prioridad de proveedor de metadatos guardada", + "snackbarMetadataProviderSaved": "Prioridad de proveedor de información guardada", "@snackbarMetadataProviderSaved": { "description": "Snackbar - metadata provider order saved" }, @@ -937,7 +937,7 @@ "@snackbarFailedToUpdate": { "description": "Snackbar - extension update error" }, - "errorRateLimited": "Límite Excedido", + "errorRateLimited": "Límite excedido", "@errorRateLimited": { "description": "Error title - too many requests" }, @@ -1015,7 +1015,7 @@ "@selectionSelectToDelete": { "description": "Placeholder when nothing selected" }, - "progressFetchingMetadata": "Obteniendo metadatos... {current}/{total}", + "progressFetchingMetadata": "Obteniendo información... {current}/{total}", "@progressFetchingMetadata": { "description": "Progress indicator - loading track info", "placeholders": { @@ -1107,11 +1107,11 @@ "@folderOrganizationNone": { "description": "Folder option - flat structure" }, - "folderOrganizationByPlaylist": "Por Playlist", + "folderOrganizationByPlaylist": "Por lista de reproducción", "@folderOrganizationByPlaylist": { "description": "Folder option - playlist folders" }, - "folderOrganizationByPlaylistSubtitle": "Una carpeta independiente para cada Playlist", + "folderOrganizationByPlaylistSubtitle": "Una carpeta independiente para cada lista de reproducción", "@folderOrganizationByPlaylistSubtitle": { "description": "Subtitle for playlist folder option" }, @@ -1207,11 +1207,11 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Fallback de extensión", + "providerPriorityFallbackExtensionsTitle": "Respaldo de extensión", "@providerPriorityFallbackExtensionsTitle": { "description": "Section title for choosing which download extensions can be used as fallback providers" }, - "providerPriorityFallbackExtensionsDescription": "Elije qué extensiones instaladas se pueden utilizar durante el cambio automático a una alternativa. Los proveedores integrados siguen el orden de prioridad indicado anteriormente.", + "providerPriorityFallbackExtensionsDescription": "Elija las extensiones de descarga que se usarán como respaldo automático.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" }, @@ -1227,11 +1227,11 @@ "@providerExtension": { "description": "Label for extension-provided providers" }, - "metadataProviderPriorityTitle": "Prioridad de los metadatos", + "metadataProviderPriorityTitle": "Prioridad de la información", "@metadataProviderPriorityTitle": { "description": "Metadata priority page title" }, - "metadataProviderPriorityDescription": "Arrastra para reordenar los proveedores de metadatos. La aplicación probará los proveedores de arriba hacia abajo al buscar pistas y obtener los metadatos.", + "metadataProviderPriorityDescription": "Arrastra para reordenar los proveedores de información. La aplicación probará los proveedores de arriba hacia abajo al buscar pistas y obtener la información.", "@metadataProviderPriorityDescription": { "description": "Metadata priority page description" }, @@ -1279,7 +1279,7 @@ "@logClearLogsTitle": { "description": "Clear logs dialog title" }, - "logClearLogsMessage": "¿Estás seguro que deseas limpiar todos los registros?", + "logClearLogsMessage": "¿Estás seguro qué deseas limpiar todos los registros?", "@logClearLogsMessage": { "description": "Clear logs confirmation message" }, @@ -1329,11 +1329,11 @@ "@credentialsClientIdHint": { "description": "Client ID placeholder" }, - "credentialsClientSecret": "Client Secret", + "credentialsClientSecret": "Cliente Secreto", "@credentialsClientSecret": { "description": "Client Secret field label - DO NOT TRANSLATE" }, - "credentialsClientSecretHint": "Pegar Client Secret", + "credentialsClientSecretHint": "Pegar Cliente Secreto", "@credentialsClientSecretHint": { "description": "Client Secret placeholder" }, @@ -1397,7 +1397,7 @@ "@lyricsModeEmbed": { "description": "Lyrics mode option - embed in audio file" }, - "lyricsModeEmbedSubtitle": "Letras almacenadas en los metadatos FLAC", + "lyricsModeEmbedSubtitle": "Letras almacenadas en la información FLAC", "@lyricsModeEmbedSubtitle": { "description": "Subtitle for embed option" }, @@ -1441,11 +1441,11 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Servicio, calidad, formato del nombre del archivo", + "settingsDownloadSubtitle": "Servicio, calidad, respaldo", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Alternativa, letras, carátula, actualizaciones", + "settingsOptionsSubtitle": "Respaldo, meta datos, letras, portada", "@settingsOptionsSubtitle": { "description": "Options settings description" }, @@ -1465,7 +1465,7 @@ "@pressBackAgainToExit": { "description": "Exit confirmation message" }, - "downloadAllCount": "Descargar Todo ({count})", + "downloadAllCount": "Descargar todo ({count})", "@downloadAllCount": { "description": "Download all button with count", "placeholders": { @@ -1474,7 +1474,7 @@ } } }, - "tracksCount": "{count, plural, =1{1 pista} other{{count} pistas}}", + "tracksCount": "{count, plural, one {}=1{1 pista} other{{count} pistas}}", "@tracksCount": { "description": "Track count display", "placeholders": { @@ -1495,7 +1495,7 @@ "@trackLoadLyrics": { "description": "Action - fetch lyrics" }, - "trackMetadata": "Metadatos", + "trackMetadata": "Información", "@trackMetadata": { "description": "Tab title - track metadata" }, @@ -1603,7 +1603,7 @@ "@trackLyricsEmbedded": { "description": "Snackbar - lyrics saved to file" }, - "trackInstrumental": "Pista intrumental", + "trackInstrumental": "Pista instrumental", "@trackInstrumental": { "description": "Message when track is instrumental (no lyrics)" }, @@ -1658,7 +1658,7 @@ "@storeFilterAll": { "description": "Store filter - all extensions" }, - "storeFilterMetadata": "Metadatos", + "storeFilterMetadata": "Información", "@storeFilterMetadata": { "description": "Store filter - metadata providers" }, @@ -1698,7 +1698,7 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "Ejemplo: https://github.com/user/extensions-repo", + "storeRepoUrlHelper": "e.j. https://github.com/user/extensions-repo", "@storeRepoUrlHelper": { "description": "Helper text below the repository URL input field" }, @@ -1722,7 +1722,7 @@ "@storeNewRepoUrlLabel": { "description": "Label for the new repository URL field inside the dialog" }, - "storeLoadError": "Falló al carga repositorio", + "storeLoadError": "Falló al cargar repositorio", "@storeLoadError": { "description": "Error heading when the store cannot be loaded" }, @@ -1758,7 +1758,7 @@ "@extensionCapabilities": { "description": "Section header - extension features" }, - "extensionMetadataProvider": "Proveedor de metadatos", + "extensionMetadataProvider": "Proveedor de información", "@extensionMetadataProvider": { "description": "Capability - provides metadata" }, @@ -1778,7 +1778,7 @@ "@extensionQualityOptions": { "description": "Capability - quality selection" }, - "extensionPostProcessingHooks": "Hooks post-procesamiento", + "extensionPostProcessingHooks": "Post-procesamiento de hooks", "@extensionPostProcessingHooks": { "description": "Capability - post-processing" }, @@ -1857,7 +1857,7 @@ "@extensionsInstallButton": { "description": "Button to install extension from file" }, - "extensionsInfoTip": "Las extensiones pueden añadir nuevos metadatos y proveedores de descargas. Sólo instalar extensiones desde fuentes confiables.", + "extensionsInfoTip": "Las extensiones pueden añadir nueva información y proveedores de descargas. Solo instalar extensiones desde fuentes confiables.", "@extensionsInfoTip": { "description": "Security warning about extensions" }, @@ -1873,7 +1873,7 @@ "@extensionsDownloadPrioritySubtitle": { "description": "Subtitle for download priority" }, - "extensionsFallbackTitle": "Fallback de extensiones", + "extensionsFallbackTitle": "Respaldo de extensiones", "@extensionsFallbackTitle": { "description": "Setting and page title for choosing which download extensions can be used during fallback" }, @@ -1885,15 +1885,15 @@ "@extensionsNoDownloadProvider": { "description": "Empty state - no download providers" }, - "extensionsMetadataPriority": "Prioridad de los metadatos", + "extensionsMetadataPriority": "Prioridad de la información", "@extensionsMetadataPriority": { "description": "Setting - metadata provider order" }, - "extensionsMetadataPrioritySubtitle": "Establecer orden de búsqueda y metadatos", + "extensionsMetadataPrioritySubtitle": "Establecer orden de búsqueda y información", "@extensionsMetadataPrioritySubtitle": { "description": "Subtitle for metadata priority" }, - "extensionsNoMetadataProvider": "No hay extensiones con el proveedor de metadatos", + "extensionsNoMetadataProvider": "No hay extensiones con el proveedor de información", "@extensionsNoMetadataProvider": { "description": "Empty state - no metadata providers" }, @@ -1917,19 +1917,19 @@ "@extensionsErrorLoading": { "description": "Error message when extension fails to load" }, - "qualityFlacLossless": "FLAC Lossless", + "qualityFlacLossless": "FLAC sin pérdida", "@qualityFlacLossless": { "description": "Quality option - CD quality FLAC" }, - "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", + "qualityFlacLosslessSubtitle": "16-bit / 44,1 kHz", "@qualityFlacLosslessSubtitle": { "description": "Technical spec for lossless" }, - "qualityHiResFlac": "Hi-Res FLAC", + "qualityHiResFlac": "FLAC de alta resolución", "@qualityHiResFlac": { "description": "Quality option - high resolution FLAC" }, - "qualityHiResFlacSubtitle": "24 bits/hasta 96kHz", + "qualityHiResFlacSubtitle": "24-bit / hasta 96 kHz", "@qualityHiResFlacSubtitle": { "description": "Technical spec for hi-res" }, @@ -1937,7 +1937,7 @@ "@qualityHiResFlacMax": { "description": "Quality option - maximum resolution FLAC" }, - "qualityHiResFlacMaxSubtitle": "24 bits / hasta 192kHz", + "qualityHiResFlacMaxSubtitle": "24-bit / hasta 192 kHz", "@qualityHiResFlacMaxSubtitle": { "description": "Technical spec for hi-res max" }, @@ -1953,27 +1953,27 @@ "@downloadLossy320Format": { "description": "Title of the Tidal lossy format picker bottom sheet" }, - "downloadLossy320FormatDesc": "Elige el formato de salida para las descargas con pérdida de Tidal a 320kbps. La transmisión AAC original se convertirá al formato que hayas seleccionado.", + "downloadLossy320FormatDesc": "Elige el formato de salida para las descargas con pérdida de Tidal a 320 kbps. La transmisión AAC original se convertirá al formato que hayas seleccionado.", "@downloadLossy320FormatDesc": { "description": "Description in the Tidal lossy format picker" }, - "downloadLossyMp3": "MP3 (320kbps)", + "downloadLossyMp3": "MP3 (320 kbps)", "@downloadLossyMp3": { "description": "Tidal lossy format option - MP3 320kbps" }, - "downloadLossyMp3Subtitle": "Óptima compatibilidad, ~10 MB por pista", + "downloadLossyMp3Subtitle": "Mejor compatibilidad, ~10 MB por pista", "@downloadLossyMp3Subtitle": { "description": "Subtitle for MP3 320kbps Tidal lossy option" }, - "downloadLossyOpus256": "OPUS (256kbps)", + "downloadLossyOpus256": "OPUS (256 kbps)", "@downloadLossyOpus256": { "description": "Tidal lossy format option - Opus 256kbps" }, - "downloadLossyOpus256Subtitle": "Opus de la mejor calidad, ~8 MB por pista", + "downloadLossyOpus256Subtitle": "Mejor calidad de OPUS, ~8 MB por pista", "@downloadLossyOpus256Subtitle": { "description": "Subtitle for Opus 256kbps Tidal lossy option" }, - "downloadLossyOpus128": "OPUS (128kbps)", + "downloadLossyOpus128": "OPUS (128 kbps)", "@downloadLossyOpus128": { "description": "Tidal lossy format option - Opus 128kbps" }, @@ -2053,15 +2053,15 @@ "@settingsDownloadNetwork": { "description": "Setting for network type preference" }, - "settingsDownloadNetworkAny": "WiFi + Datos móviles", + "settingsDownloadNetworkAny": "Wi-Fi + Datos móviles", "@settingsDownloadNetworkAny": { "description": "Network option - use any connection" }, - "settingsDownloadNetworkWifiOnly": "Iniciar solo por Wifi", + "settingsDownloadNetworkWifiOnly": "Iniciar solo por Wi-Fi", "@settingsDownloadNetworkWifiOnly": { "description": "Network option - only use WiFi" }, - "settingsDownloadNetworkSubtitle": "Elegir qué red usar para descargas. Cuando se establece en WiFi solamente, las descargas se detendrán en los datos móviles.", + "settingsDownloadNetworkSubtitle": "Elegir qué red usar para descargas. Cuando se establece en Wi-Fi solamente, las descargas se detendrán en los datos móviles.", "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, @@ -2109,15 +2109,15 @@ "@albumFolderArtistAlbumFlat": { "description": "Album folder option with singles directly in artist folder" }, - "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", + "albumFolderArtistAlbumFlatSubtitle": "Artista/Álbum/ y Artista/canción.flac", "@albumFolderArtistAlbumFlatSubtitle": { "description": "Folder structure example for flat singles" }, - "downloadedAlbumDeleteSelected": "Borrar Seleccionados", + "downloadedAlbumDeleteSelected": "Borrar seleccionados", "@downloadedAlbumDeleteSelected": { "description": "Button - delete selected tracks" }, - "downloadedAlbumDeleteMessage": "¿Eliminar {count} {count, plural, =1{pista} other{pistas}} del historial?\n\nEsto también eliminará los archivos del almacenamiento.", + "downloadedAlbumDeleteMessage": "¿Eliminar {count} {count, plural, one {}=1{pista} other{pistas}} del historial?\n\nEsto también eliminará los archivos del almacenamiento.", "@downloadedAlbumDeleteMessage": { "description": "Delete confirmation with count", "placeholders": { @@ -2236,7 +2236,7 @@ } } }, - "discographySinglesOnly": "Solo sencillos & EPs ", + "discographySinglesOnly": "Solo sencillos & mini-álbum", "@discographySinglesOnly": { "description": "Option - download only singles" }, @@ -2289,7 +2289,7 @@ "@discographyDownloadSelected": { "description": "Button - download selected albums" }, - "discographyAddedToQueue": "Added {count} tracks to queue", + "discographyAddedToQueue": "Se agregaron {count} canciones a la lista de espera", "@discographyAddedToQueue": { "description": "Snackbar - tracks added from discography", "placeholders": { @@ -2298,7 +2298,7 @@ } } }, - "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", + "discographySkippedDownloaded": "{added} añadidas, {skipped} ya fueron descargadas", "@discographySkippedDownloaded": { "description": "Snackbar - with skipped tracks count", "placeholders": { @@ -2310,51 +2310,51 @@ } } }, - "discographyNoAlbums": "No albums available", + "discographyNoAlbums": "No hay álbumes disponibles", "@discographyNoAlbums": { "description": "Error - no albums found for artist" }, - "discographyFailedToFetch": "Failed to fetch some albums", + "discographyFailedToFetch": "Hubo un error para encontrar algunos álbumes", "@discographyFailedToFetch": { "description": "Error - some albums failed to load" }, - "sectionStorageAccess": "Storage Access", + "sectionStorageAccess": "Permiso de almacenamiento", "@sectionStorageAccess": { "description": "Section header for storage access settings" }, - "allFilesAccess": "All Files Access", + "allFilesAccess": "Acceso a todos los archivos", "@allFilesAccess": { "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" }, - "allFilesAccessEnabledSubtitle": "Can write to any folder", + "allFilesAccessEnabledSubtitle": "Puede escribir en cualquier carpeta", "@allFilesAccessEnabledSubtitle": { "description": "Subtitle when all files access is enabled" }, - "allFilesAccessDisabledSubtitle": "Limited to media folders only", + "allFilesAccessDisabledSubtitle": "Limitado a carpetas de media", "@allFilesAccessDisabledSubtitle": { "description": "Subtitle when all files access is disabled" }, - "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", + "allFilesAccessDescription": "Habilite esto si tiene problemas de escritura al guardar en carpetas personalizadas. Android 13+ restringe el acceso a ciertas carpetas por defecto.", "@allFilesAccessDescription": { "description": "Description explaining when to enable all files access" }, - "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", + "allFilesAccessDeniedMessage": "Permiso denegado. Por favor habilite 'Acceso a todos los archivos' de manera manual en la configuración del sistema.", "@allFilesAccessDeniedMessage": { "description": "Message when permission is permanently denied" }, - "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", + "allFilesAccessDisabledMessage": "Acceso a todos los archivos desactivado. La aplicación usará acceso limitado al almacenamiento.", "@allFilesAccessDisabledMessage": { "description": "Snackbar message when user disables all files access" }, - "settingsLocalLibrary": "Local Library", + "settingsLocalLibrary": "Librería local", "@settingsLocalLibrary": { "description": "Settings menu item - local library" }, - "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", + "settingsLocalLibrarySubtitle": "Escanear música y detectar duplicados", "@settingsLocalLibrarySubtitle": { "description": "Subtitle for local library settings" }, - "settingsCache": "Almacenamiento & Caché", + "settingsCache": "Almacenamiento & caché", "@settingsCache": { "description": "Settings menu item - cache management" }, @@ -2362,15 +2362,15 @@ "@settingsCacheSubtitle": { "description": "Subtitle for cache management menu" }, - "libraryTitle": "Local Library", + "libraryTitle": "Librería local", "@libraryTitle": { "description": "Library settings page title" }, - "libraryScanSettings": "Scan Settings", + "libraryScanSettings": "Configuración de escaneo", "@libraryScanSettings": { "description": "Section header for scan settings" }, - "libraryEnableLocalLibrary": "Enable Local Library", + "libraryEnableLocalLibrary": "Habilitar librería local", "@libraryEnableLocalLibrary": { "description": "Toggle to enable library scanning" }, @@ -2378,27 +2378,27 @@ "@libraryEnableLocalLibrarySubtitle": { "description": "Subtitle for enable toggle" }, - "libraryFolder": "Library Folder", + "libraryFolder": "Carpeta de la librería", "@libraryFolder": { "description": "Folder selection setting" }, - "libraryFolderHint": "Tap to select folder", + "libraryFolderHint": "Toque para seleccionar la carpeta", "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, - "libraryShowDuplicateIndicator": "Show Duplicate Indicator", + "libraryShowDuplicateIndicator": "Mostrar indicador de duplicados", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" }, - "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", + "libraryShowDuplicateIndicatorSubtitle": "Mostrar al buscar canciones existentes", "@libraryShowDuplicateIndicatorSubtitle": { "description": "Subtitle for duplicate indicator toggle" }, - "libraryAutoScan": "Escaneo Automático", + "libraryAutoScan": "Escaneo automático", "@libraryAutoScan": { "description": "Setting for automatic library scanning" }, - "libraryAutoScanSubtitle": "Automatically scan your library for new files", + "libraryAutoScanSubtitle": "Escanear automáticamente tu librería por nuevos archivos", "@libraryAutoScanSubtitle": { "description": "Subtitle for auto scan setting" }, @@ -2406,63 +2406,63 @@ "@libraryAutoScanOff": { "description": "Auto scan disabled" }, - "libraryAutoScanOnOpen": "Every app open", + "libraryAutoScanOnOpen": "Cada vez que la aplicación se abra", "@libraryAutoScanOnOpen": { "description": "Auto scan when app opens" }, - "libraryAutoScanDaily": "Daily", + "libraryAutoScanDaily": "Diariamente", "@libraryAutoScanDaily": { "description": "Auto scan once per day" }, - "libraryAutoScanWeekly": "Weekly", + "libraryAutoScanWeekly": "Semanalmente", "@libraryAutoScanWeekly": { "description": "Auto scan once per week" }, - "libraryActions": "Actions", + "libraryActions": "Acciones", "@libraryActions": { "description": "Section header for library actions" }, - "libraryScan": "Scan Library", + "libraryScan": "Escanear librería", "@libraryScan": { "description": "Button to start library scan" }, - "libraryScanSubtitle": "Scan for audio files", + "libraryScanSubtitle": "Escanear archivos de audio", "@libraryScanSubtitle": { "description": "Subtitle for scan button" }, - "libraryScanSelectFolderFirst": "Select a folder first", + "libraryScanSelectFolderFirst": "Primero seleccione una carpeta", "@libraryScanSelectFolderFirst": { "description": "Message when trying to scan without folder" }, - "libraryCleanupMissingFiles": "Cleanup Missing Files", + "libraryCleanupMissingFiles": "Limpiar archivos faltantes", "@libraryCleanupMissingFiles": { "description": "Button to remove entries for missing files" }, - "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", + "libraryCleanupMissingFilesSubtitle": "Remover entradas para archivos que ya no existen", "@libraryCleanupMissingFilesSubtitle": { "description": "Subtitle for cleanup button" }, - "libraryClear": "Clear Library", + "libraryClear": "Limpiar librería", "@libraryClear": { "description": "Button to clear all library entries" }, - "libraryClearSubtitle": "Remove all scanned tracks", + "libraryClearSubtitle": "Remover todas las canciones escaneadas", "@libraryClearSubtitle": { "description": "Subtitle for clear button" }, - "libraryClearConfirmTitle": "Clear Library", + "libraryClearConfirmTitle": "Limpiar librería", "@libraryClearConfirmTitle": { "description": "Dialog title for clear confirmation" }, - "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", + "libraryClearConfirmMessage": "Esto removerá todas las canciones escaneadas de tu librería. Los archivos de música no serán eliminados.", "@libraryClearConfirmMessage": { "description": "Dialog message for clear confirmation" }, - "libraryAbout": "About Local Library", + "libraryAbout": "Acerca de la librería local", "@libraryAbout": { "description": "Section header for about info" }, - "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", + "libraryAboutDescription": "Escanea tu colección de música para detectar duplicados al descargar. Permite formatos FLAC, M4A, MP3, Opus, y OGG. La meta data será leída de los archivos cuando sea posible.", "@libraryAboutDescription": { "description": "Description of local library feature" }, @@ -2484,7 +2484,7 @@ } } }, - "libraryLastScanned": "Last scanned: {time}", + "libraryLastScanned": "Último escaneo: {time}", "@libraryLastScanned": { "description": "Last scan time display", "placeholders": { @@ -2493,19 +2493,19 @@ } } }, - "libraryLastScannedNever": "Never", + "libraryLastScannedNever": "Nunca", "@libraryLastScannedNever": { "description": "Shown when library has never been scanned" }, - "libraryScanning": "Scanning...", + "libraryScanning": "Escaneando...", "@libraryScanning": { "description": "Status during scan" }, - "libraryScanFinalizing": "Finalizing library...", + "libraryScanFinalizing": "Finalizando la biblioteca...", "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, - "libraryScanProgress": "{progress}% of {total} files", + "libraryScanProgress": "{progress}% de {total} archivos", "@libraryScanProgress": { "description": "Scan progress display", "placeholders": { @@ -2517,11 +2517,11 @@ } } }, - "libraryInLibrary": "In Library", + "libraryInLibrary": "En la biblioteca", "@libraryInLibrary": { "description": "Badge shown on tracks that exist in local library" }, - "libraryRemovedMissingFiles": "Removed {count} missing files from library", + "libraryRemovedMissingFiles": "Eliminados {count} archivos faltantes de la biblioteca", "@libraryRemovedMissingFiles": { "description": "Snackbar after cleanup", "placeholders": { @@ -2530,135 +2530,135 @@ } } }, - "libraryCleared": "Library cleared", + "libraryCleared": "Biblioteca vaciada", "@libraryCleared": { "description": "Snackbar after clearing library" }, - "libraryStorageAccessRequired": "Storage Access Required", + "libraryStorageAccessRequired": "Permiso de acceso al almacenamiento requerido", "@libraryStorageAccessRequired": { "description": "Dialog title for storage permission" }, - "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", + "libraryStorageAccessMessage": "SpotiFLAC necesita acceso al almacenamiento para escanear tu biblioteca musical. Por favor, concede el permiso en los ajustes.", "@libraryStorageAccessMessage": { "description": "Dialog message for storage permission" }, - "libraryFolderNotExist": "Selected folder does not exist", + "libraryFolderNotExist": "La carpeta seleccionada no existe", "@libraryFolderNotExist": { "description": "Error when folder doesn't exist" }, - "librarySourceDownloaded": "Downloaded", + "librarySourceDownloaded": "Descargado", "@librarySourceDownloaded": { "description": "Badge for tracks downloaded via SpotiFLAC" }, - "librarySourceLocal": "Local", + "librarySourceLocal": "En el dispositivo", "@librarySourceLocal": { "description": "Badge for tracks from local library scan" }, - "libraryFilterAll": "All", + "libraryFilterAll": "Todos", "@libraryFilterAll": { "description": "Filter chip - show all library items" }, - "libraryFilterDownloaded": "Downloaded", + "libraryFilterDownloaded": "Descargado", "@libraryFilterDownloaded": { "description": "Filter chip - show only downloaded items" }, - "libraryFilterLocal": "Local", + "libraryFilterLocal": "En el dispositivo", "@libraryFilterLocal": { "description": "Filter chip - show only local library items" }, - "libraryFilterTitle": "Filters", + "libraryFilterTitle": "Filtros", "@libraryFilterTitle": { "description": "Filter bottom sheet title" }, - "libraryFilterReset": "Reset", + "libraryFilterReset": "Restablecer", "@libraryFilterReset": { "description": "Reset all filters button" }, - "libraryFilterApply": "Apply", + "libraryFilterApply": "Aplicar", "@libraryFilterApply": { "description": "Apply filters button" }, - "libraryFilterSource": "Source", + "libraryFilterSource": "Fuente", "@libraryFilterSource": { "description": "Filter section - source type" }, - "libraryFilterQuality": "Quality", + "libraryFilterQuality": "Calidad", "@libraryFilterQuality": { "description": "Filter section - audio quality" }, - "libraryFilterQualityHiRes": "Hi-Res (24bit)", + "libraryFilterQualityHiRes": "Hi-Res (24-bit)", "@libraryFilterQualityHiRes": { "description": "Filter option - high resolution audio" }, - "libraryFilterQualityCD": "CD (16bit)", + "libraryFilterQualityCD": "CD (16-bit)", "@libraryFilterQualityCD": { "description": "Filter option - CD quality audio" }, - "libraryFilterQualityLossy": "Lossy", + "libraryFilterQualityLossy": "Con pérdida", "@libraryFilterQualityLossy": { "description": "Filter option - lossy compressed audio" }, - "libraryFilterFormat": "Format", + "libraryFilterFormat": "Formato", "@libraryFilterFormat": { "description": "Filter section - file format" }, - "libraryFilterMetadata": "Metadata", + "libraryFilterMetadata": "Información", "@libraryFilterMetadata": { "description": "Filter section - metadata completeness" }, - "libraryFilterMetadataComplete": "Complete metadata", + "libraryFilterMetadataComplete": "Información completa", "@libraryFilterMetadataComplete": { "description": "Filter option - items with complete metadata" }, - "libraryFilterMetadataMissingAny": "Missing any metadata", + "libraryFilterMetadataMissingAny": "Falta información (meta-data)", "@libraryFilterMetadataMissingAny": { "description": "Filter option - items missing any tracked metadata field" }, - "libraryFilterMetadataMissingYear": "Missing year", + "libraryFilterMetadataMissingYear": "Falta año", "@libraryFilterMetadataMissingYear": { "description": "Filter option - items missing release year/date" }, - "libraryFilterMetadataMissingGenre": "Missing genre", + "libraryFilterMetadataMissingGenre": "Falta género", "@libraryFilterMetadataMissingGenre": { "description": "Filter option - items missing genre" }, - "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", + "libraryFilterMetadataMissingAlbumArtist": "Falta artiste de álbum", "@libraryFilterMetadataMissingAlbumArtist": { "description": "Filter option - items missing album artist" }, - "libraryFilterSort": "Sort", + "libraryFilterSort": "Ordenar", "@libraryFilterSort": { "description": "Filter section - sort order" }, - "libraryFilterSortLatest": "Latest", + "libraryFilterSortLatest": "Reciente", "@libraryFilterSortLatest": { "description": "Sort option - newest first" }, - "libraryFilterSortOldest": "Oldest", + "libraryFilterSortOldest": "Más antiguo", "@libraryFilterSortOldest": { "description": "Sort option - oldest first" }, - "libraryFilterSortAlbumAsc": "Album (A-Z)", + "libraryFilterSortAlbumAsc": "Álbum (A-Z)", "@libraryFilterSortAlbumAsc": { "description": "Sort option - album ascending" }, - "libraryFilterSortAlbumDesc": "Album (Z-A)", + "libraryFilterSortAlbumDesc": "Álbum (Z-A)", "@libraryFilterSortAlbumDesc": { "description": "Sort option - album descending" }, - "libraryFilterSortGenreAsc": "Genre (A-Z)", + "libraryFilterSortGenreAsc": "Género (A-Z)", "@libraryFilterSortGenreAsc": { "description": "Sort option - genre ascending" }, - "libraryFilterSortGenreDesc": "Genre (Z-A)", + "libraryFilterSortGenreDesc": "Género (Z-A)", "@libraryFilterSortGenreDesc": { "description": "Sort option - genre descending" }, - "timeJustNow": "Just now", + "timeJustNow": "Hace un momento", "@timeJustNow": { "description": "Relative time - less than a minute ago" }, - "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", + "timeMinutesAgo": "{count, plural, =1{hace 1 minuto} other{{count} minutos atrás}}", "@timeMinutesAgo": { "description": "Relative time - minutes ago", "placeholders": { @@ -2667,7 +2667,7 @@ } } }, - "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", + "timeHoursAgo": "{count, plural, =1{1 hora atrás} other{{count} horas atrás}}", "@timeHoursAgo": { "description": "Relative time - hours ago", "placeholders": { @@ -2676,123 +2676,123 @@ } } }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC!", + "tutorialWelcomeTitle": "¡Bienvenido a SpotiFLAC!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "tutorialWelcomeDesc": "Aprende cómo descargar tu música favorita en excelente calidad. Este tutorial te mostrará lo básico.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Download music from Spotify, Deezer, or paste any supported URL", + "tutorialWelcomeTip1": "Descarga música de Spotify, Deezer, o pega cualquier URL soportada", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from Tidal, Qobuz, or Deezer", + "tutorialWelcomeTip2": "Obtener audio de calidad FLAC de Tidal, Qobuz o Deezer", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "tutorialWelcomeTip3": "Información automática, portadas y letras integradas", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, - "tutorialSearchTitle": "Finding Music", + "tutorialSearchTitle": "Buscando música", "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "tutorialSearchDesc": "Hay dos maneras fáciles de encontrar la música que quieres descargar.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, - "tutorialDownloadTitle": "Downloading Music", + "tutorialDownloadTitle": "Descargando música", "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "tutorialDownloadDesc": "Descargar música es simple y rápido. Así es como funciona.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, - "tutorialLibraryTitle": "Your Library", + "tutorialLibraryTitle": "Tu biblioteca", "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "tutorialLibraryDesc": "Toda tu música descargada está organizada en la pestaña Biblioteca.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "tutorialLibraryTip1": "Ver progreso de descarga y cola en la pestaña de biblioteca", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", + "tutorialLibraryTip2": "Pulsa cualquier pista para abrirla con tu reproductor multimedia", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "tutorialLibraryTip3": "Cambiar modo de vista entre modo lista y cuadrícula para mejorar navegación", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, - "tutorialExtensionsTitle": "Extensions", + "tutorialExtensionsTitle": "Extensiones", "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "tutorialExtensionsDesc": "Extiende las capacidades de la aplicación con extensiones creadas por la comunidad.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, - "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", + "tutorialExtensionsTip1": "Navega por la pestaña de repo para descubrir extensiones", "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Add new download providers or search sources", + "tutorialExtensionsTip2": "Añadir nuevos proveedores de descargas o fuentes de búsqueda", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "tutorialExtensionsTip3": "Obtén letras, información mejorada y más características", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, - "tutorialSettingsTitle": "Customize Your Experience", + "tutorialSettingsTitle": "Personaliza tu experiencia", "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "tutorialSettingsDesc": "Personaliza la aplicación en Ajustes según tus preferencias.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, - "tutorialSettingsTip1": "Change download location and folder organization", + "tutorialSettingsTip1": "Cambia la ubicación de las descargas y la organización de las carpetas", "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", + "tutorialSettingsTip2": "Configura la calidad de audio predeterminada y las preferencias de formato", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, - "tutorialSettingsTip3": "Customize app theme and appearance", + "tutorialSettingsTip3": "Personaliza el tema y el aspecto de la aplicación", "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "tutorialReadyMessage": "¡Todo preparado!, puedes descargar tu música favorita.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, - "libraryForceFullScan": "Force Full Scan", + "libraryForceFullScan": "Forzar análisis completo", "@libraryForceFullScan": { "description": "Button to force a complete rescan of library" }, - "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", + "libraryForceFullScanSubtitle": "Volver a escanear archivos, ignorando caché", "@libraryForceFullScanSubtitle": { "description": "Subtitle for force full scan button" }, - "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", + "cleanupOrphanedDownloads": "Borrar descargar huérfanas", "@cleanupOrphanedDownloads": { "description": "Button to remove history entries for deleted files" }, - "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", + "cleanupOrphanedDownloadsSubtitle": "Borrar historial de archivos que no existen", "@cleanupOrphanedDownloadsSubtitle": { "description": "Subtitle for orphaned cleanup button" }, - "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", + "cleanupOrphanedDownloadsResult": "Se removieron {count} entradas huérfanas del historial.", "@cleanupOrphanedDownloadsResult": { "description": "Snackbar after orphan cleanup", "placeholders": { @@ -2801,23 +2801,23 @@ } } }, - "cleanupOrphanedDownloadsNone": "No orphaned entries found", + "cleanupOrphanedDownloadsNone": "Sin entradas huérfanas encontradas", "@cleanupOrphanedDownloadsNone": { "description": "Snackbar when no orphans found" }, - "cacheTitle": "Storage & Cache", + "cacheTitle": "Almacenamiento y caché", "@cacheTitle": { "description": "Cache management page title" }, - "cacheSummaryTitle": "Cache overview", + "cacheSummaryTitle": "Resumen de la caché", "@cacheSummaryTitle": { "description": "Heading for cache summary card" }, - "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", + "cacheSummarySubtitle": "Limpiar la caché no eliminará los archivos de música descargados.", "@cacheSummarySubtitle": { "description": "Helper text for cache summary card" }, - "cacheEstimatedTotal": "Estimated cache usage: {size}", + "cacheEstimatedTotal": "Uso estimado de caché: {size}", "@cacheEstimatedTotal": { "description": "Total cache size shown in summary", "placeholders": { @@ -2826,71 +2826,71 @@ } } }, - "cacheSectionStorage": "Cached Data", + "cacheSectionStorage": "Datos almacenados en caché", "@cacheSectionStorage": { "description": "Section header for cache entries" }, - "cacheSectionMaintenance": "Maintenance", + "cacheSectionMaintenance": "Mantenimiento", "@cacheSectionMaintenance": { "description": "Section header for cleanup actions" }, - "cacheAppDirectory": "App cache directory", + "cacheAppDirectory": "Directorio de caché", "@cacheAppDirectory": { "description": "Cache item title for app cache directory" }, - "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", + "cacheAppDirectoryDesc": "Respuestas HTTP, datos WebView y otros datos temporales.", "@cacheAppDirectoryDesc": { "description": "Description of what app cache directory contains" }, - "cacheTempDirectory": "Temporary directory", + "cacheTempDirectory": "Directorio temporal", "@cacheTempDirectory": { "description": "Cache item title for temporary files directory" }, - "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", + "cacheTempDirectoryDesc": "Archivos temporales de descargas y conversión de audio.", "@cacheTempDirectoryDesc": { "description": "Description of what temporary directory contains" }, - "cacheCoverImage": "Cover image cache", + "cacheCoverImage": "Caché de imágenes de portada", "@cacheCoverImage": { "description": "Cache item title for persistent cover images" }, - "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", + "cacheCoverImageDesc": "Álbum descargado y portada de pista. Se volverá a descargar cuando se vea.", "@cacheCoverImageDesc": { "description": "Description of what cover image cache contains" }, - "cacheLibraryCover": "Library cover cache", + "cacheLibraryCover": "Caché de portada (biblioteca)", "@cacheLibraryCover": { "description": "Cache item title for local library cover art images" }, - "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", + "cacheLibraryCoverDesc": "Portada extraída de archivos locales. Se extraerá de nuevo en el próximo escaneo.", "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, - "cacheExploreFeed": "Explore feed cache", + "cacheExploreFeed": "Explorar caché de inicio", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" }, - "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", + "cacheExploreFeedDesc": "Explorar contenido de pestaña (nuevas versiones, tendencias). Se actualiza en cada visita.", "@cacheExploreFeedDesc": { "description": "Description of what explore feed cache contains" }, - "cacheTrackLookup": "Track lookup cache", + "cacheTrackLookup": "Caché de búsqueda", "@cacheTrackLookup": { "description": "Cache item title for track ID lookup cache" }, - "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", + "cacheTrackLookupDesc": "Búsqueda de ID de Spotify/Deezer. Limpiar podría ralentizar algunas búsquedas.", "@cacheTrackLookupDesc": { "description": "Description of what track lookup cache contains" }, - "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", + "cacheCleanupUnusedDesc": "Borre el historial de archivos huérfanos y las entradas en la biblioteca.", "@cacheCleanupUnusedDesc": { "description": "Description of what cleanup unused data does" }, - "cacheNoData": "No cached data", + "cacheNoData": "No hay datos en caché", "@cacheNoData": { "description": "Label when cache category has no data" }, - "cacheSizeWithFiles": "{size} in {count} files", + "cacheSizeWithFiles": "{size} en {count} archivos", "@cacheSizeWithFiles": { "description": "Cache size and file count", "placeholders": { @@ -2911,7 +2911,7 @@ } } }, - "cacheEntries": "{count} entries", + "cacheEntries": "{count} registros", "@cacheEntries": { "description": "Track cache entry count", "placeholders": { @@ -2920,7 +2920,7 @@ } } }, - "cacheClearSuccess": "Cleared: {target}", + "cacheClearSuccess": "Limpiado: {target}", "@cacheClearSuccess": { "description": "Snackbar after clearing selected cache", "placeholders": { @@ -2929,11 +2929,11 @@ } } }, - "cacheClearConfirmTitle": "Clear cache?", + "cacheClearConfirmTitle": "¿Limpiar caché?", "@cacheClearConfirmTitle": { "description": "Dialog title before clearing one cache category" }, - "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", + "cacheClearConfirmMessage": "Esto borrará los datos en caché para {target}. Los archivos descargados no se eliminan.", "@cacheClearConfirmMessage": { "description": "Dialog message before clearing selected cache", "placeholders": { @@ -2942,27 +2942,27 @@ } } }, - "cacheClearAllConfirmTitle": "Clear all cache?", + "cacheClearAllConfirmTitle": "¿Quieres limpiar todas las cachés?", "@cacheClearAllConfirmTitle": { "description": "Dialog title before clearing all caches" }, - "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", + "cacheClearAllConfirmMessage": "Esto borrará todo el caché de categorías en esta página. Los archivos descargados no se eliminan.", "@cacheClearAllConfirmMessage": { "description": "Dialog message before clearing all caches" }, - "cacheClearAll": "Clear all cache", + "cacheClearAll": "Borrar todo el caché", "@cacheClearAll": { "description": "Button label to clear all caches" }, - "cacheCleanupUnused": "Cleanup unused data", + "cacheCleanupUnused": "Limpiar datos sin usar", "@cacheCleanupUnused": { "description": "Action title for cleaning unused entries" }, - "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", + "cacheCleanupUnusedSubtitle": "Borrar historial de descargas huérfanas y entradas faltantes en biblioteca", "@cacheCleanupUnusedSubtitle": { "description": "Subtitle for cleanup unused data action" }, - "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", + "cacheCleanupResult": "Limpieza copletada: {downloadCount} descargas huéranas, {libraryCount} entradas faltantes de librería", "@cacheCleanupResult": { "description": "Snackbar after unused data cleanup", "placeholders": { @@ -2974,75 +2974,75 @@ } } }, - "cacheRefreshStats": "Refresh stats", + "cacheRefreshStats": "Actualizar estadisticas", "@cacheRefreshStats": { "description": "Button label to refresh cache statistics" }, - "trackSaveCoverArt": "Save Cover Art", + "trackSaveCoverArt": "Guardar portada", "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Save album art as .jpg file", + "trackSaveCoverArtSubtitle": "Guardar imagen del álbum como archivo .jpg", "@trackSaveCoverArtSubtitle": { "description": "Subtitle for save cover art action" }, - "trackSaveLyrics": "Save Lyrics (.lrc)", + "trackSaveLyrics": "Guardar letra (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Fetch and save lyrics as .lrc file", + "trackSaveLyricsSubtitle": "Buscar y guardar letras como archivo .lrc", "@trackSaveLyricsSubtitle": { "description": "Subtitle for save lyrics action" }, - "trackSaveLyricsProgress": "Saving lyrics...", + "trackSaveLyricsProgress": "Guardando letra...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" }, - "trackReEnrich": "Re-enrich", + "trackReEnrich": "Volver a enriquecer", "@trackReEnrich": { "description": "Menu action - re-embed metadata into audio file" }, - "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", + "trackReEnrichOnlineSubtitle": "Buscar información en línea y incrustar al archivo", "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Fields to update", + "trackReEnrichFieldsTitle": "Campos a actualizar", "@trackReEnrichFieldsTitle": { "description": "Section title for field selection in re-enrich dialog" }, - "trackReEnrichFieldCover": "Cover Art", + "trackReEnrichFieldCover": "Carátula", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" }, - "trackReEnrichFieldLyrics": "Lyrics", + "trackReEnrichFieldLyrics": "Letra", "@trackReEnrichFieldLyrics": { "description": "Checkbox label for lyrics field in re-enrich" }, - "trackReEnrichFieldBasicTags": "Album, Album Artist", + "trackReEnrichFieldBasicTags": "Álbum, Artista del Álbum", "@trackReEnrichFieldBasicTags": { "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" }, - "trackReEnrichFieldTrackInfo": "Track & Disc Number", + "trackReEnrichFieldTrackInfo": "Número de pista(s) y disco(s).", "@trackReEnrichFieldTrackInfo": { "description": "Checkbox label for track info in re-enrich" }, - "trackReEnrichFieldReleaseInfo": "Date & ISRC", + "trackReEnrichFieldReleaseInfo": "Fecha e ISRC", "@trackReEnrichFieldReleaseInfo": { "description": "Checkbox label for release info in re-enrich" }, - "trackReEnrichFieldExtra": "Genre, Label, Copyright", + "trackReEnrichFieldExtra": "Género, etiqueta, derechos de autor", "@trackReEnrichFieldExtra": { "description": "Checkbox label for extra metadata in re-enrich" }, - "trackReEnrichSelectAll": "Select All", + "trackReEnrichSelectAll": "Seleccionar todos", "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, - "trackEditMetadata": "Edit Metadata", + "trackEditMetadata": "Editar información", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" }, - "trackCoverSaved": "Cover art saved to {fileName}", + "trackCoverSaved": "Carátula guardada en {fileName}", "@trackCoverSaved": { "description": "Snackbar after cover art saved", "placeholders": { @@ -3051,11 +3051,11 @@ } } }, - "trackCoverNoSource": "No cover art source available", + "trackCoverNoSource": "No hay fuente de portadas disponible", "@trackCoverNoSource": { "description": "Snackbar when no cover art URL or embedded cover" }, - "trackLyricsSaved": "Lyrics saved to {fileName}", + "trackLyricsSaved": "Letra guardada en {fileName}", "@trackLyricsSaved": { "description": "Snackbar after lyrics saved", "placeholders": { @@ -3064,27 +3064,27 @@ } } }, - "trackReEnrichProgress": "Re-enriching metadata...", + "trackReEnrichProgress": "Obteniendo información...", "@trackReEnrichProgress": { "description": "Snackbar while re-enriching metadata" }, - "trackReEnrichSearching": "Searching metadata online...", + "trackReEnrichSearching": "Buscando información en línea...", "@trackReEnrichSearching": { "description": "Snackbar while searching metadata from internet for local items" }, - "trackReEnrichSuccess": "Metadata re-enriched successfully", + "trackReEnrichSuccess": "Información ", "@trackReEnrichSuccess": { "description": "Snackbar after successful re-enrichment" }, - "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", + "trackReEnrichFfmpegFailed": "Información incrustada con FFmpeg falló", "@trackReEnrichFfmpegFailed": { "description": "Snackbar when FFmpeg embed fails for MP3/Opus" }, - "queueFlacAction": "Queue FLAC", + "queueFlacAction": "Encolar FLAC", "@queueFlacAction": { "description": "Action/button label for queueing FLAC redownloads for local tracks" }, - "queueFlacConfirmMessage": "Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n{count} selected", + "queueFlacConfirmMessage": "Buscar coincidencias en línea para las pistas seleccionadas y en cola de descargas\n\nArchivos existentes no serán afectados o borrados.\n\nSolo coincidencia de alta confianza serán puestas automáticamente.\n\n{count} seleccionado", "@queueFlacConfirmMessage": { "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", "placeholders": { @@ -3093,7 +3093,7 @@ } } }, - "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", + "queueFlacFindingProgress": "Buscando coincidencias FLAC", "@queueFlacFindingProgress": { "description": "Snackbar while resolving remote matches for local FLAC redownloads", "placeholders": { @@ -3105,11 +3105,11 @@ } } }, - "queueFlacNoReliableMatches": "No reliable online matches found for the selection", + "queueFlacNoReliableMatches": "Sin coincidencias en línea de confianza", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" }, - "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", + "queueFlacQueuedWithSkipped": "Añadido {addedCount} pistas a la cola, omitidas {skippedCount}", "@queueFlacQueuedWithSkipped": { "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", "placeholders": { @@ -3121,7 +3121,7 @@ } } }, - "trackSaveFailed": "Failed: {error}", + "trackSaveFailed": "Error: {error}", "@trackSaveFailed": { "description": "Snackbar when save operation fails", "placeholders": { @@ -3130,31 +3130,31 @@ } } }, - "trackConvertFormat": "Convert Format", + "trackConvertFormat": "Convertir formato", "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to MP3, Opus, ALAC, or FLAC", + "trackConvertFormatSubtitle": "Convertir a AAC/M4A, MP3, Opus, ALAC, o FLAC", "@trackConvertFormatSubtitle": { "description": "Subtitle for convert format menu item" }, - "trackConvertTitle": "Convert Audio", + "trackConvertTitle": "Convertir audio", "@trackConvertTitle": { "description": "Title of convert bottom sheet" }, - "trackConvertTargetFormat": "Target Format", + "trackConvertTargetFormat": "Formato de destino", "@trackConvertTargetFormat": { "description": "Label for format selection" }, - "trackConvertBitrate": "Bitrate", + "trackConvertBitrate": "Tasa de bits", "@trackConvertBitrate": { "description": "Label for bitrate selection" }, - "trackConvertConfirmTitle": "Confirm Conversion", + "trackConvertConfirmTitle": "Confirmar conversión", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" }, - "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", + "trackConvertConfirmMessage": "¿Convertir desde {sourceFormat} a {targetFormat} a {bitrate}?", "@trackConvertConfirmMessage": { "description": "Confirmation dialog message", "placeholders": { @@ -3169,7 +3169,7 @@ } } }, - "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", + "trackConvertConfirmMessageLossless": "Convertir de {sourceFormat} a {targetFormat}? \n(Sin pérdidas)\n\nEl archivo original será eliminado después de la conversión.", "@trackConvertConfirmMessageLossless": { "description": "Confirmation dialog message for lossless-to-lossless conversion", "placeholders": { @@ -3181,15 +3181,15 @@ } } }, - "trackConvertLosslessHint": "Lossless conversion — no quality loss", + "trackConvertLosslessHint": "Conversión sin pérdidas — sin pérdida de calidad", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" }, - "trackConvertConverting": "Converting audio...", + "trackConvertConverting": "Convirtiendo Audio...", "@trackConvertConverting": { "description": "Snackbar while converting" }, - "trackConvertSuccess": "Converted to {format} successfully", + "trackConvertSuccess": "Convertido a {format} con éxito", "@trackConvertSuccess": { "description": "Snackbar after successful conversion", "placeholders": { @@ -3198,7 +3198,7 @@ } } }, - "trackConvertFailed": "Conversion failed", + "trackConvertFailed": "La conversión ha fallado", "@trackConvertFailed": { "description": "Snackbar when conversion fails" }, @@ -3210,7 +3210,7 @@ "@cueSplitSubtitle": { "description": "Subtitle for CUE split menu item" }, - "cueSplitAlbum": "Album: {album}", + "cueSplitAlbum": "Álbum: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", "placeholders": { @@ -3219,7 +3219,7 @@ } } }, - "cueSplitArtist": "Artist: {artist}", + "cueSplitArtist": "Artista: {artist}", "@cueSplitArtist": { "description": "Artist name in CUE split sheet", "placeholders": { @@ -3228,7 +3228,7 @@ } } }, - "cueSplitTrackCount": "{count} tracks", + "cueSplitTrackCount": "{count} pistas", "@cueSplitTrackCount": { "description": "Number of tracks in CUE sheet", "placeholders": { @@ -3282,19 +3282,19 @@ "@cueSplitNoAudioFile": { "description": "Error when CUE audio file is missing" }, - "cueSplitButton": "Split into Tracks", + "cueSplitButton": "Dividir en pistas", "@cueSplitButton": { "description": "Button text to start CUE splitting" }, - "actionCreate": "Create", + "actionCreate": "Crear", "@actionCreate": { "description": "Generic action button - create" }, - "collectionFoldersTitle": "My folders", + "collectionFoldersTitle": "Mis carpetas", "@collectionFoldersTitle": { "description": "Library section title for custom folders" }, - "collectionWishlist": "Wishlist", + "collectionWishlist": "Lista de deseos", "@collectionWishlist": { "description": "Custom folder for saved tracks to download later" }, @@ -3302,27 +3302,27 @@ "@collectionLoved": { "description": "Custom folder for favorite tracks" }, - "collectionPlaylists": "Playlists", + "collectionPlaylists": "Listas de reproducción", "@collectionPlaylists": { "description": "Custom user playlists folder" }, - "collectionPlaylist": "Playlist", + "collectionPlaylist": "Lista de reproducción", "@collectionPlaylist": { "description": "Single playlist label" }, - "collectionAddToPlaylist": "Add to playlist", + "collectionAddToPlaylist": "Añadir a la lista", "@collectionAddToPlaylist": { "description": "Action to add a track to user playlist" }, - "collectionCreatePlaylist": "Create playlist", + "collectionCreatePlaylist": "Crear lista de reproducción", "@collectionCreatePlaylist": { "description": "Action to create a new playlist" }, - "collectionNoPlaylistsYet": "No playlists yet", + "collectionNoPlaylistsYet": "Aún no hay listas de reproducción", "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Create a playlist to start categorizing tracks", + "collectionNoPlaylistsSubtitle": "Crear una lista de reproducción para empezar a categorizar pistas", "@collectionNoPlaylistsSubtitle": { "description": "Empty state subtitle when user has no playlists" }, @@ -3335,7 +3335,7 @@ } } }, - "collectionAddedToPlaylist": "Added to \"{playlistName}\"", + "collectionAddedToPlaylist": "Añadida a \"{playlistName}\"", "@collectionAddedToPlaylist": { "description": "Snackbar after adding track to playlist", "placeholders": { @@ -3344,7 +3344,7 @@ } } }, - "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", + "collectionAlreadyInPlaylist": "Ya está en \"{playlistName}\"", "@collectionAlreadyInPlaylist": { "description": "Snackbar when track already exists in playlist", "placeholders": { @@ -3353,11 +3353,11 @@ } } }, - "collectionPlaylistCreated": "Playlist created", + "collectionPlaylistCreated": "Lista de reproducción creada", "@collectionPlaylistCreated": { "description": "Snackbar after creating playlist" }, - "collectionPlaylistNameHint": "Playlist name", + "collectionPlaylistNameHint": "Nombre de la lista de reproducción", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" }, @@ -3365,11 +3365,11 @@ "@collectionPlaylistNameRequired": { "description": "Validation error for empty playlist name" }, - "collectionRenamePlaylist": "Rename playlist", + "collectionRenamePlaylist": "Renombrar lista de reproducción", "@collectionRenamePlaylist": { "description": "Action to rename playlist" }, - "collectionDeletePlaylist": "Delete playlist", + "collectionDeletePlaylist": "Eliminar lista de reproducción", "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, @@ -3382,7 +3382,7 @@ } } }, - "collectionPlaylistDeleted": "Playlist deleted", + "collectionPlaylistDeleted": "Lista de reproducción eliminada", "@collectionPlaylistDeleted": { "description": "Snackbar after deleting playlist" }, @@ -3390,7 +3390,7 @@ "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" }, - "collectionWishlistEmptyTitle": "Wishlist is empty", + "collectionWishlistEmptyTitle": "La lista de deseos está vacía", "@collectionWishlistEmptyTitle": { "description": "Wishlist empty state title" }, @@ -3406,7 +3406,7 @@ "@collectionLovedEmptySubtitle": { "description": "Loved empty state subtitle" }, - "collectionPlaylistEmptyTitle": "Playlist is empty", + "collectionPlaylistEmptyTitle": "La lista de reproducción está vacía", "@collectionPlaylistEmptyTitle": { "description": "Playlist empty state title" }, @@ -3414,11 +3414,11 @@ "@collectionPlaylistEmptySubtitle": { "description": "Playlist empty state subtitle" }, - "collectionRemoveFromPlaylist": "Remove from playlist", + "collectionRemoveFromPlaylist": "Quitar de la lista de reproducción", "@collectionRemoveFromPlaylist": { "description": "Tooltip for removing track from playlist" }, - "collectionRemoveFromFolder": "Remove from folder", + "collectionRemoveFromFolder": "Quitar de la carpeta", "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, @@ -3475,7 +3475,7 @@ "@trackOptionRemoveFromLoved": { "description": "Bottom sheet action label - remove track from loved folder" }, - "trackOptionAddToWishlist": "Add to Wishlist", + "trackOptionAddToWishlist": "Añadir a la lista de deseos", "@trackOptionAddToWishlist": { "description": "Bottom sheet action label - add track to wishlist" }, @@ -3483,11 +3483,11 @@ "@trackOptionRemoveFromWishlist": { "description": "Bottom sheet action label - remove track from wishlist" }, - "collectionPlaylistChangeCover": "Change cover image", + "collectionPlaylistChangeCover": "Cambiar imagen de portada", "@collectionPlaylistChangeCover": { "description": "Bottom sheet action to pick a custom cover image for a playlist" }, - "collectionPlaylistRemoveCover": "Remove cover image", + "collectionPlaylistRemoveCover": "Eliminar imagen de portada", "@collectionPlaylistRemoveCover": { "description": "Bottom sheet action to remove custom cover image from a playlist" }, @@ -3517,7 +3517,7 @@ "@selectionConvertNoConvertible": { "description": "Snackbar when no selected tracks support conversion" }, - "selectionBatchConvertConfirmTitle": "Batch Convert", + "selectionBatchConvertConfirmTitle": "Conversión por lotes", "@selectionBatchConvertConfirmTitle": { "description": "Confirmation dialog title for batch conversion" }, @@ -3584,15 +3584,15 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Artist folders use Album Artist when available", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when Album Artist is used for folder naming" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Artist folders use Track Artist only", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when Track Artist is used for folder naming" }, - "lyricsProvidersTitle": "Lyrics Providers", + "lyricsProvidersTitle": "Prioridad de proveedores de letras", "@lyricsProvidersTitle": { "description": "Title for the lyrics provider priority page" }, @@ -3604,7 +3604,7 @@ "@lyricsProvidersInfoText": { "description": "Info tip on lyrics provider priority page" }, - "lyricsProvidersEnabledSection": "Enabled ({count})", + "lyricsProvidersEnabledSection": "Activados ({count})", "@lyricsProvidersEnabledSection": { "description": "Section header for enabled providers", "placeholders": { @@ -3613,7 +3613,7 @@ } } }, - "lyricsProvidersDisabledSection": "Disabled ({count})", + "lyricsProvidersDisabledSection": "Desactivados ({count})", "@lyricsProvidersDisabledSection": { "description": "Section header for disabled providers", "placeholders": { @@ -3654,7 +3654,7 @@ "@lyricsProviderQqMusicDesc": { "description": "Description for QQ Music provider" }, - "lyricsProviderExtensionDesc": "Extension provider", + "lyricsProviderExtensionDesc": "Proveedor de extensiones", "@lyricsProviderExtensionDesc": { "description": "Generic description for extension-based lyrics providers" }, @@ -3674,11 +3674,11 @@ "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Donate", + "settingsDonate": "Apoya el desarrollo", "@settingsDonate": { "description": "Settings menu item - donate" }, - "settingsDonateSubtitle": "Support SpotiFLAC-Mobile development", + "settingsDonateSubtitle": "Compra un café al desarrollador", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, @@ -3686,7 +3686,7 @@ "@tooltipLoveAll": { "description": "Tooltip for the Love All button on album/playlist screens" }, - "tooltipAddToPlaylist": "Add to Playlist", + "tooltipAddToPlaylist": "Añadir a la lista de reproducción", "@tooltipAddToPlaylist": { "description": "Tooltip for the Add to Playlist button" }, @@ -3708,7 +3708,7 @@ } } }, - "dialogDownloadAllTitle": "Download All", + "dialogDownloadAllTitle": "Descargar todo", "@dialogDownloadAllTitle": { "description": "Dialog title for bulk download confirmation" }, @@ -3725,7 +3725,7 @@ "@homeSkipAlreadyDownloaded": { "description": "Checkbox label in import dialog to skip already-downloaded songs" }, - "homeGoToAlbum": "Go to Album", + "homeGoToAlbum": "Ir al álbum", "@homeGoToAlbum": { "description": "Context menu item to navigate to the album page" }, @@ -3766,27 +3766,27 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose storage mode for downloaded files.", + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", "@downloadLocationSubtitle": { "description": "Subtitle text in Android download location bottom sheet" }, - "storageModeAppFolder": "App folder (non-SAF)", + "storageModeAppFolder": "App Folder (Recommended)", "@storageModeAppFolder": { "description": "Storage mode option - use legacy app folder" }, - "storageModeAppFolderSubtitle": "Use default Music/SpotiFLAC path", + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "SAF folder", + "storageModeSaf": "Carpeta personalizada (SAF)", "@storageModeSaf": { "description": "Storage mode option - use Android SAF picker" }, - "storageModeSafSubtitle": "Pick folder via Android Storage Access Framework", + "storageModeSafSubtitle": "Escoge cualquier carpeta, incluyendo la tarjeta SD", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFilenameDescription": "Customize how your files are named.", + "downloadFilenameDescription": "Usa {artist}, {title}, {album}, {track}, {year}, {date}, {disc} como marcadores de posición.", "@downloadFilenameDescription": { "description": "Description text in filename format bottom sheet" }, @@ -3794,11 +3794,11 @@ "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Albums/ and Singles/ folders", + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is enabled" }, - "downloadSeparateSinglesDisabled": "All files in same structure", + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is disabled" }, @@ -3806,47 +3806,47 @@ "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Create playlist source folder", + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", "@downloadCreatePlaylistSourceFolder": { "description": "Setting title for adding a playlist folder prefix before the normal organization structure" }, - "downloadCreatePlaylistSourceFolderEnabled": "Playlist downloads use Playlist/ plus your normal folder structure.", + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist source folder prefix is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "Playlist downloads use the normal folder structure only.", + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist source folder prefix is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "By Playlist already places downloads inside a playlist folder.", + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when playlist folder prefix setting is redundant because folder organization is already by playlist" }, - "downloadSongLinkRegion": "SongLink Region", + "downloadSongLinkRegion": "Región de SongLink", "@downloadSongLinkRegion": { "description": "Setting title for SongLink country region" }, - "downloadNetworkCompatibilityMode": "Network compatibility mode", + "downloadNetworkCompatibilityMode": "Modo de compatibilidad de red", "@downloadNetworkCompatibilityMode": { "description": "Setting title for network compatibility toggle" }, - "downloadNetworkCompatibilityModeEnabled": "Enabled: try HTTP + accept invalid TLS certificates (unsafe)", + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is enabled" }, - "downloadNetworkCompatibilityModeDisabled": "Off: strict HTTPS certificate validation (recommended)", + "downloadNetworkCompatibilityModeDisabled": "Utilizando ajustes de red estándar", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is disabled" }, - "downloadSelectServiceToEnable": "Select a built-in service to enable", + "downloadSelectServiceToEnable": "Select Tidal or Qobuz to enable this option", "@downloadSelectServiceToEnable": { "description": "Hint shown instead of Ask-quality subtitle when no built-in service selected" }, - "downloadSelectTidalQobuz": "Select Tidal or Qobuz above to configure quality", + "downloadSelectTidalQobuz": "Select Tidal or Qobuz to choose audio quality", "@downloadSelectTidalQobuz": { "description": "Info hint when non-Tidal/Qobuz service is selected" }, - "downloadEmbedLyricsDisabled": "Disabled while Embed Metadata is turned off", + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle for Embed Lyrics when Embed Metadata is disabled" }, @@ -3854,11 +3854,11 @@ "@downloadNeteaseIncludeTranslation": { "description": "Toggle title for including Netease translated lyrics" }, - "downloadNeteaseIncludeTranslationEnabled": "Append translated lyrics when available", + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is enabled" }, - "downloadNeteaseIncludeTranslationDisabled": "Use original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Solo letras originales", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is disabled" }, @@ -3866,59 +3866,59 @@ "@downloadNeteaseIncludeRomanization": { "description": "Toggle title for including Netease romanized lyrics" }, - "downloadNeteaseIncludeRomanizationEnabled": "Append romanized lyrics when available", + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is enabled" }, - "downloadNeteaseIncludeRomanizationDisabled": "Disabled", + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is disabled" }, - "downloadAppleQqMultiPerson": "Apple/QQ Multi-Person Word-by-Word", + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", "@downloadAppleQqMultiPerson": { "description": "Toggle title for Apple/QQ multi-person word-by-word lyrics" }, - "downloadAppleQqMultiPersonEnabled": "Enable v1/v2 speaker and [bg:] tags", + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person word-by-word is enabled" }, - "downloadAppleQqMultiPersonDisabled": "Simplified word-by-word formatting", + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person word-by-word is disabled" }, - "downloadMusixmatchLanguage": "Musixmatch Language", + "downloadMusixmatchLanguage": "Idioma de Musixmatch", "@downloadMusixmatchLanguage": { "description": "Setting title for Musixmatch language preference" }, - "downloadMusixmatchLanguageAuto": "Auto (original)", + "downloadMusixmatchLanguageAuto": "Auto (original language)", "@downloadMusixmatchLanguageAuto": { "description": "Option label when Musixmatch uses original language" }, - "downloadFilterContributing": "Filter contributing artists in Album Artist", + "downloadFilterContributing": "Filter Contributing Artists", "@downloadFilterContributing": { "description": "Toggle title for filtering contributing artists in Album Artist metadata" }, - "downloadFilterContributingEnabled": "Album Artist metadata uses primary artist only", + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is enabled" }, - "downloadFilterContributingDisabled": "Keep full Album Artist metadata value", + "downloadFilterContributingDisabled": "Full Album Artist string used", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is disabled" }, - "downloadProvidersNoneEnabled": "None enabled", + "downloadProvidersNoneEnabled": "No hay proveedores activos", "@downloadProvidersNoneEnabled": { "description": "Subtitle for lyrics providers setting when no providers are enabled" }, - "downloadMusixmatchLanguageCode": "Language code", + "downloadMusixmatchLanguageCode": "Código de idioma", "@downloadMusixmatchLanguageCode": { "description": "Label for the Musixmatch language code text field" }, - "downloadMusixmatchLanguageHint": "auto / en / es / ja", + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Hint text for the Musixmatch language code field" }, - "downloadMusixmatchLanguageDesc": "Set preferred language code (example: en, es, ja). Leave empty for auto.", + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in the Musixmatch language picker" }, @@ -3926,23 +3926,23 @@ "@downloadMusixmatchAuto": { "description": "Button to reset Musixmatch language to automatic" }, - "downloadNetworkAnySubtitle": "WiFi + Mobile Data", + "downloadNetworkAnySubtitle": "Usar Wi-Fi o datos móviles", "@downloadNetworkAnySubtitle": { "description": "Subtitle for 'Any' network mode option" }, - "downloadNetworkWifiOnlySubtitle": "Pause downloads on mobile data", + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for 'WiFi only' network mode option" }, - "downloadSongLinkRegionDesc": "Used as userCountry for SongLink API lookup.", + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", "@downloadSongLinkRegionDesc": { "description": "Description in the SongLink region picker" }, - "snackbarUnsupportedAudioFormat": "Unsupported audio format", + "snackbarUnsupportedAudioFormat": "Formato de audio no soportado", "@snackbarUnsupportedAudioFormat": { "description": "Snackbar when the audio format is not supported for the requested operation" }, - "cacheRefresh": "Refresh", + "cacheRefresh": "Actualizar", "@cacheRefresh": { "description": "Tooltip for refresh button on cache management page" }, @@ -3971,7 +3971,7 @@ "@bulkDownloadSelectPlaylists": { "description": "Button label when no playlists are selected for download" }, - "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", + "snackbarSelectedPlaylistsEmpty": "Las listas de reproducción seleccionadas no tienen pistas", "@snackbarSelectedPlaylistsEmpty": { "description": "Snackbar when selected playlists contain no tracks" }, @@ -3992,15 +3992,15 @@ "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, - "editMetadataAutoFillFetch": "Fetch & Fill", + "editMetadataAutoFillFetch": "Recuperar y llenar", "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" }, - "editMetadataAutoFillSearching": "Searching online...", + "editMetadataAutoFillSearching": "Buscando en línea...", "@editMetadataAutoFillSearching": { "description": "Snackbar shown while searching for online metadata" }, - "editMetadataAutoFillNoResults": "No matching metadata found online", + "editMetadataAutoFillNoResults": "No hay información coincidente en línea", "@editMetadataAutoFillNoResults": { "description": "Snackbar when online metadata search returns no results" }, @@ -4017,35 +4017,35 @@ "@editMetadataAutoFillNoneSelected": { "description": "Snackbar when user taps Fetch without selecting any fields" }, - "editMetadataFieldTitle": "Title", + "editMetadataFieldTitle": "Título", "@editMetadataFieldTitle": { "description": "Chip label for title field in auto-fill selector" }, - "editMetadataFieldArtist": "Artist", + "editMetadataFieldArtist": "Artista", "@editMetadataFieldArtist": { "description": "Chip label for artist field in auto-fill selector" }, - "editMetadataFieldAlbum": "Album", + "editMetadataFieldAlbum": "Álbum", "@editMetadataFieldAlbum": { "description": "Chip label for album field in auto-fill selector" }, - "editMetadataFieldAlbumArtist": "Album Artist", + "editMetadataFieldAlbumArtist": "Artista del álbum", "@editMetadataFieldAlbumArtist": { "description": "Chip label for album artist field in auto-fill selector" }, - "editMetadataFieldDate": "Date", + "editMetadataFieldDate": "Fecha", "@editMetadataFieldDate": { "description": "Chip label for date field in auto-fill selector" }, - "editMetadataFieldTrackNum": "Track #", + "editMetadataFieldTrackNum": "Pista #", "@editMetadataFieldTrackNum": { "description": "Chip label for track number field in auto-fill selector" }, - "editMetadataFieldDiscNum": "Disc #", + "editMetadataFieldDiscNum": "Disco #", "@editMetadataFieldDiscNum": { "description": "Chip label for disc number field in auto-fill selector" }, - "editMetadataFieldGenre": "Genre", + "editMetadataFieldGenre": "Género", "@editMetadataFieldGenre": { "description": "Chip label for genre field in auto-fill selector" }, @@ -4057,23 +4057,23 @@ "@editMetadataFieldLabel": { "description": "Chip label for label field in auto-fill selector" }, - "editMetadataFieldCopyright": "Copyright", + "editMetadataFieldCopyright": "Derechos de autor", "@editMetadataFieldCopyright": { "description": "Chip label for copyright field in auto-fill selector" }, - "editMetadataFieldCover": "Cover Art", + "editMetadataFieldCover": "Carátula", "@editMetadataFieldCover": { "description": "Chip label for cover art field in auto-fill selector" }, - "editMetadataSelectAll": "All", + "editMetadataSelectAll": "Todos", "@editMetadataSelectAll": { "description": "Button to select all fields for auto-fill" }, - "editMetadataSelectEmpty": "Empty only", + "editMetadataSelectEmpty": "Solo vacíos", "@editMetadataSelectEmpty": { "description": "Button to select only fields that are currently empty" }, - "queueDownloadingCount": "Downloading ({count})", + "queueDownloadingCount": "Descargando ({count})", "@queueDownloadingCount": { "description": "Header for active downloads section with count", "placeholders": { @@ -4082,11 +4082,11 @@ } } }, - "queueDownloadedHeader": "Downloaded", + "queueDownloadedHeader": "Descargadas", "@queueDownloadedHeader": { "description": "Header label for downloaded items section in library" }, - "queueFilteringIndicator": "Filtering...", + "queueFilteringIndicator": "Filtrando...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" }, @@ -4108,15 +4108,15 @@ } } }, - "queueEmptyAlbums": "No album downloads", + "queueEmptyAlbums": "No se han descargado álbumes", "@queueEmptyAlbums": { "description": "Empty state title when no album downloads exist" }, - "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", + "queueEmptyAlbumsSubtitle": "Descarga varias canciones de un álbum para verlas aquí", "@queueEmptyAlbumsSubtitle": { "description": "Empty state subtitle for album downloads" }, - "queueEmptySingles": "No single downloads", + "queueEmptySingles": "No hay descargas", "@queueEmptySingles": { "description": "Empty state title when no single track downloads exist" }, @@ -4124,7 +4124,7 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, - "queueEmptyHistory": "No download history", + "queueEmptyHistory": "No hay historial de descargas", "@queueEmptyHistory": { "description": "Empty state title when download history is empty" }, @@ -4132,11 +4132,11 @@ "@queueEmptyHistorySubtitle": { "description": "Empty state subtitle for download history" }, - "selectionAllPlaylistsSelected": "All playlists selected", + "selectionAllPlaylistsSelected": "Todas las listas seleccionadas", "@selectionAllPlaylistsSelected": { "description": "Shown when all playlists are selected in selection mode" }, - "selectionTapPlaylistsToSelect": "Tap playlists to select", + "selectionTapPlaylistsToSelect": "Pulsa listas de reproducción para seleccionar", "@selectionTapPlaylistsToSelect": { "description": "Hint shown in playlist selection mode" }, @@ -4152,23 +4152,23 @@ "@audioAnalysisDescription": { "description": "Description for audio analysis tap-to-analyze prompt" }, - "audioAnalysisAnalyzing": "Analyzing audio...", + "audioAnalysisAnalyzing": "Analizando audio...", "@audioAnalysisAnalyzing": { "description": "Loading text while analyzing audio" }, - "audioAnalysisSampleRate": "Sample Rate", + "audioAnalysisSampleRate": "Frecuencia de muestreo", "@audioAnalysisSampleRate": { "description": "Sample rate metric label" }, - "audioAnalysisBitDepth": "Bit Depth", + "audioAnalysisBitDepth": "Profundidad de bits", "@audioAnalysisBitDepth": { "description": "Bit depth metric label" }, - "audioAnalysisChannels": "Channels", + "audioAnalysisChannels": "Canales", "@audioAnalysisChannels": { "description": "Channels metric label" }, - "audioAnalysisDuration": "Duration", + "audioAnalysisDuration": "Duración", "@audioAnalysisDuration": { "description": "Duration metric label" }, @@ -4176,11 +4176,11 @@ "@audioAnalysisNyquist": { "description": "Nyquist frequency metric label" }, - "audioAnalysisFileSize": "Size", + "audioAnalysisFileSize": "Tamaño", "@audioAnalysisFileSize": { "description": "File size metric label" }, - "audioAnalysisDynamicRange": "Dynamic Range", + "audioAnalysisDynamicRange": "Rango dinámico", "@audioAnalysisDynamicRange": { "description": "Dynamic range metric label" }, @@ -4192,19 +4192,19 @@ "@audioAnalysisRms": { "description": "RMS level metric label" }, - "audioAnalysisSamples": "Samples", + "audioAnalysisSamples": "Muestras", "@audioAnalysisSamples": { "description": "Total samples metric label" }, - "audioAnalysisRescan": "Re-analyze", + "audioAnalysisRescan": "Volver a analizar", "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Volviendo a analizar audio...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Search with {providerName}", + "extensionsSearchWith": "Buscar con {providerName}", "@extensionsSearchWith": { "description": "Extensions page - subtitle for built-in search provider option", "placeholders": { @@ -4225,7 +4225,7 @@ "@extensionsHomeFeedAuto": { "description": "Extensions page - home feed provider option: auto" }, - "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", + "extensionsHomeFeedAutoSubtitle": "Seleccionar automáticamente la mejor disponible", "@extensionsHomeFeedAutoSubtitle": { "description": "Extensions page - subtitle for auto home feed option" }, @@ -4250,7 +4250,7 @@ "@sortAlphaDesc": { "description": "Sort option - alphabetical descending" }, - "cancelDownloadTitle": "Cancel download?", + "cancelDownloadTitle": "¿Cancelar descarga?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" }, @@ -4263,7 +4263,7 @@ } } }, - "cancelDownloadKeep": "Keep", + "cancelDownloadKeep": "Mantener", "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, @@ -4300,11 +4300,11 @@ "@notifChannelDownloadName": { "description": "Android notification channel name for download progress" }, - "notifChannelDownloadDesc": "Shows download progress for tracks", + "notifChannelDownloadDesc": "Muestra el progreso de la descarga para las pistas", "@notifChannelDownloadDesc": { "description": "Android notification channel description for download progress" }, - "notifChannelLibraryScanName": "Library Scan", + "notifChannelLibraryScanName": "Escaneo de biblioteca", "@notifChannelLibraryScanName": { "description": "Android notification channel name for library scan" }, @@ -4321,7 +4321,7 @@ } } }, - "notifFinalizingTrack": "Finalizing {trackName}", + "notifFinalizingTrack": "Finalizando {trackName}", "@notifFinalizingTrack": { "description": "Notification title while finalizing (embedding metadata) a track", "placeholders": { @@ -4330,7 +4330,7 @@ } } }, - "notifEmbeddingMetadata": "Embedding metadata...", + "notifEmbeddingMetadata": "Insertando información...", "@notifEmbeddingMetadata": { "description": "Notification body while embedding metadata into a downloaded track" }, @@ -4362,7 +4362,7 @@ } } }, - "notifDownloadComplete": "Download Complete", + "notifDownloadComplete": "Descarga completa", "@notifDownloadComplete": { "description": "Notification title when a single download is complete" }, @@ -4378,11 +4378,11 @@ } } }, - "notifAllDownloadsComplete": "All Downloads Complete", + "notifAllDownloadsComplete": "Todas las descargas completadas", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count} tracks downloaded successfully", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -4391,7 +4391,7 @@ } } }, - "notifScanningLibrary": "Scanning local library", + "notifScanningLibrary": "Escaneando biblioteca local", "@notifScanningLibrary": { "description": "Notification title while scanning local library" }, @@ -4422,7 +4422,7 @@ } } }, - "notifLibraryScanComplete": "Library scan complete", + "notifLibraryScanComplete": "Escaneo de biblioteca completado", "@notifLibraryScanComplete": { "description": "Notification title when library scan finishes" }, @@ -4444,7 +4444,7 @@ } } }, - "notifLibraryScanErrors": "{count} errors", + "notifLibraryScanErrors": "{count} errores", "@notifLibraryScanErrors": { "description": "Library scan complete suffix - error count", "placeholders": { @@ -4489,7 +4489,7 @@ } } }, - "notifUpdateReady": "Update Ready", + "notifUpdateReady": "Actualización preparada", "@notifUpdateReady": { "description": "Notification title when app update download is complete" }, @@ -4510,76 +4510,1049 @@ "@notifUpdateFailedBody": { "description": "Notification body when app update download fails" }, - "settingsFiles": "Files & Folders", + "settingsFiles": "Archivos y carpetas", "@settingsFiles": { "description": "Settings menu item - file and folder settings" }, - "settingsFilesSubtitle": "Download location, filename, folder structure", + "settingsFilesSubtitle": "Directorio de descarga, nombre de archivo y estructura de carpetas", "@settingsFilesSubtitle": { "description": "Subtitle for files & folders settings" }, - "settingsMetadata": "Metadata", + "settingsMetadata": "Información", "@settingsMetadata": { "description": "Settings menu item - metadata settings" }, - "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", + "settingsMetadataSubtitle": "Carátula, etiquetas, ReplayGain, proveedores", "@settingsMetadataSubtitle": { "description": "Subtitle for metadata settings" }, - "settingsLyrics": "Lyrics", + "settingsLyrics": "Letra", "@settingsLyrics": { "description": "Settings menu item - lyrics settings" }, - "settingsLyricsSubtitle": "Embed, mode, providers, language options", + "settingsLyricsSubtitle": "Insertar, modo, proveedores, opciones de idioma", "@settingsLyricsSubtitle": { "description": "Subtitle for lyrics settings" }, - "settingsApp": "App", + "settingsApp": "Aplicación", "@settingsApp": { "description": "Settings menu item - app settings" }, - "settingsAppSubtitle": "Updates, data, extension repo, debug", + "settingsAppSubtitle": "Actualizaciones, datos, extensiones repo, depuración", "@settingsAppSubtitle": { "description": "Subtitle for app settings" }, - "sectionMetadataProviders": "Providers", + "sectionMetadataProviders": "Proveedores", "@sectionMetadataProviders": { "description": "Settings section header for metadata providers" }, - "sectionDuplicates": "Duplicates", + "sectionDuplicates": "Duplicados", "@sectionDuplicates": { "description": "Settings section header for deduplication" }, - "sectionLyricsProviderOptions": "Provider Options", + "sectionLyricsProviderOptions": "Opciones del proveedor", "@sectionLyricsProviderOptions": { "description": "Settings section header for per-provider lyrics options" }, - "metadataProvidersTitle": "Metadata Provider Priority", + "metadataProvidersTitle": "Prioridad de proveedor de información", "@metadataProvidersTitle": { "description": "Settings item title for metadata provider order" }, - "metadataProvidersSubtitle": "Drag to set search and metadata source order", + "metadataProvidersSubtitle": "Arrastre para establecer orden de búsqueda y origen de información", "@metadataProvidersSubtitle": { "description": "Subtitle for metadata provider priority item" }, - "downloadDeduplication": "Skip Duplicate Downloads", + "downloadDeduplication": "Saltar descargas duplicadas", "@downloadDeduplication": { "description": "Setting - skip tracks already in download history" }, - "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", + "downloadDeduplicationEnabled": "Las pistas previamente descargadas se omitirán", "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, - "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", + "downloadDeduplicationDisabled": "Todas las pistas se descargarán independientemente del historial", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, - "downloadFallbackExtensions": "Fallback Extensions", + "downloadFallbackExtensions": "Reslpado de extensiones", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" }, - "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", + "downloadFallbackExtensionsSubtitle": "Elige qué extensiones se pueden utilizar como alternativa", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" + }, + "homeEmptyTitle": "J", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Instalar una extensión para continuar.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "setupLanguageTitle": "Elegir idioma", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Selecciona tu idioma preferido para la aplicación. Puedes cambiar esto luego en Configuración.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "Idioma predeterminado", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "trackLyricsSource": "Fuente: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "extensionsInstalledCount": "{count} Extensiones instaladas correctamente", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "{installed} Instalados de {attempted} extensiones", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "downloadLossyAac": "AAC/M4A (320 kbps)", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "La mejor compatibilidad con dispositivos móviles, formato M4A", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "collectionFavoriteArtists": "Artistas favoritos", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionFavoriteArtistsEmptyTitle": "Aún no hay artistas favoritos", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "artistOptionAddToFavorites": "Añadir a artistas favoritos", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "audioAnalysisCodec": "Códec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Contenedor", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Formato decodificado", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "extensionsHomeFeedOff": "Desactivado", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Descargas canceladas", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "searchTracks": "Pistas", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Importar CSV", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Pegar", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Buscar canciones...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Buscar pistas", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Pegar o buscar...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Descarga completada", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Descarga en curso", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Comenzar descarga", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Incrustar información", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Escribir información, carátulas y letras incrustadas en archivos", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Reemplazar portada", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Elegir portada", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Borrar portada seleccionada", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Portada actual", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Carátula seleccionada", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "La portada seleccionada sustituirá a la portada actual incrustada cuando pulses Guardar.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Detener", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizando descarga", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Descarga completada", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Selecciona un color de contraste {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Limpiar búsqueda", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Etiquetas", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Información", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Descartar", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Abrir {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Abrir {title}, {count} {count, plural, =1{objeto} other{objetos}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Abrir álbum {albumName} de {artistName}, {trackCount} pistas", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} de {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Seleccionar álbum {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Abrir álbum {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "editMetadataFieldDateHint": "AAA-MM-DD o AAAA", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Total de pistas", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Total de discos", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Compositor", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comentario", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Avanzado", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Falta número de pista", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Falta número de álbum", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Falta artista", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Formato de ISRC erróneo", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Falta etiqueta", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "¿Eliminar {count} {count, plural, =1{lista} other{listas de reproducción}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{lista} other{listas de reproducción}} eliminadas", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Añadido {count} {count, plural, =1{track} other{tracks}} a {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Añadido {count} {count, plural, =1{pista} other{pistas}} a {playlistName} ({alreadyCount} ya en la lista de reproducción)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1 {objeto} other{objetos}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Información enriquecida nuevamente con éxito\n({successCount}/{total}) - Fallaron: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Eliminar {count} {count, plural, =1{pista} other{pistas}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Descargando - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "Comenzando...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Seleccionar pista", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "No seleccionar pista", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Reproducir {trackName} de {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extensión} other{extensiones}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requiere v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Ir", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Resumen de incidencias", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total de errores: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Afectados: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Escaneo cancelado", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "Puedes volver a intentar el escaneo cuando esté listo.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} del historial de descargas (excluidos de la lista)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Trabajador de descarga nativo", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Operador de servicios beta android para descargas de extensión", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BETA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "Estado del servicio", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Estado de servicio", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{chequeo} other{chequeos}} ", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Pulsa para conectar a Spotify y rellenar el campo.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Última comprobación {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Actualizar estado", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Gestión de URL personalizada", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "Esta extensión puede manejar enlaces de estos sitios", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Comparte enlaces de estos sitios a SpotiFLAC Mobile y esta extensión los manejará.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{ajuste} other{ajustes}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "En línea", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degradado", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Sin conexión", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Sin configurar", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Desconocido", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "requerido", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Sin establecer", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Error de acción", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Ingrese un valor", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Servicio en línea", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Servicio degradado", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Servicio fuera de línea", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Estado de servicio desconocido", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Estéreo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Abrir en {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Incrustado", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Álbum desconocido", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Artista desconocido", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Almacenamiento", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notificación", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Directorio seleccionado inválido", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "No se puede obtener acceso al directorio seleccionado", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "Cualquier", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Información", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Descargar", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utilidad", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Letras", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integración", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Lanzamientos", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } } } diff --git a/lib/l10n/arb/app_fr.arb b/lib/l10n/arb/app_fr.arb index 2293f8ee..218a08dd 100644 --- a/lib/l10n/arb/app_fr.arb +++ b/lib/l10n/arb/app_fr.arb @@ -1,6 +1,6 @@ { "@@locale": "fr", - "@@last_modified": "2026-01-16", + "@@last_modified": "2026-04-28", "appName": "SpotiFLAC Mobile", "@appName": { "description": "App name - DO NOT TRANSLATE" @@ -9,7 +9,7 @@ "@navHome": { "description": "Bottom navigation - Home tab" }, - "navLibrary": "Bibliothèques", + "navLibrary": "Bibliothèque", "@navLibrary": { "description": "Bottom navigation - Library tab" }, @@ -17,7 +17,7 @@ "@navSettings": { "description": "Bottom navigation - Settings tab" }, - "navStore": "Repo", + "navStore": "Dépôt", "@navStore": { "description": "Bottom navigation - Extension store tab" }, @@ -25,11 +25,11 @@ "@homeTitle": { "description": "Home screen title" }, - "homeSubtitle": "Paste a supported URL or search by name", + "homeSubtitle": "Collez une URL prise en charge ou effectuez une recherche par nom", "@homeSubtitle": { "description": "Subtitle shown below search box" }, - "homeSupports": "Supports: Piste, Album, Playlist, Artiste URLs", + "homeSupports": "Prise en charge : URL de titres, d’albums, de playlists et d’artistes", "@homeSupports": { "description": "Info text about supported URL types" }, @@ -89,11 +89,11 @@ "@downloadFilenameFormat": { "description": "Setting for output filename pattern" }, - "downloadSingleFilenameFormat": "Single Filename Format", + "downloadSingleFilenameFormat": "Format de nom de fichier unique", "@downloadSingleFilenameFormat": { "description": "Setting for output filename pattern for singles/EPs" }, - "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", + "downloadSingleFilenameFormatDescription": "Modèle de nom de fichier pour les singles et les EP. Utilise les mêmes balises que le format album.", "@downloadSingleFilenameFormatDescription": { "description": "Subtitle description for single filename format setting" }, @@ -125,11 +125,11 @@ "@appearanceDynamicColorSubtitle": { "description": "Subtitle for dynamic color" }, - "appearanceHistoryView": "Historique Vue", + "appearanceHistoryView": "Historique", "@appearanceHistoryView": { "description": "Layout style for history" }, - "appearanceHistoryViewList": "", + "appearanceHistoryViewList": "Liste", "@appearanceHistoryViewList": { "description": "List layout option" }, @@ -145,11 +145,11 @@ "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Service utilisé lors de la recherche par nom de piste.", + "optionsPrimaryProviderSubtitle": "Service permettant d'effectuer une recherche par titre de morceau ou d'album", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, - "optionsUsingExtension": "Utilisation de l'extension: {extensionName}", + "optionsUsingExtension": "Utilisation de l'extension : {extensionName}", "@optionsUsingExtension": { "description": "Shows active extension name", "placeholders": { @@ -158,11 +158,11 @@ } } }, - "optionsDefaultSearchTab": "Default Search Tab", + "optionsDefaultSearchTab": "Onglet de recherche par défaut", "@optionsDefaultSearchTab": { "description": "Title for the preferred default search tab setting" }, - "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "optionsDefaultSearchTabSubtitle": "Choisissez l'onglet qui s'ouvre en premier pour les nouveaux résultats de recherche.", "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, @@ -170,7 +170,7 @@ "@optionsDefaultSearchTabAlbums": { "description": "Default search tab option - Albums tab" }, - "optionsDefaultSearchTabTracks": "Tracks", + "optionsDefaultSearchTabTracks": "Titres", "@optionsDefaultSearchTabTracks": { "description": "Default search tab option - Tracks tab" }, @@ -178,7 +178,7 @@ "@optionsSwitchBack": { "description": "Hint to switch back to built-in providers" }, - "optionsAutoFallback": "Auto Fallback", + "optionsAutoFallback": "Récupération automatique", "@optionsAutoFallback": { "description": "Auto-retry with other services" }, @@ -190,27 +190,27 @@ "@optionsUseExtensionProviders": { "description": "Enable extension download providers" }, - "optionsUseExtensionProvidersOn": "Extensions will be tried first", + "optionsUseExtensionProvidersOn": "Les extensions seront d'abord essayées", "@optionsUseExtensionProvidersOn": { "description": "Status when extension providers enabled" }, - "optionsUseExtensionProvidersOff": "Using built-in providers only", + "optionsUseExtensionProvidersOff": "Utilisation exclusive des fournisseurs intégrés", "@optionsUseExtensionProvidersOff": { "description": "Status when extension providers disabled" }, - "optionsEmbedLyrics": "Embed Lyrics", + "optionsEmbedLyrics": "Intégrer les paroles", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Embed synced lyrics into FLAC files", + "optionsEmbedLyricsSubtitle": "Enregistrez les paroles synchronisées avec vos morceaux téléchargés", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "Max Quality Cover", + "optionsMaxQualityCover": "Pochette de qualité supérieure", "@optionsMaxQualityCover": { "description": "Download highest quality album art" }, - "optionsMaxQualityCoverSubtitle": "Download highest resolution cover art", + "optionsMaxQualityCoverSubtitle": "Télécharger la pochette en haute résolution", "@optionsMaxQualityCoverSubtitle": { "description": "Subtitle for max quality cover" }, @@ -218,47 +218,47 @@ "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" }, - "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", + "optionsReplayGainSubtitleOn": "Analyser le niveau sonore et intégrer des balises ReplayGain (EBU R128)", "@optionsReplayGainSubtitleOn": { "description": "Subtitle when ReplayGain is enabled" }, - "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", + "optionsReplayGainSubtitleOff": "Désactivé : aucune balise de normalisation du volume", "@optionsReplayGainSubtitleOff": { "description": "Subtitle when ReplayGain is disabled" }, - "optionsArtistTagMode": "Artist Tag Mode", + "optionsArtistTagMode": "Mode « Artiste »", "@optionsArtistTagMode": { "description": "Setting title for how artist metadata is written into files" }, - "optionsArtistTagModeDescription": "Choose how multiple artists are written into embedded tags.", + "optionsArtistTagModeDescription": "Choisissez comment les noms de plusieurs artistes doivent apparaître dans les balises intégrées.", "@optionsArtistTagModeDescription": { "description": "Bottom-sheet description for artist tag mode setting" }, - "optionsArtistTagModeJoined": "Single joined value", + "optionsArtistTagModeJoined": "Valeur unique combinée", "@optionsArtistTagModeJoined": { "description": "Artist tag mode option that joins multiple artists into one value" }, - "optionsArtistTagModeJoinedSubtitle": "Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.", + "optionsArtistTagModeJoinedSubtitle": "Indiquez une seule valeur ARTIST, par exemple « Artiste A, Artiste B », pour garantir une compatibilité maximale avec les lecteurs.", "@optionsArtistTagModeJoinedSubtitle": { "description": "Subtitle for joined artist tag mode" }, - "optionsArtistTagModeSplitVorbis": "Split tags for FLAC/Opus", + "optionsArtistTagModeSplitVorbis": "Diviser les balises pour FLAC/Opus", "@optionsArtistTagModeSplitVorbis": { "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" }, - "optionsArtistTagModeSplitVorbisSubtitle": "Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.", + "optionsArtistTagModeSplitVorbisSubtitle": "Créez une balise « artiste » par artiste pour les fichiers FLAC et Opus ; les fichiers MP3 et M4A restent regroupés.", "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, - "optionsConcurrentDownloads": "Concurrent Downloads", + "optionsConcurrentDownloads": "Téléchargements simultanés", "@optionsConcurrentDownloads": { "description": "Number of parallel downloads" }, - "optionsConcurrentSequential": "Sequential (1 at a time)", + "optionsConcurrentSequential": "Séquentiel (1 à la fois)", "@optionsConcurrentSequential": { "description": "Download one at a time" }, - "optionsConcurrentParallel": "{count} parallel downloads", + "optionsConcurrentParallel": "{count} téléchargements simultanés", "@optionsConcurrentParallel": { "description": "Multiple parallel downloads", "placeholders": { @@ -267,67 +267,67 @@ } } }, - "optionsConcurrentWarning": "Parallel downloads may trigger rate limiting", + "optionsConcurrentWarning": "Les téléchargements simultanés peuvent déclencher une limitation du débit", "@optionsConcurrentWarning": { "description": "Warning about rate limits" }, - "optionsExtensionStore": "Extension Repo", + "optionsExtensionStore": "Référentiel d'extensions", "@optionsExtensionStore": { "description": "Show/hide store tab" }, - "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", + "optionsExtensionStoreSubtitle": "Afficher l'onglet « Dépôt » dans le menu de navigation", "@optionsExtensionStoreSubtitle": { "description": "Subtitle for extension store toggle" }, - "optionsCheckUpdates": "Check for Updates", + "optionsCheckUpdates": "Vérifier les mises à jour", "@optionsCheckUpdates": { "description": "Auto update check toggle" }, - "optionsCheckUpdatesSubtitle": "Notify when new version is available", + "optionsCheckUpdatesSubtitle": "M'avertir lorsqu'une nouvelle version est disponible", "@optionsCheckUpdatesSubtitle": { "description": "Subtitle for update check" }, - "optionsUpdateChannel": "Update Channel", + "optionsUpdateChannel": "Chaîne de mise à jour", "@optionsUpdateChannel": { "description": "Stable vs preview releases" }, - "optionsUpdateChannelStable": "Stable releases only", + "optionsUpdateChannelStable": "Uniquement les versions stables", "@optionsUpdateChannelStable": { "description": "Only stable updates" }, - "optionsUpdateChannelPreview": "Get preview releases", + "optionsUpdateChannelPreview": "Accédez aux versions préliminaires", "@optionsUpdateChannelPreview": { "description": "Include beta/preview updates" }, - "optionsUpdateChannelWarning": "Preview may contain bugs or incomplete features", + "optionsUpdateChannelWarning": "La version préliminaire peut contenir des bogues ou des fonctionnalités incomplètes", "@optionsUpdateChannelWarning": { "description": "Warning about preview channel" }, - "optionsClearHistory": "Clear Download History", + "optionsClearHistory": "Effacer l'historique des téléchargements", "@optionsClearHistory": { "description": "Delete all download history" }, - "optionsClearHistorySubtitle": "Remove all downloaded tracks from history", + "optionsClearHistorySubtitle": "Supprimez tous les morceaux téléchargés de l'historique", "@optionsClearHistorySubtitle": { "description": "Subtitle for clear history" }, - "optionsDetailedLogging": "Detailed Logging", + "optionsDetailedLogging": "Journalisation détaillée", "@optionsDetailedLogging": { "description": "Enable verbose logs for debugging" }, - "optionsDetailedLoggingOn": "Detailed logs are being recorded", + "optionsDetailedLoggingOn": "Des journaux détaillés sont enregistrés", "@optionsDetailedLoggingOn": { "description": "Status when logging enabled" }, - "optionsDetailedLoggingOff": "Enable for bug reports", + "optionsDetailedLoggingOff": "Activer pour les rapports de bogues", "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Spotify Credentials", + "optionsSpotifyCredentials": "Identifiants Spotify", "@optionsSpotifyCredentials": { "description": "Spotify API credentials setting" }, - "optionsSpotifyCredentialsConfigured": "Client ID: {clientId}...", + "optionsSpotifyCredentialsConfigured": "Identifiant client : {clientId}...", "@optionsSpotifyCredentialsConfigured": { "description": "Shows configured client ID preview", "placeholders": { @@ -336,15 +336,15 @@ } } }, - "optionsSpotifyCredentialsRequired": "Required - tap to configure", + "optionsSpotifyCredentialsRequired": "Obligatoire - appuyez pour configurer", "@optionsSpotifyCredentialsRequired": { "description": "Prompt to set up credentials" }, - "optionsSpotifyWarning": "Spotify requires your own API credentials. Get them free from developer.spotify.com", + "optionsSpotifyWarning": "Spotify nécessite vos propres identifiants API. Vous pouvez les obtenir gratuitement sur developer.spotify.com", "@optionsSpotifyWarning": { "description": "Info about Spotify API requirement" }, - "optionsSpotifyDeprecationWarning": "Spotify search will be deprecated on March 3, 2026 due to Spotify API changes. Please switch to Deezer.", + "optionsSpotifyDeprecationWarning": "La fonction de recherche Spotify sera supprimée le 3 mars 2026 en raison de modifications apportées à l'API Spotify. Veuillez passer à Deezer.", "@optionsSpotifyDeprecationWarning": { "description": "Warning about Spotify API deprecation" }, @@ -378,7 +378,7 @@ "@extensionsUninstall": { "description": "Uninstall extension button" }, - "storeTitle": "Extension Repo", + "storeTitle": "Répertoire des extensions", "@storeTitle": { "description": "Store screen title" }, @@ -398,7 +398,7 @@ "@storeUpdate": { "description": "Update available button" }, - "aboutTitle": "À propos de", + "aboutTitle": "À propos", "@aboutTitle": { "description": "About page title" }, @@ -410,55 +410,55 @@ "@aboutMobileDeveloper": { "description": "Role description for mobile dev" }, - "aboutOriginalCreator": "Créateur de SpotiFLAC original", + "aboutOriginalCreator": "Créateur de la version originale de SpotiFLAC", "@aboutOriginalCreator": { "description": "Role description for original creator" }, - "aboutLogoArtist": "The talented artist who created our beautiful app logo!", + "aboutLogoArtist": "Le talentueux artiste qui a créé le magnifique logo de notre application !", "@aboutLogoArtist": { "description": "Role description for logo artist" }, - "aboutTranslators": "Translators", + "aboutTranslators": "Traducteurs", "@aboutTranslators": { "description": "Section for translators" }, - "aboutSpecialThanks": "Special Thanks", + "aboutSpecialThanks": "Remerciements particuliers", "@aboutSpecialThanks": { "description": "Section for special thanks" }, - "aboutLinks": "Links", + "aboutLinks": "Liens", "@aboutLinks": { "description": "Section for external links" }, - "aboutMobileSource": "Mobile source code", + "aboutMobileSource": "Code source pour mobile", "@aboutMobileSource": { "description": "Link to mobile GitHub repo" }, - "aboutPCSource": "PC source code", + "aboutPCSource": "Code source pour PC", "@aboutPCSource": { "description": "Link to PC GitHub repo" }, - "aboutKeepAndroidOpen": "Keep Android Open", + "aboutKeepAndroidOpen": "Garder Android ouvert", "@aboutKeepAndroidOpen": { "description": "Link to Keep Android Open campaign website" }, - "aboutReportIssue": "Report an issue", + "aboutReportIssue": "Signaler un problème", "@aboutReportIssue": { "description": "Link to report bugs" }, - "aboutReportIssueSubtitle": "Report any problems you encounter", + "aboutReportIssueSubtitle": "Signalez tout problème que vous rencontrez", "@aboutReportIssueSubtitle": { "description": "Subtitle for report issue" }, - "aboutFeatureRequest": "Feature request", + "aboutFeatureRequest": "Demande de fonctionnalité", "@aboutFeatureRequest": { "description": "Link to suggest features" }, - "aboutFeatureRequestSubtitle": "Suggest new features for the app", + "aboutFeatureRequestSubtitle": "Proposez de nouvelles fonctionnalités pour l'application", "@aboutFeatureRequestSubtitle": { "description": "Subtitle for feature request" }, - "aboutTelegramChannel": "Telegram Channel", + "aboutTelegramChannel": "Chaîne Telegram", "@aboutTelegramChannel": { "description": "Link to Telegram channel" }, @@ -466,19 +466,19 @@ "@aboutTelegramChannelSubtitle": { "description": "Subtitle for Telegram channel" }, - "aboutTelegramChat": "Telegram Community", + "aboutTelegramChat": "Communauté Telegram", "@aboutTelegramChat": { "description": "Link to Telegram chat group" }, - "aboutTelegramChatSubtitle": "Chat with other users", + "aboutTelegramChatSubtitle": "Discutez avec d'autres utilisateurs", "@aboutTelegramChatSubtitle": { "description": "Subtitle for Telegram chat" }, - "aboutSocial": "Social", + "aboutSocial": "Réseaux sociaux", "@aboutSocial": { "description": "Section for social links" }, - "aboutApp": "App", + "aboutApp": "Application", "@aboutApp": { "description": "Section for app info" }, @@ -486,19 +486,19 @@ "@aboutVersion": { "description": "Version info label" }, - "aboutBinimumDesc": "The creator of QQDL & HiFi API. Without this API, Tidal downloads wouldn't exist!", + "aboutBinimumDesc": "Le créateur de QQDL et de l'API HiFi. Sans cette API, les téléchargements depuis Tidal n'existeraient pas !", "@aboutBinimumDesc": { "description": "Credit description for binimum" }, - "aboutSachinsenalDesc": "The original HiFi project creator. The foundation of Tidal integration!", + "aboutSachinsenalDesc": "Le créateur du projet HiFi original. La base de l'intégration de Tidal !", "@aboutSachinsenalDesc": { "description": "Credit description for sachinsenal0x64" }, - "aboutSjdonadoDesc": "Creator of I Don't Have Spotify (IDHS). The fallback link resolver that saves the day!", + "aboutSjdonadoDesc": "Créateur de « I Don't Have Spotify » (IDHS). Le résolveur de liens de secours qui sauve la mise !", "@aboutSjdonadoDesc": { "description": "Credit description for sjdonado" }, - "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", + "aboutAppDescription": "Recherchez des métadonnées musicales, gérez les extensions et organisez votre bibliothèque.", "@aboutAppDescription": { "description": "App description in header card" }, @@ -514,11 +514,11 @@ "@artistCompilations": { "description": "Section header for compilations" }, - "artistPopular": "Popular", + "artistPopular": "Populaire", "@artistPopular": { "description": "Section header for popular/top tracks" }, - "artistMonthlyListeners": "{count} monthly listeners", + "artistMonthlyListeners": "{count} auditeurs mensuels", "@artistMonthlyListeners": { "description": "Monthly listener count display", "placeholders": { @@ -532,7 +532,7 @@ "@trackMetadataService": { "description": "Metadata field - download service used" }, - "trackMetadataPlay": "Jouer", + "trackMetadataPlay": "Lire", "@trackMetadataPlay": { "description": "Action button - play track" }, @@ -544,31 +544,31 @@ "@trackMetadataDelete": { "description": "Action button - delete track" }, - "setupGrantPermission": "Grant Permission", + "setupGrantPermission": "Accorder l'autorisation", "@setupGrantPermission": { "description": "Button to request permission" }, - "setupSkip": "Skip for now", + "setupSkip": "Ignorer pour le moment", "@setupSkip": { "description": "Skip current step button" }, - "setupStorageAccessRequired": "Storage Access Required", + "setupStorageAccessRequired": "Accès au stockage requis", "@setupStorageAccessRequired": { "description": "Title when storage access needed" }, - "setupStorageAccessMessageAndroid11": "Android 11+ requires \"All files access\" permission to save files to your chosen download folder.", + "setupStorageAccessMessageAndroid11": "Depuis Android 11, l'autorisation « Accès à tous les fichiers » est requise pour enregistrer des fichiers dans le dossier de téléchargement de votre choix.", "@setupStorageAccessMessageAndroid11": { "description": "Android 11+ specific explanation" }, - "setupOpenSettings": "Open Settings", + "setupOpenSettings": "Ouvrir les paramètres", "@setupOpenSettings": { "description": "Button to open system settings" }, - "setupPermissionDeniedMessage": "Permission denied. Please grant all permissions to continue.", + "setupPermissionDeniedMessage": "Autorisation refusée. Veuillez accorder toutes les autorisations pour continuer.", "@setupPermissionDeniedMessage": { "description": "Error when permission denied" }, - "setupPermissionRequired": "{permissionType} Permission Required", + "setupPermissionRequired": "Autorisation {permissionType} requise", "@setupPermissionRequired": { "description": "Generic permission required title", "placeholders": { @@ -578,7 +578,7 @@ } } }, - "setupPermissionRequiredMessage": "{permissionType} permission is required for the best experience. You can change this later in Settings.", + "setupPermissionRequiredMessage": "L'autorisation {permissionType} est requise pour profiter pleinement de l'application. Vous pourrez modifier ce paramètre ultérieurement dans les Paramètres.", "@setupPermissionRequiredMessage": { "description": "Generic permission required message", "placeholders": { @@ -587,67 +587,67 @@ } } }, - "setupUseDefaultFolder": "Use Default Folder?", + "setupUseDefaultFolder": "Utiliser le dossier par défaut ?", "@setupUseDefaultFolder": { "description": "Dialog title for default folder" }, - "setupNoFolderSelected": "No folder selected. Would you like to use the default Music folder?", + "setupNoFolderSelected": "Aucun dossier n'est sélectionné. Souhaitez-vous utiliser le dossier Musique par défaut ?", "@setupNoFolderSelected": { "description": "Prompt when no folder selected" }, - "setupUseDefault": "Use Default", + "setupUseDefault": "Utiliser les paramètres par défaut", "@setupUseDefault": { "description": "Button to use default folder" }, - "setupDownloadLocationTitle": "Download Location", + "setupDownloadLocationTitle": "Emplacement de téléchargement", "@setupDownloadLocationTitle": { "description": "Download location dialog title" }, - "setupDownloadLocationIosMessage": "On iOS, downloads are saved to the app's Documents folder. You can access them via the Files app.", + "setupDownloadLocationIosMessage": "Sous iOS, les fichiers téléchargés sont enregistrés dans le dossier « Documents » de l'application. Vous pouvez y accéder via l'application Fichiers.", "@setupDownloadLocationIosMessage": { "description": "iOS-specific folder info" }, - "setupAppDocumentsFolder": "App Documents Folder", + "setupAppDocumentsFolder": "Dossier « Documents » de l'application", "@setupAppDocumentsFolder": { "description": "iOS documents folder option" }, - "setupAppDocumentsFolderSubtitle": "Recommended - accessible via Files app", + "setupAppDocumentsFolderSubtitle": "Recommandé - accessible via l'application Fichiers", "@setupAppDocumentsFolderSubtitle": { "description": "Subtitle for documents folder" }, - "setupChooseFromFiles": "Choose from Files", + "setupChooseFromFiles": "Sélectionnez un fichier", "@setupChooseFromFiles": { "description": "iOS file picker option" }, - "setupChooseFromFilesSubtitle": "Select iCloud or other location", + "setupChooseFromFilesSubtitle": "Sélectionnez iCloud ou un autre emplacement", "@setupChooseFromFilesSubtitle": { "description": "Subtitle for file picker" }, - "setupIosEmptyFolderWarning": "iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.", + "setupIosEmptyFolderWarning": "Limitation iOS : les dossiers vides ne peuvent pas être sélectionnés. Choisissez un dossier contenant au moins un fichier.", "@setupIosEmptyFolderWarning": { "description": "iOS folder selection warning" }, - "setupIcloudNotSupported": "iCloud Drive is not supported. Please use the app Documents folder.", + "setupIcloudNotSupported": "iCloud Drive n'est pas pris en charge. Veuillez utiliser le dossier « Documents » de l'application.", "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Download Spotify tracks in FLAC", + "setupDownloadInFlac": "Télécharger des morceaux Spotify au format FLAC", "@setupDownloadInFlac": { "description": "App tagline in setup" }, - "setupStorageGranted": "Storage Permission Granted!", + "setupStorageGranted": "Autorisation de stockage accordée !", "@setupStorageGranted": { "description": "Success message for storage permission" }, - "setupStorageRequired": "Storage Permission Required", + "setupStorageRequired": "Autorisation de stockage requise", "@setupStorageRequired": { "description": "Title when storage permission needed" }, - "setupStorageDescription": "SpotiFLAC needs storage permission to save your downloaded music files.", + "setupStorageDescription": "SpotiFLAC a besoin d'une autorisation d'accès au stockage pour enregistrer vos fichiers musicaux téléchargés.", "@setupStorageDescription": { "description": "Explanation for storage permission" }, - "setupNotificationGranted": "Autorisation de notifications accordée!", + "setupNotificationGranted": "Autorisation de notification accordée !", "@setupNotificationGranted": { "description": "Success message for notification permission" }, @@ -655,7 +655,7 @@ "@setupNotificationEnable": { "description": "Button to enable notifications" }, - "setupFolderChoose": "Choisissez le dossier pour télécharger", + "setupFolderChoose": "Choisissez le dossier de téléchargement", "@setupFolderChoose": { "description": "Button to choose folder" }, @@ -671,7 +671,7 @@ "@setupEnableNotifications": { "description": "Button to enable notifications" }, - "setupNotificationBackgroundDescription": "Get notified about download progress and completion. This helps you track downloads when the app is in background.", + "setupNotificationBackgroundDescription": "Recevez des notifications sur la progression et la fin du téléchargement. Cela vous permet de suivre les téléchargements lorsque l'application est en arrière-plan.", "@setupNotificationBackgroundDescription": { "description": "Detailed notification explanation" }, @@ -687,7 +687,7 @@ "@setupGetStarted": { "description": "Final setup button" }, - "setupAllowAccessToManageFiles": "Veuillez activer \"Autoriser l'accès à tous les fichiers\" sur l'écran suivant.", + "setupAllowAccessToManageFiles": "Veuillez cocher la case « Autoriser l'accès pour gérer tous les fichiers » sur l'écran suivant.", "@setupAllowAccessToManageFiles": { "description": "Instruction for file access permission" }, @@ -707,15 +707,15 @@ "@dialogRetry": { "description": "Dialog button - retry action" }, - "dialogClear": "Clear", + "dialogClear": "Effacer", "@dialogClear": { "description": "Dialog button - clear items" }, - "dialogDone": "Done", + "dialogDone": "C'est fait", "@dialogDone": { "description": "Dialog button - action completed" }, - "dialogImport": "Import", + "dialogImport": "Importer", "@dialogImport": { "description": "Dialog button - import data" }, @@ -723,11 +723,11 @@ "@dialogDownload": { "description": "Confirm button in Download All dialog" }, - "dialogDiscard": "Discard", + "dialogDiscard": "Ignorer", "@dialogDiscard": { "description": "Dialog button - discard changes" }, - "dialogRemove": "Remove", + "dialogRemove": "Supprimer", "@dialogRemove": { "description": "Dialog button - remove item" }, @@ -739,27 +739,27 @@ "@dialogDiscardChanges": { "description": "Dialog title - unsaved changes warning" }, - "dialogUnsavedChanges": "You have unsaved changes. Do you want to discard them?", + "dialogUnsavedChanges": "Vous avez des modifications non enregistrées. Voulez-vous les ignorer ?", "@dialogUnsavedChanges": { "description": "Dialog message - unsaved changes" }, - "dialogClearAll": "Clear All", + "dialogClearAll": "Tout effacer", "@dialogClearAll": { "description": "Dialog title - clear all items" }, - "dialogRemoveExtension": "Remove Extension", + "dialogRemoveExtension": "Supprimer l'extension", "@dialogRemoveExtension": { "description": "Dialog title - uninstall extension" }, - "dialogRemoveExtensionMessage": "Are you sure you want to remove this extension? This cannot be undone.", + "dialogRemoveExtensionMessage": "Êtes-vous sûr de vouloir supprimer cette extension ? Cette action ne peut pas être annulée.", "@dialogRemoveExtensionMessage": { "description": "Dialog message - uninstall confirmation" }, - "dialogUninstallExtension": "Uninstall Extension?", + "dialogUninstallExtension": "Supprimer l'extension ?", "@dialogUninstallExtension": { "description": "Dialog title - uninstall extension" }, - "dialogUninstallExtensionMessage": "Are you sure you want to remove {extensionName}?", + "dialogUninstallExtensionMessage": "Êtes-vous sûr de vouloir supprimer {extensionName} ?", "@dialogUninstallExtensionMessage": { "description": "Dialog message - uninstall specific extension", "placeholders": { @@ -768,19 +768,19 @@ } } }, - "dialogClearHistoryTitle": "Clear History", + "dialogClearHistoryTitle": "Effacer l'historique", "@dialogClearHistoryTitle": { "description": "Dialog title - clear download history" }, - "dialogClearHistoryMessage": "Are you sure you want to clear all download history? This cannot be undone.", + "dialogClearHistoryMessage": "Êtes-vous sûr de vouloir effacer tout l'historique des téléchargements ? Cette action ne peut pas être annulée.", "@dialogClearHistoryMessage": { "description": "Dialog message - clear history confirmation" }, - "dialogDeleteSelectedTitle": "Delete Selected", + "dialogDeleteSelectedTitle": "Supprimer la sélection", "@dialogDeleteSelectedTitle": { "description": "Dialog title - delete selected items" }, - "dialogDeleteSelectedMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from history?\n\nThis will also delete the files from storage.", + "dialogDeleteSelectedMessage": "Supprimer {count} {count, plural, =1{titre} other{titres}} de l'historique ?\n\nCela supprimera également les fichiers du stockage.", "@dialogDeleteSelectedMessage": { "description": "Dialog message - delete selected tracks", "placeholders": { @@ -789,12 +789,12 @@ } } }, - "dialogImportPlaylistTitle": "Import Playlist", + "dialogImportPlaylistTitle": "Importer une playlist", "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Found {count} tracks in CSV. Add them to download queue?", - "csvImportTracks": "{count} tracks from CSV", + "dialogImportPlaylistMessage": "{count} pistes ont été trouvées dans le fichier CSV. Voulez-vous les ajouter à la file d'attente de téléchargement ?", + "csvImportTracks": "{count} pistes issues d'un fichier CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", "placeholders": { @@ -811,7 +811,7 @@ } } }, - "snackbarAddedToQueue": "Added \"{trackName}\" to queue", + "snackbarAddedToQueue": "Ajout de « {trackName} » à la file d'attente", "@snackbarAddedToQueue": { "description": "Snackbar - track added to download queue", "placeholders": { @@ -820,7 +820,7 @@ } } }, - "snackbarAddedTracksToQueue": "Added {count} tracks to queue", + "snackbarAddedTracksToQueue": "{count} titres ont été ajoutés à la file d'attente", "@snackbarAddedTracksToQueue": { "description": "Snackbar - multiple tracks added to queue", "placeholders": { @@ -829,7 +829,7 @@ } } }, - "snackbarAlreadyDownloaded": "\"{trackName}\" already downloaded", + "snackbarAlreadyDownloaded": "« {trackName} » a déjà été téléchargé", "@snackbarAlreadyDownloaded": { "description": "Snackbar - track already exists", "placeholders": { @@ -838,7 +838,7 @@ } } }, - "snackbarAlreadyInLibrary": "\"{trackName}\" already exists in your library", + "snackbarAlreadyInLibrary": "« {trackName} » existe déjà dans votre bibliothèque", "@snackbarAlreadyInLibrary": { "description": "Snackbar - track already exists in local library", "placeholders": { @@ -847,19 +847,19 @@ } } }, - "snackbarHistoryCleared": "History cleared", + "snackbarHistoryCleared": "Historique effacé", "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "Credentials saved", + "snackbarCredentialsSaved": "Identifiants enregistrés", "@snackbarCredentialsSaved": { "description": "Snackbar - Spotify credentials saved" }, - "snackbarCredentialsCleared": "Credentials cleared", + "snackbarCredentialsCleared": "Identifiants validés", "@snackbarCredentialsCleared": { "description": "Snackbar - Spotify credentials removed" }, - "snackbarDeletedTracks": "Deleted {count} {count, plural, =1{track} other{tracks}}", + "snackbarDeletedTracks": "Supprimé {count} {count, plural, =1{titre} other{titres}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", "placeholders": { @@ -868,7 +868,7 @@ } } }, - "snackbarCannotOpenFile": "Cannot open file: {error}", + "snackbarCannotOpenFile": "Impossible d'ouvrir le fichier : {error}", "@snackbarCannotOpenFile": { "description": "Snackbar - file open error", "placeholders": { @@ -877,15 +877,15 @@ } } }, - "snackbarFillAllFields": "Please fill all fields", + "snackbarFillAllFields": "Veuillez remplir tous les champs", "@snackbarFillAllFields": { "description": "Snackbar - validation error" }, - "snackbarViewQueue": "View Queue", + "snackbarViewQueue": "Afficher la file d'attente", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" }, - "snackbarUrlCopied": "{platform} URL copied to clipboard", + "snackbarUrlCopied": "L'URL de {platform} a été copiée dans le presse-papiers", "@snackbarUrlCopied": { "description": "Snackbar - URL copied", "placeholders": { @@ -895,23 +895,23 @@ } } }, - "snackbarFileNotFound": "File not found", + "snackbarFileNotFound": "Fichier introuvable", "@snackbarFileNotFound": { "description": "Snackbar - file doesn't exist" }, - "snackbarSelectExtFile": "Please select a .spotiflac-ext file", + "snackbarSelectExtFile": "Veuillez sélectionner un fichier .spotiflac-ext", "@snackbarSelectExtFile": { "description": "Snackbar - wrong file type selected" }, - "snackbarProviderPrioritySaved": "Provider priority saved", + "snackbarProviderPrioritySaved": "Priorité du fournisseur enregistrée", "@snackbarProviderPrioritySaved": { "description": "Snackbar - provider order saved" }, - "snackbarMetadataProviderSaved": "Metadata provider priority saved", + "snackbarMetadataProviderSaved": "Priorité du fournisseur de métadonnées enregistrée", "@snackbarMetadataProviderSaved": { "description": "Snackbar - metadata provider order saved" }, - "snackbarExtensionInstalled": "{extensionName} installed.", + "snackbarExtensionInstalled": "{extensionName} est installée.", "@snackbarExtensionInstalled": { "description": "Snackbar - extension installed successfully", "placeholders": { @@ -920,7 +920,7 @@ } } }, - "snackbarExtensionUpdated": "{extensionName} updated.", + "snackbarExtensionUpdated": "{extensionName} a été mis à jour.", "@snackbarExtensionUpdated": { "description": "Snackbar - extension updated successfully", "placeholders": { @@ -929,39 +929,39 @@ } } }, - "snackbarFailedToInstall": "Failed to install extension", + "snackbarFailedToInstall": "Échec de l'installation de l'extension", "@snackbarFailedToInstall": { "description": "Snackbar - extension install error" }, - "snackbarFailedToUpdate": "Failed to update extension", + "snackbarFailedToUpdate": "Échec de la mise à jour de l'extension", "@snackbarFailedToUpdate": { "description": "Snackbar - extension update error" }, - "errorRateLimited": "Rate Limited", + "errorRateLimited": "Débit limité", "@errorRateLimited": { "description": "Error title - too many requests" }, - "errorRateLimitedMessage": "Too many requests. Please wait a moment before searching again.", + "errorRateLimitedMessage": "Trop de requêtes. Veuillez patienter quelques instants avant de relancer la recherche.", "@errorRateLimitedMessage": { "description": "Error message - rate limit explanation" }, - "errorNoTracksFound": "No tracks found", + "errorNoTracksFound": "Aucun titre trouvé", "@errorNoTracksFound": { "description": "Error - search returned no results" }, - "errorUrlNotRecognized": "Link not recognized", + "errorUrlNotRecognized": "Lien non reconnu", "@errorUrlNotRecognized": { "description": "Error title - URL not handled by any extension or service" }, - "errorUrlNotRecognizedMessage": "This link is not supported. Make sure the URL is correct and a compatible extension is installed.", + "errorUrlNotRecognizedMessage": "Ce lien n'est pas pris en charge. Vérifiez que l'URL est correcte et qu'une extension compatible est installée.", "@errorUrlNotRecognizedMessage": { "description": "Error message - URL not recognized explanation" }, - "errorUrlFetchFailed": "Failed to load content from this link. Please try again.", + "errorUrlFetchFailed": "Impossible de charger le contenu de ce lien. Veuillez réessayer.", "@errorUrlFetchFailed": { "description": "Error message - generic URL fetch failure" }, - "errorMissingExtensionSource": "Cannot load {item}: missing extension source", + "errorMissingExtensionSource": "Impossible de charger {item} : source de l'extension manquante", "@errorMissingExtensionSource": { "description": "Error - extension source not available", "placeholders": { @@ -974,31 +974,31 @@ "@actionPause": { "description": "Action button - pause download" }, - "actionResume": "Resume", + "actionResume": "Resumer", "@actionResume": { "description": "Action button - resume download" }, - "actionCancel": "Cancel", + "actionCancel": "Annuler", "@actionCancel": { "description": "Action button - cancel operation" }, - "actionSelectAll": "Select All", + "actionSelectAll": "Tout sélectionner", "@actionSelectAll": { "description": "Action button - select all items" }, - "actionDeselect": "Deselect", + "actionDeselect": "Désélectionner", "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "Remove Credentials", + "actionRemoveCredentials": "Supprimer les identifiants", "@actionRemoveCredentials": { "description": "Action button - delete Spotify credentials" }, - "actionSaveCredentials": "Save Credentials", + "actionSaveCredentials": "Enregistrer les identifiants", "@actionSaveCredentials": { "description": "Action button - save Spotify credentials" }, - "selectionSelected": "{count} selected", + "selectionSelected": "{count} sélectionnés", "@selectionSelected": { "description": "Selection count indicator", "placeholders": { @@ -1007,15 +1007,15 @@ } } }, - "selectionAllSelected": "All tracks selected", + "selectionAllSelected": "Toutes les pistes sélectionnées", "@selectionAllSelected": { "description": "Status - all items selected" }, - "selectionSelectToDelete": "Select tracks to delete", + "selectionSelectToDelete": "Sélectionnez les titres à supprimer", "@selectionSelectToDelete": { "description": "Placeholder when nothing selected" }, - "progressFetchingMetadata": "Fetching metadata... {current}/{total}", + "progressFetchingMetadata": "Récupération des métadonnées... {current}/{total}", "@progressFetchingMetadata": { "description": "Progress indicator - loading track info", "placeholders": { @@ -1027,15 +1027,15 @@ } } }, - "progressReadingCsv": "Reading CSV...", + "progressReadingCsv": "Lecture du fichier CSV...", "@progressReadingCsv": { "description": "Progress indicator - parsing CSV file" }, - "searchSongs": "Songs", + "searchSongs": "Titres", "@searchSongs": { "description": "Search result category - songs" }, - "searchArtists": "Artists", + "searchArtists": "Artistes", "@searchArtists": { "description": "Search result category - artists" }, @@ -1047,179 +1047,179 @@ "@searchPlaylists": { "description": "Search result category - playlists" }, - "searchSortTitle": "Sort Results", + "searchSortTitle": "Trier les résultats", "@searchSortTitle": { "description": "Bottom sheet title for search sort options" }, - "searchSortDefault": "Default", + "searchSortDefault": "Par défaut", "@searchSortDefault": { "description": "Sort option - default API order" }, - "searchSortTitleAZ": "Title (A-Z)", + "searchSortTitleAZ": "Titre (A-Z)", "@searchSortTitleAZ": { "description": "Sort option - title ascending" }, - "searchSortTitleZA": "Title (Z-A)", + "searchSortTitleZA": "Titre (Z-A)", "@searchSortTitleZA": { "description": "Sort option - title descending" }, - "searchSortArtistAZ": "Artist (A-Z)", + "searchSortArtistAZ": "Artiste (A-Z)", "@searchSortArtistAZ": { "description": "Sort option - artist ascending" }, - "searchSortArtistZA": "Artist (Z-A)", + "searchSortArtistZA": "Artiste (Z-A)", "@searchSortArtistZA": { "description": "Sort option - artist descending" }, - "searchSortDurationShort": "Duration (Shortest)", + "searchSortDurationShort": "Durée (la plus courte)", "@searchSortDurationShort": { "description": "Sort option - shortest duration first" }, - "searchSortDurationLong": "Duration (Longest)", + "searchSortDurationLong": "Durée (la plus longue)", "@searchSortDurationLong": { "description": "Sort option - longest duration first" }, - "searchSortDateOldest": "Release Date (Oldest)", + "searchSortDateOldest": "Date de sortie (la plus ancienne)", "@searchSortDateOldest": { "description": "Sort option - oldest release first" }, - "searchSortDateNewest": "Release Date (Newest)", + "searchSortDateNewest": "Date de sortie (la plus récente)", "@searchSortDateNewest": { "description": "Sort option - newest release first" }, - "tooltipPlay": "Play", + "tooltipPlay": "Lecture", "@tooltipPlay": { "description": "Tooltip - play button" }, - "filenameFormat": "Filename Format", + "filenameFormat": "Format des noms de fichiers", "@filenameFormat": { "description": "Setting title - filename pattern" }, - "filenameShowAdvancedTags": "Show advanced tags", + "filenameShowAdvancedTags": "Afficher les balises avancées", "@filenameShowAdvancedTags": { "description": "Toggle label for showing advanced filename tags" }, - "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", + "filenameShowAdvancedTagsDescription": "Activer les balises de formatage pour le remplissage des pistes et les formats de date", "@filenameShowAdvancedTagsDescription": { "description": "Description for advanced filename tag toggle" }, - "folderOrganizationNone": "No organization", + "folderOrganizationNone": "Aucune organisation", "@folderOrganizationNone": { "description": "Folder option - flat structure" }, - "folderOrganizationByPlaylist": "By Playlist", + "folderOrganizationByPlaylist": "Par playlist", "@folderOrganizationByPlaylist": { "description": "Folder option - playlist folders" }, - "folderOrganizationByPlaylistSubtitle": "Separate folder for each playlist", + "folderOrganizationByPlaylistSubtitle": "Un dossier distinct pour chaque playlist", "@folderOrganizationByPlaylistSubtitle": { "description": "Subtitle for playlist folder option" }, - "folderOrganizationByArtist": "By Artist", + "folderOrganizationByArtist": "Par artiste", "@folderOrganizationByArtist": { "description": "Folder option - artist folders" }, - "folderOrganizationByAlbum": "By Album", + "folderOrganizationByAlbum": "Par album", "@folderOrganizationByAlbum": { "description": "Folder option - album folders" }, - "folderOrganizationByArtistAlbum": "Artist/Album", + "folderOrganizationByArtistAlbum": "Artiste/Album", "@folderOrganizationByArtistAlbum": { "description": "Folder option - nested folders" }, - "folderOrganizationDescription": "Organize downloaded files into folders", + "folderOrganizationDescription": "Classer les fichiers téléchargés dans des dossiers", "@folderOrganizationDescription": { "description": "Folder organization sheet description" }, - "folderOrganizationNoneSubtitle": "All files in download folder", + "folderOrganizationNoneSubtitle": "Tous les fichiers du dossier « Téléchargements »", "@folderOrganizationNoneSubtitle": { "description": "Subtitle for no organization option" }, - "folderOrganizationByArtistSubtitle": "Separate folder for each artist", + "folderOrganizationByArtistSubtitle": "Un dossier distinct pour chaque artiste", "@folderOrganizationByArtistSubtitle": { "description": "Subtitle for artist folder option" }, - "folderOrganizationByAlbumSubtitle": "Separate folder for each album", + "folderOrganizationByAlbumSubtitle": "Un dossier distinct pour chaque album", "@folderOrganizationByAlbumSubtitle": { "description": "Subtitle for album folder option" }, - "folderOrganizationByArtistAlbumSubtitle": "Nested folders for artist and album", + "folderOrganizationByArtistAlbumSubtitle": "Dossiers imbriqués pour les artistes et les albums", "@folderOrganizationByArtistAlbumSubtitle": { "description": "Subtitle for nested folder option" }, - "updateAvailable": "Update Available", + "updateAvailable": "Mise à jour disponible", "@updateAvailable": { "description": "Update dialog title" }, - "updateLater": "Later", + "updateLater": "Plus tard", "@updateLater": { "description": "Update button - dismiss" }, - "updateStartingDownload": "Starting download...", + "updateStartingDownload": "Début du téléchargement...", "@updateStartingDownload": { "description": "Update status - initializing" }, - "updateDownloadFailed": "Download failed", + "updateDownloadFailed": "Échec du téléchargement", "@updateDownloadFailed": { "description": "Update error title" }, - "updateFailedMessage": "Failed to download update", + "updateFailedMessage": "Échec du téléchargement de la mise à jour", "@updateFailedMessage": { "description": "Update error message" }, - "updateNewVersionReady": "A new version is ready", + "updateNewVersionReady": "Une nouvelle version est disponible", "@updateNewVersionReady": { "description": "Update subtitle" }, - "updateCurrent": "Current", + "updateCurrent": "Actuel", "@updateCurrent": { "description": "Label for current version" }, - "updateNew": "New", + "updateNew": "Nouveau", "@updateNew": { "description": "Label for new version" }, - "updateDownloading": "Downloading...", + "updateDownloading": "Téléchargement en cours...", "@updateDownloading": { "description": "Update status - downloading" }, - "updateWhatsNew": "What's New", + "updateWhatsNew": "Quoi de neuf ?", "@updateWhatsNew": { "description": "Changelog section title" }, - "updateDownloadInstall": "Download & Install", + "updateDownloadInstall": "Télécharger & Installer", "@updateDownloadInstall": { "description": "Update button - download and install" }, - "updateDontRemind": "Don't remind", + "updateDontRemind": "Ne plus me le rappeler", "@updateDontRemind": { "description": "Update button - skip this version" }, - "providerPriorityTitle": "Provider Priority", + "providerPriorityTitle": "Priorité accordée aux prestataires", "@providerPriorityTitle": { "description": "Provider priority page title" }, - "providerPriorityDescription": "Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.", + "providerPriorityDescription": "Faites glisser pour réorganiser les fournisseurs de téléchargement. L'application testera les fournisseurs dans l'ordre indiqué, de haut en bas, lors du téléchargement des morceaux.", "@providerPriorityDescription": { "description": "Provider priority page description" }, - "providerPriorityInfo": "If a track is not available on the first provider, the app will automatically try the next one.", + "providerPriorityInfo": "Si un morceau n'est pas disponible chez le premier fournisseur, l'application essaiera automatiquement le suivant.", "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Extension Fallback", + "providerPriorityFallbackExtensionsTitle": "Solution de secours pour les extensions", "@providerPriorityFallbackExtensionsTitle": { "description": "Section title for choosing which download extensions can be used as fallback providers" }, - "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", + "providerPriorityFallbackExtensionsDescription": "Sélectionnez les extensions de téléchargement installées qui peuvent être utilisées lors du basculement automatique.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" }, - "providerPriorityFallbackExtensionsHint": "Only enabled extensions with download-provider capability are listed here.", + "providerPriorityFallbackExtensionsHint": "Seules les extensions activées disposant de la fonctionnalité « fournisseur de téléchargement » sont répertoriées ici.", "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Built-in", + "providerBuiltIn": "Intégré", "@providerBuiltIn": { "description": "Label for built-in providers (Tidal/Qobuz)" }, @@ -1227,75 +1227,75 @@ "@providerExtension": { "description": "Label for extension-provided providers" }, - "metadataProviderPriorityTitle": "Metadata Priority", + "metadataProviderPriorityTitle": "Priorité des métadonnées", "@metadataProviderPriorityTitle": { "description": "Metadata priority page title" }, - "metadataProviderPriorityDescription": "Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.", + "metadataProviderPriorityDescription": "Faites glisser pour réorganiser les fournisseurs de métadonnées. L'application testera les fournisseurs dans l'ordre de haut en bas lors de la recherche de morceaux et de la récupération des métadonnées.", "@metadataProviderPriorityDescription": { "description": "Metadata priority page description" }, - "metadataProviderPriorityInfo": "Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.", + "metadataProviderPriorityInfo": "Deezer n'impose aucune limite de débit et est recommandé comme service principal. Spotify peut limiter le débit après un certain nombre de requêtes.", "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "No rate limits", + "metadataNoRateLimits": "Pas de limite de débit", "@metadataNoRateLimits": { "description": "Deezer provider description" }, - "metadataMayRateLimit": "May rate limit", + "metadataMayRateLimit": "Limite de taux de métadonnées", "@metadataMayRateLimit": { "description": "Spotify provider description" }, - "logTitle": "Logs", + "logTitle": "Journaux", "@logTitle": { "description": "Logs screen title" }, - "logCopied": "Logs copied to clipboard", + "logCopied": "Journaux copiés dans le presse-papiers", "@logCopied": { "description": "Snackbar - logs copied" }, - "logSearchHint": "Search logs...", + "logSearchHint": "Recherche dans les journaux...", "@logSearchHint": { "description": "Log search placeholder" }, - "logFilterLevel": "Level", + "logFilterLevel": "Niveau", "@logFilterLevel": { "description": "Filter by log level" }, - "logFilterSection": "Filter", + "logFilterSection": "Filtre", "@logFilterSection": { "description": "Filter section title" }, - "logShareLogs": "Share logs", + "logShareLogs": "Partager les journaux", "@logShareLogs": { "description": "Share button tooltip" }, - "logClearLogs": "Clear logs", + "logClearLogs": "Effacer les journaux", "@logClearLogs": { "description": "Clear button tooltip" }, - "logClearLogsTitle": "Clear Logs", + "logClearLogsTitle": "Effacer les journaux", "@logClearLogsTitle": { "description": "Clear logs dialog title" }, - "logClearLogsMessage": "Are you sure you want to clear all logs?", + "logClearLogsMessage": "Êtes-vous sûr de vouloir effacer tous les journaux ?", "@logClearLogsMessage": { "description": "Clear logs confirmation message" }, - "logFilterBySeverity": "Filter logs by severity", + "logFilterBySeverity": "Filtrer les journaux par niveau de gravité", "@logFilterBySeverity": { "description": "Filter dialog title" }, - "logNoLogsYet": "No logs yet", + "logNoLogsYet": "Pas encore de journal", "@logNoLogsYet": { "description": "Empty state title" }, - "logNoLogsYetSubtitle": "Logs will appear here as you use the app", + "logNoLogsYetSubtitle": "Les journaux s'afficheront ici au fur et à mesure que vous utiliserez l'application", "@logNoLogsYetSubtitle": { "description": "Empty state subtitle" }, - "logEntriesFiltered": "Entries ({count} filtered)", + "logEntriesFiltered": "Entrées ({count} résultats filtrés)", "@logEntriesFiltered": { "description": "Log count with filter active", "placeholders": { @@ -1304,7 +1304,7 @@ } } }, - "logEntries": "Entries ({count})", + "logEntries": "Entrées ({count})", "@logEntries": { "description": "Total log count", "placeholders": { @@ -1313,27 +1313,27 @@ } } }, - "credentialsTitle": "Spotify Credentials", + "credentialsTitle": "Identifiants Spotify", "@credentialsTitle": { "description": "Credentials dialog title" }, - "credentialsDescription": "Enter your Client ID and Secret to use your own Spotify application quota.", + "credentialsDescription": "Saisissez votre identifiant client et votre clé secrète pour utiliser votre propre quota d'application Spotify.", "@credentialsDescription": { "description": "Credentials dialog explanation" }, - "credentialsClientId": "Client ID", + "credentialsClientId": "Identifiant client", "@credentialsClientId": { "description": "Client ID field label - DO NOT TRANSLATE" }, - "credentialsClientIdHint": "Paste Client ID", + "credentialsClientIdHint": "Coller l'identifiant client", "@credentialsClientIdHint": { "description": "Client ID placeholder" }, - "credentialsClientSecret": "Client Secret", + "credentialsClientSecret": "Clé secrète du client", "@credentialsClientSecret": { "description": "Client Secret field label - DO NOT TRANSLATE" }, - "credentialsClientSecretHint": "Paste Client Secret", + "credentialsClientSecretHint": "Coller la clé secrète du client", "@credentialsClientSecretHint": { "description": "Client Secret placeholder" }, @@ -1341,31 +1341,31 @@ "@channelStable": { "description": "Update channel - stable releases" }, - "channelPreview": "Preview", + "channelPreview": "Aperçu", "@channelPreview": { "description": "Update channel - beta/preview releases" }, - "sectionSearchSource": "Search Source", + "sectionSearchSource": "Rechercher dans la source", "@sectionSearchSource": { "description": "Settings section header" }, - "sectionDownload": "Download", + "sectionDownload": "Télécharger", "@sectionDownload": { "description": "Settings section header" }, - "sectionPerformance": "Performance", + "sectionPerformance": "Performances", "@sectionPerformance": { "description": "Settings section header" }, - "sectionApp": "App", + "sectionApp": "Application", "@sectionApp": { "description": "Settings section header" }, - "sectionData": "Data", + "sectionData": "Données", "@sectionData": { "description": "Settings section header" }, - "sectionDebug": "Debug", + "sectionDebug": "Débogage", "@sectionDebug": { "description": "Settings section header" }, @@ -1373,99 +1373,99 @@ "@sectionService": { "description": "Settings section header" }, - "sectionAudioQuality": "Audio Quality", + "sectionAudioQuality": "Qualité audio", "@sectionAudioQuality": { "description": "Settings section header" }, - "sectionFileSettings": "File Settings", + "sectionFileSettings": "Paramètres du fichier", "@sectionFileSettings": { "description": "Settings section header" }, - "sectionLyrics": "Lyrics", + "sectionLyrics": "Paroles", "@sectionLyrics": { "description": "Settings section header" }, - "lyricsMode": "Lyrics Mode", + "lyricsMode": "Mode Paroles", "@lyricsMode": { "description": "Setting - how to save lyrics" }, - "lyricsModeDescription": "Choose how lyrics are saved with your downloads", + "lyricsModeDescription": "Choisissez comment les paroles sont enregistrées avec vos téléchargements", "@lyricsModeDescription": { "description": "Lyrics mode picker description" }, - "lyricsModeEmbed": "Embed in file", + "lyricsModeEmbed": "Intégrer dans un fichier", "@lyricsModeEmbed": { "description": "Lyrics mode option - embed in audio file" }, - "lyricsModeEmbedSubtitle": "Lyrics stored inside FLAC metadata", + "lyricsModeEmbedSubtitle": "Paroles enregistrées dans les métadonnées FLAC", "@lyricsModeEmbedSubtitle": { "description": "Subtitle for embed option" }, - "lyricsModeExternal": "External .lrc file", + "lyricsModeExternal": "Fichier .lrc externe", "@lyricsModeExternal": { "description": "Lyrics mode option - separate LRC file" }, - "lyricsModeExternalSubtitle": "Separate .lrc file for players like Samsung Music", + "lyricsModeExternalSubtitle": "Fichier .lrc distinct pour les lecteurs tels que Samsung Music", "@lyricsModeExternalSubtitle": { "description": "Subtitle for external option" }, - "lyricsModeBoth": "Both", + "lyricsModeBoth": "Les deux", "@lyricsModeBoth": { "description": "Lyrics mode option - embed and external" }, - "lyricsModeBothSubtitle": "Embed and save .lrc file", + "lyricsModeBothSubtitle": "Intégrer et enregistrer le fichier .lrc", "@lyricsModeBothSubtitle": { "description": "Subtitle for both option" }, - "sectionColor": "Color", + "sectionColor": "Couleur", "@sectionColor": { "description": "Settings section header" }, - "sectionTheme": "Theme", + "sectionTheme": "Thème", "@sectionTheme": { "description": "Settings section header" }, - "sectionLayout": "Layout", + "sectionLayout": "Mise en page", "@sectionLayout": { "description": "Settings section header" }, - "sectionLanguage": "Language", + "sectionLanguage": "Langue", "@sectionLanguage": { "description": "Settings section header for language" }, - "appearanceLanguage": "App Language", + "appearanceLanguage": "Langue de l'application", "@appearanceLanguage": { "description": "Language setting title" }, - "settingsAppearanceSubtitle": "Theme, colors, display", + "settingsAppearanceSubtitle": "Thème, couleurs, affichage", "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Service, quality, filename format", + "settingsDownloadSubtitle": "Service, qualité, solution de secours", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, lyrics, cover art, updates", + "settingsOptionsSubtitle": "Fichier de secours, métadonnées, paroles, pochette", "@settingsOptionsSubtitle": { "description": "Options settings description" }, - "settingsExtensionsSubtitle": "Manage download providers", + "settingsExtensionsSubtitle": "Gérez les fournisseurs de téléchargement", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" }, - "settingsLogsSubtitle": "View app logs for debugging", + "settingsLogsSubtitle": "Consulter les journaux de l'application pour le débogage", "@settingsLogsSubtitle": { "description": "Logs settings description" }, - "loadingSharedLink": "Loading shared link...", + "loadingSharedLink": "Chargement du lien partagé...", "@loadingSharedLink": { "description": "Status when opening shared URL" }, - "pressBackAgainToExit": "Press back again to exit", + "pressBackAgainToExit": "Appuyez de nouveau sur retour pour quitter", "@pressBackAgainToExit": { "description": "Exit confirmation message" }, - "downloadAllCount": "Download All ({count})", + "downloadAllCount": "Tout télécharger ({count})", "@downloadAllCount": { "description": "Download all button with count", "placeholders": { @@ -1474,7 +1474,7 @@ } } }, - "tracksCount": "{count, plural, =1{1 track} other{{count} tracks}}", + "tracksCount": "{count, plural, =1{1 titre} other{{count} titres}}", "@tracksCount": { "description": "Track count display", "placeholders": { @@ -1483,51 +1483,51 @@ } } }, - "trackCopyFilePath": "Copy file path", + "trackCopyFilePath": "Copier le chemin d'accès au fichier", "@trackCopyFilePath": { "description": "Action - copy file path" }, - "trackRemoveFromDevice": "Remove from device", + "trackRemoveFromDevice": "Supprimer de l'appareil", "@trackRemoveFromDevice": { "description": "Action - delete downloaded file" }, - "trackLoadLyrics": "Load Lyrics", + "trackLoadLyrics": "Charger les paroles", "@trackLoadLyrics": { "description": "Action - fetch lyrics" }, - "trackMetadata": "Metadata", + "trackMetadata": "Métadonnées", "@trackMetadata": { "description": "Tab title - track metadata" }, - "trackFileInfo": "File Info", + "trackFileInfo": "Informations sur le fichier", "@trackFileInfo": { "description": "Tab title - file information" }, - "trackLyrics": "Lyrics", + "trackLyrics": "Paroles", "@trackLyrics": { "description": "Tab title - lyrics" }, - "trackFileNotFound": "File not found", + "trackFileNotFound": "Fichier introuvable", "@trackFileNotFound": { "description": "Error - file doesn't exist" }, - "trackOpenInDeezer": "Open in Deezer", + "trackOpenInDeezer": "Ouvrir dans Deezer", "@trackOpenInDeezer": { "description": "Action - open track in Deezer app" }, - "trackOpenInSpotify": "Open in Spotify", + "trackOpenInSpotify": "Ouvrir dans Spotify", "@trackOpenInSpotify": { "description": "Action - open track in Spotify app" }, - "trackTrackName": "Track name", + "trackTrackName": "Nom de la piste", "@trackTrackName": { "description": "Metadata label - track title" }, - "trackArtist": "Artist", + "trackArtist": "Artiste", "@trackArtist": { "description": "Metadata label - artist name" }, - "trackAlbumArtist": "Album artist", + "trackAlbumArtist": "Artiste de l'album", "@trackAlbumArtist": { "description": "Metadata label - album artist" }, @@ -1535,23 +1535,23 @@ "@trackAlbum": { "description": "Metadata label - album name" }, - "trackTrackNumber": "Track number", + "trackTrackNumber": "Numéro de piste", "@trackTrackNumber": { "description": "Metadata label - track number" }, - "trackDiscNumber": "Disc number", + "trackDiscNumber": "Numéro de disque", "@trackDiscNumber": { "description": "Metadata label - disc number" }, - "trackDuration": "Duration", + "trackDuration": "Durée", "@trackDuration": { "description": "Metadata label - track length" }, - "trackAudioQuality": "Audio quality", + "trackAudioQuality": "Qualité audio", "@trackAudioQuality": { "description": "Metadata label - audio quality" }, - "trackReleaseDate": "Release date", + "trackReleaseDate": "Date de sortie", "@trackReleaseDate": { "description": "Metadata label - release date" }, @@ -1563,71 +1563,71 @@ "@trackLabel": { "description": "Metadata label - record label" }, - "trackCopyright": "Copyright", + "trackCopyright": "Droits d'auteur", "@trackCopyright": { "description": "Metadata label - copyright information" }, - "trackDownloaded": "Downloaded", + "trackDownloaded": "Téléchargé", "@trackDownloaded": { "description": "Metadata label - download date" }, - "trackCopyLyrics": "Copy lyrics", + "trackCopyLyrics": "Copier les paroles", "@trackCopyLyrics": { "description": "Action - copy lyrics to clipboard" }, - "trackLyricsNotAvailable": "Lyrics not available for this track", + "trackLyricsNotAvailable": "Les paroles de ce morceau ne sont pas disponibles", "@trackLyricsNotAvailable": { "description": "Message when lyrics not found" }, - "trackLyricsNotInFile": "No lyrics found in this file", + "trackLyricsNotInFile": "Aucune parole n'a été trouvée dans ce fichier", "@trackLyricsNotInFile": { "description": "Message when no embedded lyrics in audio file" }, - "trackFetchOnlineLyrics": "Fetch from Online", + "trackFetchOnlineLyrics": "Télécharger depuis Internet", "@trackFetchOnlineLyrics": { "description": "Action - fetch lyrics from online providers" }, - "trackLyricsTimeout": "Request timed out. Try again later.", + "trackLyricsTimeout": "La requête a expiré. Veuillez réessayer plus tard.", "@trackLyricsTimeout": { "description": "Message when lyrics request times out" }, - "trackLyricsLoadFailed": "Failed to load lyrics", + "trackLyricsLoadFailed": "Impossible de charger les paroles", "@trackLyricsLoadFailed": { "description": "Message when lyrics loading fails" }, - "trackEmbedLyrics": "Embed Lyrics", + "trackEmbedLyrics": "Intégrer les paroles", "@trackEmbedLyrics": { "description": "Action - embed lyrics into audio file" }, - "trackLyricsEmbedded": "Lyrics embedded successfully", + "trackLyricsEmbedded": "Les paroles ont été intégrées avec succès", "@trackLyricsEmbedded": { "description": "Snackbar - lyrics saved to file" }, - "trackInstrumental": "Instrumental track", + "trackInstrumental": "Morceau instrumental", "@trackInstrumental": { "description": "Message when track is instrumental (no lyrics)" }, - "trackCopiedToClipboard": "Copied to clipboard", + "trackCopiedToClipboard": "Copié dans le presse-papiers", "@trackCopiedToClipboard": { "description": "Snackbar - content copied" }, - "trackDeleteConfirmTitle": "Remove from device?", + "trackDeleteConfirmTitle": "Supprimer de l'appareil ?", "@trackDeleteConfirmTitle": { "description": "Delete confirmation title" }, - "trackDeleteConfirmMessage": "This will permanently delete the downloaded file and remove it from your history.", + "trackDeleteConfirmMessage": "Cela supprimera définitivement le fichier téléchargé et l'effacera de votre historique.", "@trackDeleteConfirmMessage": { "description": "Delete confirmation message" }, - "dateToday": "Today", + "dateToday": "Aujourd'hui", "@dateToday": { "description": "Relative date - today" }, - "dateYesterday": "Yesterday", + "dateYesterday": "Hier", "@dateYesterday": { "description": "Relative date - yesterday" }, - "dateDaysAgo": "{count} days ago", + "dateDaysAgo": "Il y a {count} jours", "@dateDaysAgo": { "description": "Relative date - days ago", "placeholders": { @@ -1636,7 +1636,7 @@ } } }, - "dateWeeksAgo": "{count} weeks ago", + "dateWeeksAgo": "Il y a {count} semaines", "@dateWeeksAgo": { "description": "Relative date - weeks ago", "placeholders": { @@ -1645,7 +1645,7 @@ } } }, - "dateMonthsAgo": "{count} months ago", + "dateMonthsAgo": "Il y a {count} mois", "@dateMonthsAgo": { "description": "Relative date - months ago", "placeholders": { @@ -1654,43 +1654,43 @@ } } }, - "storeFilterAll": "All", + "storeFilterAll": "Tout", "@storeFilterAll": { "description": "Store filter - all extensions" }, - "storeFilterMetadata": "Metadata", + "storeFilterMetadata": "Métadonnées", "@storeFilterMetadata": { "description": "Store filter - metadata providers" }, - "storeFilterDownload": "Download", + "storeFilterDownload": "Télécharger", "@storeFilterDownload": { "description": "Store filter - download providers" }, - "storeFilterUtility": "Utility", + "storeFilterUtility": "Utilitaire", "@storeFilterUtility": { "description": "Store filter - utility extensions" }, - "storeFilterLyrics": "Lyrics", + "storeFilterLyrics": "Paroles", "@storeFilterLyrics": { "description": "Store filter - lyrics providers" }, - "storeFilterIntegration": "Integration", + "storeFilterIntegration": "Intégration", "@storeFilterIntegration": { "description": "Store filter - integrations" }, - "storeClearFilters": "Clear filters", + "storeClearFilters": "Effacer les filtres", "@storeClearFilters": { "description": "Button to clear all filters" }, - "storeAddRepoTitle": "Add Extension Repository", + "storeAddRepoTitle": "Ajouter un dépôt d'extensions", "@storeAddRepoTitle": { "description": "Store setup screen - heading when no repo is configured" }, - "storeAddRepoDescription": "Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.", + "storeAddRepoDescription": "Saisissez l'URL d'un dépôt GitHub contenant un fichier registry.json pour parcourir et installer des extensions.", "@storeAddRepoDescription": { "description": "Store setup screen - explanatory text" }, - "storeRepoUrlLabel": "Repository URL", + "storeRepoUrlLabel": "URL du dépôt", "@storeRepoUrlLabel": { "description": "Label for the repository URL input field" }, @@ -1698,51 +1698,51 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "e.g. https://github.com/user/extensions-repo", + "storeRepoUrlHelper": "par exemple : https://github.com/user/extensions-repo", "@storeRepoUrlHelper": { "description": "Helper text below the repository URL input field" }, - "storeAddRepoButton": "Add Repository", + "storeAddRepoButton": "Ajouter un dépôt", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" }, - "storeChangeRepoTooltip": "Change repository", + "storeChangeRepoTooltip": "Changer de dépôt", "@storeChangeRepoTooltip": { "description": "Tooltip for the change-repository icon button in the app bar" }, - "storeRepoDialogTitle": "Extension Repository", + "storeRepoDialogTitle": "Répertoire des extensions", "@storeRepoDialogTitle": { "description": "Title of the change/remove repository dialog" }, - "storeRepoDialogCurrent": "Current repository:", + "storeRepoDialogCurrent": "Dépôt actuel :", "@storeRepoDialogCurrent": { "description": "Label shown above the current repository URL in the dialog" }, - "storeNewRepoUrlLabel": "New Repository URL", + "storeNewRepoUrlLabel": "Nouvelle URL du dépôt", "@storeNewRepoUrlLabel": { "description": "Label for the new repository URL field inside the dialog" }, - "storeLoadError": "Failed to load repository", + "storeLoadError": "Échec du chargement du dépôt", "@storeLoadError": { "description": "Error heading when the store cannot be loaded" }, - "storeEmptyNoExtensions": "No extensions available", + "storeEmptyNoExtensions": "Aucune extension disponible", "@storeEmptyNoExtensions": { "description": "Message when store has no extensions" }, - "storeEmptyNoResults": "No extensions found", + "storeEmptyNoResults": "Aucune extension trouvée", "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Default (Deezer)", + "extensionDefaultProvider": "Par défaut (Deezer)", "@extensionDefaultProvider": { "description": "Default search provider option" }, - "extensionDefaultProviderSubtitle": "Use built-in search", + "extensionDefaultProviderSubtitle": "Utiliser la fonction de recherche intégrée", "@extensionDefaultProviderSubtitle": { "description": "Subtitle for default provider" }, - "extensionAuthor": "Author", + "extensionAuthor": "Auteur", "@extensionAuthor": { "description": "Extension detail - author" }, @@ -1750,67 +1750,67 @@ "@extensionId": { "description": "Extension detail - unique ID" }, - "extensionError": "Error", + "extensionError": "Erreur", "@extensionError": { "description": "Extension detail - error message" }, - "extensionCapabilities": "Capabilities", + "extensionCapabilities": "Fonctionnalités", "@extensionCapabilities": { "description": "Section header - extension features" }, - "extensionMetadataProvider": "Metadata Provider", + "extensionMetadataProvider": "Fournisseur de métadonnées", "@extensionMetadataProvider": { "description": "Capability - provides metadata" }, - "extensionDownloadProvider": "Download Provider", + "extensionDownloadProvider": "Fournisseur de téléchargement", "@extensionDownloadProvider": { "description": "Capability - provides downloads" }, - "extensionLyricsProvider": "Lyrics Provider", + "extensionLyricsProvider": "Fournisseur de paroles", "@extensionLyricsProvider": { "description": "Capability - provides lyrics" }, - "extensionUrlHandler": "URL Handler", + "extensionUrlHandler": "Gestionnaire d'URL", "@extensionUrlHandler": { "description": "Capability - handles URLs" }, - "extensionQualityOptions": "Quality Options", + "extensionQualityOptions": "Options de qualité", "@extensionQualityOptions": { "description": "Capability - quality selection" }, - "extensionPostProcessingHooks": "Post-Processing Hooks", + "extensionPostProcessingHooks": "Crochets de post-traitement", "@extensionPostProcessingHooks": { "description": "Capability - post-processing" }, - "extensionPermissions": "Permissions", + "extensionPermissions": "Autorisations", "@extensionPermissions": { "description": "Section header - required permissions" }, - "extensionSettings": "Settings", + "extensionSettings": "Paramètres", "@extensionSettings": { "description": "Section header - extension settings" }, - "extensionRemoveButton": "Remove Extension", + "extensionRemoveButton": "Supprimer l'extension", "@extensionRemoveButton": { "description": "Button to uninstall extension" }, - "extensionUpdated": "Updated", + "extensionUpdated": "Mis à jour", "@extensionUpdated": { "description": "Extension detail - last update" }, - "extensionMinAppVersion": "Min App Version", + "extensionMinAppVersion": "Version minimale de l'application", "@extensionMinAppVersion": { "description": "Extension detail - minimum app version" }, - "extensionCustomTrackMatching": "Custom Track Matching", + "extensionCustomTrackMatching": "Correspondance personnalisée des pistes", "@extensionCustomTrackMatching": { "description": "Capability - custom track matching algorithm" }, - "extensionPostProcessing": "Post-Processing", + "extensionPostProcessing": "Post-traitement", "@extensionPostProcessing": { "description": "Capability - post-download processing" }, - "extensionHooksAvailable": "{count} hook(s) available", + "extensionHooksAvailable": "{count} crochet(s) disponibles", "@extensionHooksAvailable": { "description": "Post-processing hooks count", "placeholders": { @@ -1819,7 +1819,7 @@ } } }, - "extensionPatternsCount": "{count} pattern(s)", + "extensionPatternsCount": "{count} motif(s)", "@extensionPatternsCount": { "description": "URL patterns count", "placeholders": { @@ -1828,7 +1828,7 @@ } } }, - "extensionStrategy": "Strategy: {strategy}", + "extensionStrategy": "Stratégie : {strategy}", "@extensionStrategy": { "description": "Track matching strategy name", "placeholders": { @@ -1837,287 +1837,287 @@ } } }, - "extensionsProviderPrioritySection": "Provider Priority", + "extensionsProviderPrioritySection": "Priorité accordée aux prestataires", "@extensionsProviderPrioritySection": { "description": "Section header - provider priority" }, - "extensionsInstalledSection": "Installed Extensions", + "extensionsInstalledSection": "Extensions installées", "@extensionsInstalledSection": { "description": "Section header - installed extensions" }, - "extensionsNoExtensions": "No extensions installed", + "extensionsNoExtensions": "Aucune extension installée", "@extensionsNoExtensions": { "description": "Empty state - no extensions" }, - "extensionsNoExtensionsSubtitle": "Install .spotiflac-ext files to add new providers", + "extensionsNoExtensionsSubtitle": "Installez les fichiers .spotiflac-ext pour ajouter de nouveaux fournisseurs", "@extensionsNoExtensionsSubtitle": { "description": "Empty state subtitle" }, - "extensionsInstallButton": "Install Extension", + "extensionsInstallButton": "Installer l'extension", "@extensionsInstallButton": { "description": "Button to install extension from file" }, - "extensionsInfoTip": "Extensions can add new metadata and download providers. Only install extensions from trusted sources.", + "extensionsInfoTip": "Les extensions permettent d'ajouter de nouvelles métadonnées et de nouveaux fournisseurs de téléchargement. N'installez que des extensions provenant de sources fiables.", "@extensionsInfoTip": { "description": "Security warning about extensions" }, - "extensionsInstalledSuccess": "Extension installed successfully", + "extensionsInstalledSuccess": "L'extension a été installée avec succès", "@extensionsInstalledSuccess": { "description": "Success message after install" }, - "extensionsDownloadPriority": "Download Priority", + "extensionsDownloadPriority": "Priorité de téléchargement", "@extensionsDownloadPriority": { "description": "Setting - download provider order" }, - "extensionsDownloadPrioritySubtitle": "Set download service order", + "extensionsDownloadPrioritySubtitle": "Définissez l'ordre des services de téléchargement", "@extensionsDownloadPrioritySubtitle": { "description": "Subtitle for download priority" }, - "extensionsFallbackTitle": "Fallback Extensions", + "extensionsFallbackTitle": "Extensions de secours", "@extensionsFallbackTitle": { "description": "Setting and page title for choosing which download extensions can be used during fallback" }, - "extensionsFallbackSubtitle": "Choose which installed download extensions can be used as fallback", + "extensionsFallbackSubtitle": "Choisissez les extensions de téléchargement installées qui peuvent servir de solution de secours", "@extensionsFallbackSubtitle": { "description": "Subtitle for download fallback extensions menu" }, - "extensionsNoDownloadProvider": "No extensions with download provider", + "extensionsNoDownloadProvider": "Aucune extension avec le fournisseur de téléchargement", "@extensionsNoDownloadProvider": { "description": "Empty state - no download providers" }, - "extensionsMetadataPriority": "Metadata Priority", + "extensionsMetadataPriority": "Priorité des métadonnées", "@extensionsMetadataPriority": { "description": "Setting - metadata provider order" }, - "extensionsMetadataPrioritySubtitle": "Set search & metadata source order", + "extensionsMetadataPrioritySubtitle": "Définissez l'ordre des sources de recherche et de métadonnées", "@extensionsMetadataPrioritySubtitle": { "description": "Subtitle for metadata priority" }, - "extensionsNoMetadataProvider": "No extensions with metadata provider", + "extensionsNoMetadataProvider": "Aucune extension avec fournisseur de métadonnées", "@extensionsNoMetadataProvider": { "description": "Empty state - no metadata providers" }, - "extensionsSearchProvider": "Search Provider", + "extensionsSearchProvider": "Moteur de recherche", "@extensionsSearchProvider": { "description": "Setting - search provider selection" }, - "extensionsNoCustomSearch": "No extensions with custom search", + "extensionsNoCustomSearch": "Aucune extension avec recherche personnalisée", "@extensionsNoCustomSearch": { "description": "Empty state - no search providers" }, - "extensionsSearchProviderDescription": "Choose which service to use for searching tracks", + "extensionsSearchProviderDescription": "Choisissez le service que vous souhaitez utiliser pour rechercher des morceaux", "@extensionsSearchProviderDescription": { "description": "Search provider setting description" }, - "extensionsCustomSearch": "Custom search", + "extensionsCustomSearch": "Recherche personnalisée", "@extensionsCustomSearch": { "description": "Label for custom search provider" }, - "extensionsErrorLoading": "Error loading extension", + "extensionsErrorLoading": "Erreur lors du chargement de l'extension", "@extensionsErrorLoading": { "description": "Error message when extension fails to load" }, - "qualityFlacLossless": "FLAC Lossless", + "qualityFlacLossless": "FLAC sans perte", "@qualityFlacLossless": { "description": "Quality option - CD quality FLAC" }, - "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", + "qualityFlacLosslessSubtitle": "16 bits / 44,1 kHz", "@qualityFlacLosslessSubtitle": { "description": "Technical spec for lossless" }, - "qualityHiResFlac": "Hi-Res FLAC", + "qualityHiResFlac": "FLAC haute résolution", "@qualityHiResFlac": { "description": "Quality option - high resolution FLAC" }, - "qualityHiResFlacSubtitle": "24-bit / up to 96kHz", + "qualityHiResFlacSubtitle": "24 bits / jusqu'à 96 kHz", "@qualityHiResFlacSubtitle": { "description": "Technical spec for hi-res" }, - "qualityHiResFlacMax": "Hi-Res FLAC Max", + "qualityHiResFlacMax": "FLAC haute résolution Max", "@qualityHiResFlacMax": { "description": "Quality option - maximum resolution FLAC" }, - "qualityHiResFlacMaxSubtitle": "24-bit / up to 192kHz", + "qualityHiResFlacMaxSubtitle": "24 bits / jusqu'à 192 kHz", "@qualityHiResFlacMaxSubtitle": { "description": "Technical spec for hi-res max" }, - "downloadLossy320": "Lossy 320kbps", + "downloadLossy320": "Compression avec perte à 320 kbps", "@downloadLossy320": { "description": "Quality option label for Tidal lossy 320kbps" }, - "downloadLossyFormat": "Lossy Format", + "downloadLossyFormat": "Format avec perte", "@downloadLossyFormat": { "description": "Setting title to pick output format for Tidal lossy downloads" }, - "downloadLossy320Format": "Lossy 320kbps Format", + "downloadLossy320Format": "Format avec perte à 320 kbps", "@downloadLossy320Format": { "description": "Title of the Tidal lossy format picker bottom sheet" }, - "downloadLossy320FormatDesc": "Choose the output format for Tidal 320kbps lossy downloads. The original AAC stream will be converted to your selected format.", + "downloadLossy320FormatDesc": "Choisissez le format de sortie pour les téléchargements Tidal en 320 kbps avec perte. Le flux AAC d'origine sera converti au format que vous aurez sélectionné.", "@downloadLossy320FormatDesc": { "description": "Description in the Tidal lossy format picker" }, - "downloadLossyMp3": "MP3 320kbps", + "downloadLossyMp3": "MP3 320 kbps", "@downloadLossyMp3": { "description": "Tidal lossy format option - MP3 320kbps" }, - "downloadLossyMp3Subtitle": "Best compatibility, ~10MB per track", + "downloadLossyMp3Subtitle": "Compatibilité optimale, environ 10 Mo par piste", "@downloadLossyMp3Subtitle": { "description": "Subtitle for MP3 320kbps Tidal lossy option" }, - "downloadLossyOpus256": "Opus 256kbps", + "downloadLossyOpus256": "Opus 256 kbps", "@downloadLossyOpus256": { "description": "Tidal lossy format option - Opus 256kbps" }, - "downloadLossyOpus256Subtitle": "Best quality Opus, ~8MB per track", + "downloadLossyOpus256Subtitle": "Opus en qualité optimale, environ 8 Mo par piste", "@downloadLossyOpus256Subtitle": { "description": "Subtitle for Opus 256kbps Tidal lossy option" }, - "downloadLossyOpus128": "Opus 128kbps", + "downloadLossyOpus128": "Opus 128 kbps", "@downloadLossyOpus128": { "description": "Tidal lossy format option - Opus 128kbps" }, - "downloadLossyOpus128Subtitle": "Smallest size, ~4MB per track", + "downloadLossyOpus128Subtitle": "Taille minimale : environ 4 Mo par piste", "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps Tidal lossy option" }, - "qualityNote": "Actual quality depends on track availability from the service", + "qualityNote": "La qualité réelle dépend de la disponibilité des pistes sur le service", "@qualityNote": { "description": "Note about quality availability" }, - "downloadAskBeforeDownload": "Ask Before Download", + "downloadAskBeforeDownload": "Demander avant de télécharger", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" }, - "downloadDirectory": "Download Directory", + "downloadDirectory": "Répertoire de téléchargement", "@downloadDirectory": { "description": "Setting - download folder" }, - "downloadSeparateSinglesFolder": "Separate Singles Folder", + "downloadSeparateSinglesFolder": "Dossier dédié aux titres individuels", "@downloadSeparateSinglesFolder": { "description": "Setting - separate folder for singles" }, - "downloadAlbumFolderStructure": "Album Folder Structure", + "downloadAlbumFolderStructure": "Structure du dossier de l'album", "@downloadAlbumFolderStructure": { "description": "Setting - album folder organization" }, - "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", + "downloadUseAlbumArtistForFolders": "Utilisez l'artiste de l'album pour les dossiers", "@downloadUseAlbumArtistForFolders": { "description": "Setting - choose whether artist folders use Album Artist or Track Artist" }, - "downloadUsePrimaryArtistOnly": "Primary artist only for folders", + "downloadUsePrimaryArtistOnly": "Artiste principal uniquement pour les dossiers", "@downloadUsePrimaryArtistOnly": { "description": "Setting - strip featured artists from folder name" }, - "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", + "downloadUsePrimaryArtistOnlyEnabled": "Les noms des artistes mis en avant ont été supprimés du nom du dossier (par exemple : Justin Bieber, Quavo → Justin Bieber)", "@downloadUsePrimaryArtistOnlyEnabled": { "description": "Subtitle when primary artist only is enabled" }, - "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", + "downloadUsePrimaryArtistOnlyDisabled": "Nom complet de l'artiste utilisé pour le nom du dossier", "@downloadUsePrimaryArtistOnlyDisabled": { "description": "Subtitle when primary artist only is disabled" }, - "downloadSelectQuality": "Select Quality", + "downloadSelectQuality": "Sélectionner la qualité", "@downloadSelectQuality": { "description": "Dialog title - choose audio quality" }, - "downloadFrom": "Download From", + "downloadFrom": "Télécharger depuis", "@downloadFrom": { "description": "Label - download source" }, - "appearanceAmoledDark": "AMOLED Dark", + "appearanceAmoledDark": "Noir Amoled", "@appearanceAmoledDark": { "description": "Theme option - pure black" }, - "appearanceAmoledDarkSubtitle": "Pure black background", + "appearanceAmoledDarkSubtitle": "Fond noir pur", "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, - "queueClearAll": "Clear All", + "queueClearAll": "Tout effacer", "@queueClearAll": { "description": "Button - clear all queue items" }, - "queueClearAllMessage": "Are you sure you want to clear all downloads?", + "queueClearAllMessage": "Êtes-vous sûr de vouloir supprimer tous les fichiers téléchargés ?", "@queueClearAllMessage": { "description": "Clear queue confirmation" }, - "settingsAutoExportFailed": "Auto-export failed downloads", + "settingsAutoExportFailed": "Échec de l'exportation automatique des téléchargements", "@settingsAutoExportFailed": { "description": "Setting toggle for auto-export" }, - "settingsAutoExportFailedSubtitle": "Save failed downloads to TXT file automatically", + "settingsAutoExportFailedSubtitle": "Enregistrez automatiquement les téléchargements ayant échoué dans un fichier TXT", "@settingsAutoExportFailedSubtitle": { "description": "Subtitle for auto-export setting" }, - "settingsDownloadNetwork": "Download Network", + "settingsDownloadNetwork": "Réseau de téléchargement", "@settingsDownloadNetwork": { "description": "Setting for network type preference" }, - "settingsDownloadNetworkAny": "WiFi + Mobile Data", + "settingsDownloadNetworkAny": "Wi-Fi + données mobiles", "@settingsDownloadNetworkAny": { "description": "Network option - use any connection" }, - "settingsDownloadNetworkWifiOnly": "WiFi Only", + "settingsDownloadNetworkWifiOnly": "Wi-Fi uniquement", "@settingsDownloadNetworkWifiOnly": { "description": "Network option - only use WiFi" }, - "settingsDownloadNetworkSubtitle": "Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.", + "settingsDownloadNetworkSubtitle": "Choisissez le réseau à utiliser pour les téléchargements. Si vous sélectionnez « Wi-Fi uniquement », les téléchargements seront interrompus lorsque vous utilisez les données mobiles.", "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, - "albumFolderArtistAlbum": "Artist / Album", + "albumFolderArtistAlbum": "Artiste / Album", "@albumFolderArtistAlbum": { "description": "Album folder option" }, - "albumFolderArtistAlbumSubtitle": "Albums/Artist Name/Album Name/", + "albumFolderArtistAlbumSubtitle": "Albums/Nom de l'artiste/Titre de l'album/", "@albumFolderArtistAlbumSubtitle": { "description": "Folder structure example" }, - "albumFolderArtistYearAlbum": "Artist / [Year] Album", + "albumFolderArtistYearAlbum": "Artiste / [Année] Album", "@albumFolderArtistYearAlbum": { "description": "Album folder option with year" }, - "albumFolderArtistYearAlbumSubtitle": "Albums/Artist Name/[2005] Album Name/", + "albumFolderArtistYearAlbumSubtitle": "Albums/Nom de l'artiste/[2005] Nom de l'album/", "@albumFolderArtistYearAlbumSubtitle": { "description": "Folder structure example" }, - "albumFolderAlbumOnly": "Album Only", + "albumFolderAlbumOnly": "Album uniquement", "@albumFolderAlbumOnly": { "description": "Album folder option" }, - "albumFolderAlbumOnlySubtitle": "Albums/Album Name/", + "albumFolderAlbumOnlySubtitle": "Albums/Nom de l'album/", "@albumFolderAlbumOnlySubtitle": { "description": "Folder structure example" }, - "albumFolderYearAlbum": "[Year] Album", + "albumFolderYearAlbum": "[Année] Album", "@albumFolderYearAlbum": { "description": "Album folder option with year" }, - "albumFolderYearAlbumSubtitle": "Albums/[2005] Album Name/", + "albumFolderYearAlbumSubtitle": "Albums/[2005] Titre de l'album/", "@albumFolderYearAlbumSubtitle": { "description": "Folder structure example" }, - "albumFolderArtistAlbumSingles": "Artist / Album + Singles", + "albumFolderArtistAlbumSingles": "Artiste / Album + Singles", "@albumFolderArtistAlbumSingles": { "description": "Album folder option with singles inside artist" }, - "albumFolderArtistAlbumSinglesSubtitle": "Artist/Album/ and Artist/Singles/", + "albumFolderArtistAlbumSinglesSubtitle": "Artiste/Album/ et Artiste/Singles/", "@albumFolderArtistAlbumSinglesSubtitle": { "description": "Folder structure example" }, - "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", + "albumFolderArtistAlbumFlat": "Artiste / Album (singles)", "@albumFolderArtistAlbumFlat": { "description": "Album folder option with singles directly in artist folder" }, - "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", + "albumFolderArtistAlbumFlatSubtitle": "Artiste/Album/ et Artiste/titre.flac", "@albumFolderArtistAlbumFlatSubtitle": { "description": "Folder structure example for flat singles" }, - "downloadedAlbumDeleteSelected": "Delete Selected", + "downloadedAlbumDeleteSelected": "Supprimer la sélection", "@downloadedAlbumDeleteSelected": { "description": "Button - delete selected tracks" }, - "downloadedAlbumDeleteMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from this album?\n\nThis will also delete the files from storage.", + "downloadedAlbumDeleteMessage": "Souhaitez-vous supprimer {count} {count, plural, =1{piste} other {pistes}} de cet album ?\n\nCela supprimera également les fichiers de l'espace de stockage.", "@downloadedAlbumDeleteMessage": { "description": "Delete confirmation with count", "placeholders": { @@ -2126,7 +2126,7 @@ } } }, - "downloadedAlbumSelectedCount": "{count} selected", + "downloadedAlbumSelectedCount": "{count} sélectionnés", "@downloadedAlbumSelectedCount": { "description": "Selection count indicator", "placeholders": { @@ -2135,15 +2135,15 @@ } } }, - "downloadedAlbumAllSelected": "All tracks selected", + "downloadedAlbumAllSelected": "Tous les titres sélectionnés", "@downloadedAlbumAllSelected": { "description": "Status - all items selected" }, - "downloadedAlbumTapToSelect": "Tap tracks to select", + "downloadedAlbumTapToSelect": "Appuyez sur les titres pour les sélectionner", "@downloadedAlbumTapToSelect": { "description": "Selection hint" }, - "downloadedAlbumDeleteCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "downloadedAlbumDeleteCount": "Supprimer {count} {count, plural, =1{piste} other{pistes}}", "@downloadedAlbumDeleteCount": { "description": "Delete button text with count", "placeholders": { @@ -2152,11 +2152,11 @@ } } }, - "downloadedAlbumSelectToDelete": "Select tracks to delete", + "downloadedAlbumSelectToDelete": "Sélectionnez les pistes à supprimer", "@downloadedAlbumSelectToDelete": { "description": "Placeholder when nothing selected" }, - "downloadedAlbumDiscHeader": "Disc {discNumber}", + "downloadedAlbumDiscHeader": "Disque {discNumber}", "@downloadedAlbumDiscHeader": { "description": "Header for disc separator in multi-disc albums", "placeholders": { @@ -2166,7 +2166,7 @@ } } }, - "recentTypeArtist": "Artist", + "recentTypeArtist": "Artiste", "@recentTypeArtist": { "description": "Recent access item type - artist" }, @@ -2174,7 +2174,7 @@ "@recentTypeAlbum": { "description": "Recent access item type - album" }, - "recentTypeSong": "Song", + "recentTypeSong": "Titre", "@recentTypeSong": { "description": "Recent access item type - song/track" }, @@ -2182,15 +2182,15 @@ "@recentTypePlaylist": { "description": "Recent access item type - playlist" }, - "recentEmpty": "No recent items yet", + "recentEmpty": "Aucun élément récent pour le moment", "@recentEmpty": { "description": "Empty state text for recent access list" }, - "recentShowAllDownloads": "Show All Downloads", + "recentShowAllDownloads": "Afficher tous les téléchargements", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" }, - "recentPlaylistInfo": "Playlist: {name}", + "recentPlaylistInfo": "Playlist : {name}", "@recentPlaylistInfo": { "description": "Snackbar message when tapping playlist in recent access", "placeholders": { @@ -2200,15 +2200,15 @@ } } }, - "discographyDownload": "Download Discography", + "discographyDownload": "Télécharger la discographie", "@discographyDownload": { "description": "Button - download artist discography" }, - "discographyDownloadAll": "Download All", + "discographyDownloadAll": "Tout télécharger", "@discographyDownloadAll": { "description": "Option - download entire discography" }, - "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", + "discographyDownloadAllSubtitle": "{count} titres issus de {albumCount} albums", "@discographyDownloadAllSubtitle": { "description": "Subtitle showing total tracks and albums", "placeholders": { @@ -2220,11 +2220,11 @@ } } }, - "discographyAlbumsOnly": "Albums Only", + "discographyAlbumsOnly": "Albums uniquement", "@discographyAlbumsOnly": { "description": "Option - download only albums" }, - "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", + "discographyAlbumsOnlySubtitle": "{count} titres issus de {albumCount} albums", "@discographyAlbumsOnlySubtitle": { "description": "Subtitle showing album tracks count", "placeholders": { @@ -2236,11 +2236,11 @@ } } }, - "discographySinglesOnly": "Singles & EPs Only", + "discographySinglesOnly": "Uniquement les singles et les EP", "@discographySinglesOnly": { "description": "Option - download only singles" }, - "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", + "discographySinglesOnlySubtitle": "{count} titres issus de {albumCount} singles", "@discographySinglesOnlySubtitle": { "description": "Subtitle showing singles tracks count", "placeholders": { @@ -2252,19 +2252,19 @@ } } }, - "discographySelectAlbums": "Select Albums...", + "discographySelectAlbums": "Sélectionner des albums...", "@discographySelectAlbums": { "description": "Option - manually select albums to download" }, - "discographySelectAlbumsSubtitle": "Choose specific albums or singles", + "discographySelectAlbumsSubtitle": "Choisissez des albums ou des titres spécifiques", "@discographySelectAlbumsSubtitle": { "description": "Subtitle for select albums option" }, - "discographyFetchingTracks": "Fetching tracks...", + "discographyFetchingTracks": "Chargement des pistes...", "@discographyFetchingTracks": { "description": "Progress - fetching album tracks" }, - "discographyFetchingAlbum": "Fetching {current} of {total}...", + "discographyFetchingAlbum": "Récupération de {current} sur {total}...", "@discographyFetchingAlbum": { "description": "Progress - fetching specific album", "placeholders": { @@ -2276,7 +2276,7 @@ } } }, - "discographySelectedCount": "{count} selected", + "discographySelectedCount": "{count} sélectionnés", "@discographySelectedCount": { "description": "Selection count badge", "placeholders": { @@ -2285,11 +2285,11 @@ } } }, - "discographyDownloadSelected": "Download Selected", + "discographyDownloadSelected": "Télécharger la sélection", "@discographyDownloadSelected": { "description": "Button - download selected albums" }, - "discographyAddedToQueue": "Added {count} tracks to queue", + "discographyAddedToQueue": "{count} titres ont été ajoutés à la file d'attente", "@discographyAddedToQueue": { "description": "Snackbar - tracks added from discography", "placeholders": { @@ -2298,7 +2298,7 @@ } } }, - "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", + "discographySkippedDownloaded": "{added} ajouté, {skipped} déjà téléchargé", "@discographySkippedDownloaded": { "description": "Snackbar - with skipped tracks count", "placeholders": { @@ -2310,111 +2310,111 @@ } } }, - "discographyNoAlbums": "No albums available", + "discographyNoAlbums": "Aucun album disponible", "@discographyNoAlbums": { "description": "Error - no albums found for artist" }, - "discographyFailedToFetch": "Failed to fetch some albums", + "discographyFailedToFetch": "Impossible de récupérer certains albums", "@discographyFailedToFetch": { "description": "Error - some albums failed to load" }, - "sectionStorageAccess": "Storage Access", + "sectionStorageAccess": "Accès au stockage", "@sectionStorageAccess": { "description": "Section header for storage access settings" }, - "allFilesAccess": "All Files Access", + "allFilesAccess": "Accès à tous les fichiers", "@allFilesAccess": { "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" }, - "allFilesAccessEnabledSubtitle": "Can write to any folder", + "allFilesAccessEnabledSubtitle": "Peut écrire dans n'importe quel dossier", "@allFilesAccessEnabledSubtitle": { "description": "Subtitle when all files access is enabled" }, - "allFilesAccessDisabledSubtitle": "Limited to media folders only", + "allFilesAccessDisabledSubtitle": "Réservé aux dossiers multimédias uniquement", "@allFilesAccessDisabledSubtitle": { "description": "Subtitle when all files access is disabled" }, - "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", + "allFilesAccessDescription": "Activez cette option si vous rencontrez des erreurs d'écriture lors de l'enregistrement dans des dossiers personnalisés. À partir d'Android 13, l'accès à certains répertoires est restreint par défaut.", "@allFilesAccessDescription": { "description": "Description explaining when to enable all files access" }, - "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", + "allFilesAccessDeniedMessage": "L'autorisation a été refusée. Veuillez activer manuellement l'option « Accès à tous les fichiers » dans les paramètres système.", "@allFilesAccessDeniedMessage": { "description": "Message when permission is permanently denied" }, - "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", + "allFilesAccessDisabledMessage": "L'accès à tous les fichiers est désactivé. L'application disposera d'un accès limité au stockage.", "@allFilesAccessDisabledMessage": { "description": "Snackbar message when user disables all files access" }, - "settingsLocalLibrary": "Local Library", + "settingsLocalLibrary": "Bibliothèque locale", "@settingsLocalLibrary": { "description": "Settings menu item - local library" }, - "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", + "settingsLocalLibrarySubtitle": "Analysez la musique et détectez les doublons", "@settingsLocalLibrarySubtitle": { "description": "Subtitle for local library settings" }, - "settingsCache": "Storage & Cache", + "settingsCache": "Stockage & Cache", "@settingsCache": { "description": "Settings menu item - cache management" }, - "settingsCacheSubtitle": "View size and clear cached data", + "settingsCacheSubtitle": "Afficher la taille et vider le cache", "@settingsCacheSubtitle": { "description": "Subtitle for cache management menu" }, - "libraryTitle": "Local Library", + "libraryTitle": "Bibliothèque locale", "@libraryTitle": { "description": "Library settings page title" }, - "libraryScanSettings": "Scan Settings", + "libraryScanSettings": "Paramètres de numérisation", "@libraryScanSettings": { "description": "Section header for scan settings" }, - "libraryEnableLocalLibrary": "Enable Local Library", + "libraryEnableLocalLibrary": "Activer la bibliothèque locale", "@libraryEnableLocalLibrary": { "description": "Toggle to enable library scanning" }, - "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", + "libraryEnableLocalLibrarySubtitle": "Analysez et gérez votre bibliothèque musicale", "@libraryEnableLocalLibrarySubtitle": { "description": "Subtitle for enable toggle" }, - "libraryFolder": "Library Folder", + "libraryFolder": "Dossier de bibliothèque", "@libraryFolder": { "description": "Folder selection setting" }, - "libraryFolderHint": "Tap to select folder", + "libraryFolderHint": "Appuyez pour sélectionner un dossier", "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, - "libraryShowDuplicateIndicator": "Show Duplicate Indicator", + "libraryShowDuplicateIndicator": "Afficher l'indicateur de doublons", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" }, - "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", + "libraryShowDuplicateIndicatorSubtitle": "Afficher lors de la recherche de pistes existantes", "@libraryShowDuplicateIndicatorSubtitle": { "description": "Subtitle for duplicate indicator toggle" }, - "libraryAutoScan": "Auto Scan", + "libraryAutoScan": "Analyse automatique", "@libraryAutoScan": { "description": "Setting for automatic library scanning" }, - "libraryAutoScanSubtitle": "Automatically scan your library for new files", + "libraryAutoScanSubtitle": "Analysez automatiquement votre bibliothèque à la recherche de nouveaux fichiers", "@libraryAutoScanSubtitle": { "description": "Subtitle for auto scan setting" }, - "libraryAutoScanOff": "Off", + "libraryAutoScanOff": "Désactivée", "@libraryAutoScanOff": { "description": "Auto scan disabled" }, - "libraryAutoScanOnOpen": "Every app open", + "libraryAutoScanOnOpen": "À chaque ouverture de l'application", "@libraryAutoScanOnOpen": { "description": "Auto scan when app opens" }, - "libraryAutoScanDaily": "Daily", + "libraryAutoScanDaily": "Tous les jours", "@libraryAutoScanDaily": { "description": "Auto scan once per day" }, - "libraryAutoScanWeekly": "Weekly", + "libraryAutoScanWeekly": "Hebdomadaire", "@libraryAutoScanWeekly": { "description": "Auto scan once per week" }, @@ -2422,51 +2422,51 @@ "@libraryActions": { "description": "Section header for library actions" }, - "libraryScan": "Scan Library", + "libraryScan": "Analyse de la bibliothèque", "@libraryScan": { "description": "Button to start library scan" }, - "libraryScanSubtitle": "Scan for audio files", + "libraryScanSubtitle": "Recherchez des fichiers audio", "@libraryScanSubtitle": { "description": "Subtitle for scan button" }, - "libraryScanSelectFolderFirst": "Select a folder first", + "libraryScanSelectFolderFirst": "Sélectionnez d'abord un dossier", "@libraryScanSelectFolderFirst": { "description": "Message when trying to scan without folder" }, - "libraryCleanupMissingFiles": "Cleanup Missing Files", + "libraryCleanupMissingFiles": "Nettoyage des fichiers manquants", "@libraryCleanupMissingFiles": { "description": "Button to remove entries for missing files" }, - "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", + "libraryCleanupMissingFilesSubtitle": "Supprimez les entrées correspondant aux fichiers qui n'existent plus", "@libraryCleanupMissingFilesSubtitle": { "description": "Subtitle for cleanup button" }, - "libraryClear": "Clear Library", + "libraryClear": "Vider la bibliothèque", "@libraryClear": { "description": "Button to clear all library entries" }, - "libraryClearSubtitle": "Remove all scanned tracks", + "libraryClearSubtitle": "Supprimez tous les titres numérisés", "@libraryClearSubtitle": { "description": "Subtitle for clear button" }, - "libraryClearConfirmTitle": "Clear Library", + "libraryClearConfirmTitle": "Vider la bibliothèque", "@libraryClearConfirmTitle": { "description": "Dialog title for clear confirmation" }, - "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", + "libraryClearConfirmMessage": "Cette opération supprimera toutes les pistes numérisées de votre bibliothèque. Vos fichiers musicaux ne seront pas supprimés.", "@libraryClearConfirmMessage": { "description": "Dialog message for clear confirmation" }, - "libraryAbout": "About Local Library", + "libraryAbout": "À propos de la bibliothèque locale", "@libraryAbout": { "description": "Section header for about info" }, - "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", + "libraryAboutDescription": "Analyse votre bibliothèque musicale existante pour détecter les doublons lors du téléchargement. Prend en charge les formats FLAC, M4A, MP3, Opus et OGG. Les métadonnées sont extraites des balises des fichiers lorsqu'elles sont disponibles.", "@libraryAboutDescription": { "description": "Description of local library feature" }, - "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", + "libraryTracksUnit": "{count, plural, =1{piste} other{pistes}}", "@libraryTracksUnit": { "description": "Unit label for tracks count (without the number itself)", "placeholders": { @@ -2475,7 +2475,7 @@ } } }, - "libraryFilesUnit": "{count, plural, =1{file} other{files}}", + "libraryFilesUnit": "{count, plural, one {}=1{fichier} other{fichiers}}", "@libraryFilesUnit": { "description": "Unit label for files count during library scanning", "placeholders": { @@ -2484,7 +2484,7 @@ } } }, - "libraryLastScanned": "Last scanned: {time}", + "libraryLastScanned": "Dernière analyse : {time}", "@libraryLastScanned": { "description": "Last scan time display", "placeholders": { @@ -2493,19 +2493,19 @@ } } }, - "libraryLastScannedNever": "Never", + "libraryLastScannedNever": "Jamais", "@libraryLastScannedNever": { "description": "Shown when library has never been scanned" }, - "libraryScanning": "Scanning...", + "libraryScanning": "En cours d'analyse...", "@libraryScanning": { "description": "Status during scan" }, - "libraryScanFinalizing": "Finalizing library...", + "libraryScanFinalizing": "Finalisation de la bibliothèque...", "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, - "libraryScanProgress": "{progress}% of {total} files", + "libraryScanProgress": "{progress} % des {total} fichiers", "@libraryScanProgress": { "description": "Scan progress display", "placeholders": { @@ -2517,11 +2517,11 @@ } } }, - "libraryInLibrary": "In Library", + "libraryInLibrary": "Dans la bibliothèque", "@libraryInLibrary": { "description": "Badge shown on tracks that exist in local library" }, - "libraryRemovedMissingFiles": "Removed {count} missing files from library", + "libraryRemovedMissingFiles": "{count} fichiers manquants ont été supprimés de la bibliothèque", "@libraryRemovedMissingFiles": { "description": "Snackbar after cleanup", "placeholders": { @@ -2530,51 +2530,51 @@ } } }, - "libraryCleared": "Library cleared", + "libraryCleared": "Bibliothèque vidée", "@libraryCleared": { "description": "Snackbar after clearing library" }, - "libraryStorageAccessRequired": "Storage Access Required", + "libraryStorageAccessRequired": "Accès au stockage requis", "@libraryStorageAccessRequired": { "description": "Dialog title for storage permission" }, - "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", + "libraryStorageAccessMessage": "SpotiFLAC a besoin d'un accès au stockage pour analyser votre bibliothèque musicale. Veuillez lui accorder l'autorisation dans les paramètres.", "@libraryStorageAccessMessage": { "description": "Dialog message for storage permission" }, - "libraryFolderNotExist": "Selected folder does not exist", + "libraryFolderNotExist": "Le dossier sélectionné n'existe pas", "@libraryFolderNotExist": { "description": "Error when folder doesn't exist" }, - "librarySourceDownloaded": "Downloaded", + "librarySourceDownloaded": "Téléchargé", "@librarySourceDownloaded": { "description": "Badge for tracks downloaded via SpotiFLAC" }, - "librarySourceLocal": "Local", + "librarySourceLocal": "Locale", "@librarySourceLocal": { "description": "Badge for tracks from local library scan" }, - "libraryFilterAll": "All", + "libraryFilterAll": "Tout", "@libraryFilterAll": { "description": "Filter chip - show all library items" }, - "libraryFilterDownloaded": "Downloaded", + "libraryFilterDownloaded": "Téléchargé", "@libraryFilterDownloaded": { "description": "Filter chip - show only downloaded items" }, - "libraryFilterLocal": "Local", + "libraryFilterLocal": "Locale", "@libraryFilterLocal": { "description": "Filter chip - show only local library items" }, - "libraryFilterTitle": "Filters", + "libraryFilterTitle": "Filtres", "@libraryFilterTitle": { "description": "Filter bottom sheet title" }, - "libraryFilterReset": "Reset", + "libraryFilterReset": "Réinitialiser", "@libraryFilterReset": { "description": "Reset all filters button" }, - "libraryFilterApply": "Apply", + "libraryFilterApply": "Appliquer", "@libraryFilterApply": { "description": "Apply filters button" }, @@ -2582,19 +2582,19 @@ "@libraryFilterSource": { "description": "Filter section - source type" }, - "libraryFilterQuality": "Quality", + "libraryFilterQuality": "Qualité", "@libraryFilterQuality": { "description": "Filter section - audio quality" }, - "libraryFilterQualityHiRes": "Hi-Res (24bit)", + "libraryFilterQualityHiRes": "Haute résolution (24 bits)", "@libraryFilterQualityHiRes": { "description": "Filter option - high resolution audio" }, - "libraryFilterQualityCD": "CD (16bit)", + "libraryFilterQualityCD": "CD (16 bits)", "@libraryFilterQualityCD": { "description": "Filter option - CD quality audio" }, - "libraryFilterQualityLossy": "Lossy", + "libraryFilterQualityLossy": "Avec perte", "@libraryFilterQualityLossy": { "description": "Filter option - lossy compressed audio" }, @@ -2602,39 +2602,39 @@ "@libraryFilterFormat": { "description": "Filter section - file format" }, - "libraryFilterMetadata": "Metadata", + "libraryFilterMetadata": "Métadonnées", "@libraryFilterMetadata": { "description": "Filter section - metadata completeness" }, - "libraryFilterMetadataComplete": "Complete metadata", + "libraryFilterMetadataComplete": "Métadonnées complètes", "@libraryFilterMetadataComplete": { "description": "Filter option - items with complete metadata" }, - "libraryFilterMetadataMissingAny": "Missing any metadata", + "libraryFilterMetadataMissingAny": "Métadonnées manquantes", "@libraryFilterMetadataMissingAny": { "description": "Filter option - items missing any tracked metadata field" }, - "libraryFilterMetadataMissingYear": "Missing year", + "libraryFilterMetadataMissingYear": "Année manquante", "@libraryFilterMetadataMissingYear": { "description": "Filter option - items missing release year/date" }, - "libraryFilterMetadataMissingGenre": "Missing genre", + "libraryFilterMetadataMissingGenre": "Genre manquant", "@libraryFilterMetadataMissingGenre": { "description": "Filter option - items missing genre" }, - "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", + "libraryFilterMetadataMissingAlbumArtist": "Artiste d'album manquant", "@libraryFilterMetadataMissingAlbumArtist": { "description": "Filter option - items missing album artist" }, - "libraryFilterSort": "Sort", + "libraryFilterSort": "Trier", "@libraryFilterSort": { "description": "Filter section - sort order" }, - "libraryFilterSortLatest": "Latest", + "libraryFilterSortLatest": "Le plus récent", "@libraryFilterSortLatest": { "description": "Sort option - newest first" }, - "libraryFilterSortOldest": "Oldest", + "libraryFilterSortOldest": "Le plus ancien", "@libraryFilterSortOldest": { "description": "Sort option - oldest first" }, @@ -2654,11 +2654,11 @@ "@libraryFilterSortGenreDesc": { "description": "Sort option - genre descending" }, - "timeJustNow": "Just now", + "timeJustNow": "Il y a quelques instants", "@timeJustNow": { "description": "Relative time - less than a minute ago" }, - "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", + "timeMinutesAgo": "{count, plural, =1{il y a 1 minute} other{il y a {count} minutes}}", "@timeMinutesAgo": { "description": "Relative time - minutes ago", "placeholders": { @@ -2667,7 +2667,7 @@ } } }, - "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", + "timeHoursAgo": "{count, plural, =1{il y a 1 heure} other{il y a {count} heures}}", "@timeHoursAgo": { "description": "Relative time - hours ago", "placeholders": { @@ -2676,59 +2676,59 @@ } } }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC!", + "tutorialWelcomeTitle": "Bienvenue sur SpotiFLAC !", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "tutorialWelcomeDesc": "Apprenons comment télécharger votre musique préférée en qualité sans perte. Ce petit tutoriel vous présentera les bases.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Download music from Spotify, Deezer, or paste any supported URL", + "tutorialWelcomeTip1": "Téléchargez de la musique depuis Spotify ou Deezer, ou collez n'importe quelle URL prise en charge", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from Tidal, Qobuz, or Deezer", + "tutorialWelcomeTip2": "Profitez d'un son de qualité FLAC sur Tidal, Qobuz ou Deezer", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "tutorialWelcomeTip3": "Intégration automatique des métadonnées, des pochettes d'album et des paroles", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, - "tutorialSearchTitle": "Finding Music", + "tutorialSearchTitle": "Trouver de la musique", "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "tutorialSearchDesc": "Il existe deux façons simples de trouver la musique que vous souhaitez télécharger.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, - "tutorialDownloadTitle": "Downloading Music", + "tutorialDownloadTitle": "Télécharger de la musique", "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "tutorialDownloadDesc": "Télécharger de la musique, c'est simple et rapide. Voici comment ça marche.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, - "tutorialLibraryTitle": "Your Library", + "tutorialLibraryTitle": "Votre bibliothèque", "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "tutorialLibraryDesc": "Toute votre musique téléchargée est classée dans l'onglet « Bibliothèque ».", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "tutorialLibraryTip1": "Afficher la progression du téléchargement et la file d'attente dans l'onglet « Bibliothèque »", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", + "tutorialLibraryTip2": "Appuyez sur n'importe quel morceau pour l'écouter avec votre lecteur de musique", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "tutorialLibraryTip3": "Passez de l'affichage sous forme de liste à celui sous forme de grille pour faciliter la navigation", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2736,63 +2736,63 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "tutorialExtensionsDesc": "Élargissez les fonctionnalités de l'application grâce aux extensions de la communauté.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, - "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", + "tutorialExtensionsTip1": "Consultez l'onglet « Dépôt » pour découvrir des extensions utiles", "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Add new download providers or search sources", + "tutorialExtensionsTip2": "Ajouter de nouveaux fournisseurs de téléchargement ou de nouvelles sources de recherche", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "tutorialExtensionsTip3": "Accédez aux paroles, à des métadonnées enrichies et à bien d'autres fonctionnalités", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, - "tutorialSettingsTitle": "Customize Your Experience", + "tutorialSettingsTitle": "Personnalisez votre expérience", "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "tutorialSettingsDesc": "Personnalisez l'application dans les Paramètres en fonction de vos préférences.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, - "tutorialSettingsTip1": "Change download location and folder organization", + "tutorialSettingsTip1": "Modifier l'emplacement de téléchargement et l'organisation des dossiers", "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", + "tutorialSettingsTip2": "Définir les préférences par défaut en matière de qualité et de format audio", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, - "tutorialSettingsTip3": "Customize app theme and appearance", + "tutorialSettingsTip3": "Personnaliser le thème et l'apparence de l'application", "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "tutorialReadyMessage": "C'est parti ! Commencez dès maintenant à télécharger votre musique préférée.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, - "libraryForceFullScan": "Force Full Scan", + "libraryForceFullScan": "Lancer une analyse complète", "@libraryForceFullScan": { "description": "Button to force a complete rescan of library" }, - "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", + "libraryForceFullScanSubtitle": "Réanalysez tous les fichiers en ignorant le cache", "@libraryForceFullScanSubtitle": { "description": "Subtitle for force full scan button" }, - "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", + "cleanupOrphanedDownloads": "Nettoyage des téléchargements orphelins", "@cleanupOrphanedDownloads": { "description": "Button to remove history entries for deleted files" }, - "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", + "cleanupOrphanedDownloadsSubtitle": "Supprimez les entrées de l'historique correspondant aux fichiers qui n'existent plus", "@cleanupOrphanedDownloadsSubtitle": { "description": "Subtitle for orphaned cleanup button" }, - "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", + "cleanupOrphanedDownloadsResult": "{count} entrées orphelines ont été supprimées de l'historique", "@cleanupOrphanedDownloadsResult": { "description": "Snackbar after orphan cleanup", "placeholders": { @@ -2801,23 +2801,23 @@ } } }, - "cleanupOrphanedDownloadsNone": "No orphaned entries found", + "cleanupOrphanedDownloadsNone": "Aucune entrée orpheline n'a été trouvée", "@cleanupOrphanedDownloadsNone": { "description": "Snackbar when no orphans found" }, - "cacheTitle": "Storage & Cache", + "cacheTitle": "Stockage & Cache", "@cacheTitle": { "description": "Cache management page title" }, - "cacheSummaryTitle": "Cache overview", + "cacheSummaryTitle": "Présentation du cache", "@cacheSummaryTitle": { "description": "Heading for cache summary card" }, - "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", + "cacheSummarySubtitle": "La suppression du cache n'entraînera pas la suppression des fichiers musicaux téléchargés.", "@cacheSummarySubtitle": { "description": "Helper text for cache summary card" }, - "cacheEstimatedTotal": "Estimated cache usage: {size}", + "cacheEstimatedTotal": "Utilisation estimée du cache : {size}", "@cacheEstimatedTotal": { "description": "Total cache size shown in summary", "placeholders": { @@ -2826,71 +2826,71 @@ } } }, - "cacheSectionStorage": "Cached Data", + "cacheSectionStorage": "Données mises en cache", "@cacheSectionStorage": { "description": "Section header for cache entries" }, - "cacheSectionMaintenance": "Maintenance", + "cacheSectionMaintenance": "Entretien", "@cacheSectionMaintenance": { "description": "Section header for cleanup actions" }, - "cacheAppDirectory": "App cache directory", + "cacheAppDirectory": "Répertoire de cache de l'application", "@cacheAppDirectory": { "description": "Cache item title for app cache directory" }, - "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", + "cacheAppDirectoryDesc": "Réponses HTTP, données WebView et autres données temporaires de l'application.", "@cacheAppDirectoryDesc": { "description": "Description of what app cache directory contains" }, - "cacheTempDirectory": "Temporary directory", + "cacheTempDirectory": "Répertoire temporaire", "@cacheTempDirectory": { "description": "Cache item title for temporary files directory" }, - "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", + "cacheTempDirectoryDesc": "Fichiers temporaires liés aux téléchargements et à la conversion audio.", "@cacheTempDirectoryDesc": { "description": "Description of what temporary directory contains" }, - "cacheCoverImage": "Cover image cache", + "cacheCoverImage": "Cache des images de couverture", "@cacheCoverImage": { "description": "Cache item title for persistent cover images" }, - "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", + "cacheCoverImageDesc": "J'ai téléchargé les pochettes de l'album et des titres. Je les téléchargerai à nouveau lors de leur consultation.", "@cacheCoverImageDesc": { "description": "Description of what cover image cache contains" }, - "cacheLibraryCover": "Library cover cache", + "cacheLibraryCover": "Cache de couverture de bibliothèque", "@cacheLibraryCover": { "description": "Cache item title for local library cover art images" }, - "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", + "cacheLibraryCoverDesc": "Pochettes extraites des fichiers musicaux locaux. Elles seront extraites à nouveau lors de la prochaine analyse.", "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, - "cacheExploreFeed": "Explore feed cache", + "cacheExploreFeed": "Explorer le cache des flux", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" }, - "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", + "cacheExploreFeedDesc": "Contenu de l'onglet « Explorer » (nouvelles sorties, tendances). Se mettra à jour lors de votre prochaine visite.", "@cacheExploreFeedDesc": { "description": "Description of what explore feed cache contains" }, - "cacheTrackLookup": "Track lookup cache", + "cacheTrackLookup": "Cache de recherche de piste", "@cacheTrackLookup": { "description": "Cache item title for track ID lookup cache" }, - "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", + "cacheTrackLookupDesc": "Recherche d'identifiant de titre sur Spotify/Deezer. La suppression des données peut ralentir les prochaines recherches.", "@cacheTrackLookupDesc": { "description": "Description of what track lookup cache contains" }, - "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", + "cacheCleanupUnusedDesc": "Supprimer les entrées orphelines de l'historique des téléchargements et de la bibliothèque pour les fichiers manquants.", "@cacheCleanupUnusedDesc": { "description": "Description of what cleanup unused data does" }, - "cacheNoData": "No cached data", + "cacheNoData": "Aucune donnée mise en cache", "@cacheNoData": { "description": "Label when cache category has no data" }, - "cacheSizeWithFiles": "{size} in {count} files", + "cacheSizeWithFiles": "{size} dans {count} fichiers", "@cacheSizeWithFiles": { "description": "Cache size and file count", "placeholders": { @@ -2911,7 +2911,7 @@ } } }, - "cacheEntries": "{count} entries", + "cacheEntries": "{count} entrées", "@cacheEntries": { "description": "Track cache entry count", "placeholders": { @@ -2920,7 +2920,7 @@ } } }, - "cacheClearSuccess": "Cleared: {target}", + "cacheClearSuccess": "Effacé : {target}", "@cacheClearSuccess": { "description": "Snackbar after clearing selected cache", "placeholders": { @@ -2929,11 +2929,11 @@ } } }, - "cacheClearConfirmTitle": "Clear cache?", + "cacheClearConfirmTitle": "Vider le cache ?", "@cacheClearConfirmTitle": { "description": "Dialog title before clearing one cache category" }, - "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", + "cacheClearConfirmMessage": "Cette opération effacera les données mises en cache pour {target}. Les fichiers musicaux téléchargés ne seront pas supprimés.", "@cacheClearConfirmMessage": { "description": "Dialog message before clearing selected cache", "placeholders": { @@ -2942,27 +2942,27 @@ } } }, - "cacheClearAllConfirmTitle": "Clear all cache?", + "cacheClearAllConfirmTitle": "Vider tout le cache ?", "@cacheClearAllConfirmTitle": { "description": "Dialog title before clearing all caches" }, - "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", + "cacheClearAllConfirmMessage": "Cette opération effacera toutes les catégories mises en cache sur cette page. Les fichiers musicaux téléchargés ne seront pas supprimés.", "@cacheClearAllConfirmMessage": { "description": "Dialog message before clearing all caches" }, - "cacheClearAll": "Clear all cache", + "cacheClearAll": "Vider tout le cache", "@cacheClearAll": { "description": "Button label to clear all caches" }, - "cacheCleanupUnused": "Cleanup unused data", + "cacheCleanupUnused": "Nettoyer les données inutilisées", "@cacheCleanupUnused": { "description": "Action title for cleaning unused entries" }, - "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", + "cacheCleanupUnusedSubtitle": "Supprimer l'historique des téléchargements orphelins et les entrées manquantes dans la bibliothèque", "@cacheCleanupUnusedSubtitle": { "description": "Subtitle for cleanup unused data action" }, - "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", + "cacheCleanupResult": "Nettoyage terminé : {downloadCount} téléchargements orphelins, {libraryCount} entrées de bibliothèque manquantes", "@cacheCleanupResult": { "description": "Snackbar after unused data cleanup", "placeholders": { @@ -2974,55 +2974,55 @@ } } }, - "cacheRefreshStats": "Refresh stats", + "cacheRefreshStats": "Actualiser les statistiques", "@cacheRefreshStats": { "description": "Button label to refresh cache statistics" }, - "trackSaveCoverArt": "Save Cover Art", + "trackSaveCoverArt": "Enregistrer la pochette", "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Save album art as .jpg file", + "trackSaveCoverArtSubtitle": "Enregistrez la pochette de l'album au format .jpg", "@trackSaveCoverArtSubtitle": { "description": "Subtitle for save cover art action" }, - "trackSaveLyrics": "Save Lyrics (.lrc)", + "trackSaveLyrics": "Enregistrer les paroles (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Fetch and save lyrics as .lrc file", + "trackSaveLyricsSubtitle": "Récupérez et enregistrez les paroles sous forme de fichier .lrc", "@trackSaveLyricsSubtitle": { "description": "Subtitle for save lyrics action" }, - "trackSaveLyricsProgress": "Saving lyrics...", + "trackSaveLyricsProgress": "Enregistrement des paroles...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" }, - "trackReEnrich": "Re-enrich", + "trackReEnrich": "Réenrichir", "@trackReEnrich": { "description": "Menu action - re-embed metadata into audio file" }, - "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", + "trackReEnrichOnlineSubtitle": "Rechercher des métadonnées en ligne et les intégrer dans un fichier", "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Fields to update", + "trackReEnrichFieldsTitle": "Champs à mettre à jour", "@trackReEnrichFieldsTitle": { "description": "Section title for field selection in re-enrich dialog" }, - "trackReEnrichFieldCover": "Cover Art", + "trackReEnrichFieldCover": "Illustration de couverture", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" }, - "trackReEnrichFieldLyrics": "Lyrics", + "trackReEnrichFieldLyrics": "Paroles", "@trackReEnrichFieldLyrics": { "description": "Checkbox label for lyrics field in re-enrich" }, - "trackReEnrichFieldBasicTags": "Album, Album Artist", + "trackReEnrichFieldBasicTags": "Album, Album Artiste", "@trackReEnrichFieldBasicTags": { "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" }, - "trackReEnrichFieldTrackInfo": "Track & Disc Number", + "trackReEnrichFieldTrackInfo": "Numéro de piste & de disque", "@trackReEnrichFieldTrackInfo": { "description": "Checkbox label for track info in re-enrich" }, @@ -3030,19 +3030,19 @@ "@trackReEnrichFieldReleaseInfo": { "description": "Checkbox label for release info in re-enrich" }, - "trackReEnrichFieldExtra": "Genre, Label, Copyright", + "trackReEnrichFieldExtra": "Genre, Label, Droits d'auteur", "@trackReEnrichFieldExtra": { "description": "Checkbox label for extra metadata in re-enrich" }, - "trackReEnrichSelectAll": "Select All", + "trackReEnrichSelectAll": "Tout sélectionner", "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, - "trackEditMetadata": "Edit Metadata", + "trackEditMetadata": "Modifier les métadonnées", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" }, - "trackCoverSaved": "Cover art saved to {fileName}", + "trackCoverSaved": "La pochette a été enregistrée sous le nom {fileName}", "@trackCoverSaved": { "description": "Snackbar after cover art saved", "placeholders": { @@ -3051,11 +3051,11 @@ } } }, - "trackCoverNoSource": "No cover art source available", + "trackCoverNoSource": "Aucune source d'illustration de couverture disponible", "@trackCoverNoSource": { "description": "Snackbar when no cover art URL or embedded cover" }, - "trackLyricsSaved": "Lyrics saved to {fileName}", + "trackLyricsSaved": "Paroles enregistrées dans {fileName}", "@trackLyricsSaved": { "description": "Snackbar after lyrics saved", "placeholders": { @@ -3064,27 +3064,27 @@ } } }, - "trackReEnrichProgress": "Re-enriching metadata...", + "trackReEnrichProgress": "Réenrichissement des métadonnées...", "@trackReEnrichProgress": { "description": "Snackbar while re-enriching metadata" }, - "trackReEnrichSearching": "Searching metadata online...", + "trackReEnrichSearching": "Recherche de métadonnées en ligne...", "@trackReEnrichSearching": { "description": "Snackbar while searching metadata from internet for local items" }, - "trackReEnrichSuccess": "Metadata re-enriched successfully", + "trackReEnrichSuccess": "Métadonnées réenrichies avec succès", "@trackReEnrichSuccess": { "description": "Snackbar after successful re-enrichment" }, - "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", + "trackReEnrichFfmpegFailed": "Échec de l'intégration des métadonnées FFmpeg", "@trackReEnrichFfmpegFailed": { "description": "Snackbar when FFmpeg embed fails for MP3/Opus" }, - "queueFlacAction": "Queue FLAC", + "queueFlacAction": "File d'attente FLAC", "@queueFlacAction": { "description": "Action/button label for queueing FLAC redownloads for local tracks" }, - "queueFlacConfirmMessage": "Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n{count} selected", + "queueFlacConfirmMessage": "Recherchez en ligne les correspondances pour les morceaux sélectionnés et ajoutez les téléchargements FLAC à la file d'attente.\n\nLes fichiers existants ne seront ni modifiés ni supprimés.\n\nSeules les correspondances hautement fiables sont automatiquement ajoutées à la file d'attente.\n\n{count} sélectionnés", "@queueFlacConfirmMessage": { "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", "placeholders": { @@ -3093,7 +3093,7 @@ } } }, - "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", + "queueFlacFindingProgress": "Recherche de fichiers FLAC... ({current}/{total})", "@queueFlacFindingProgress": { "description": "Snackbar while resolving remote matches for local FLAC redownloads", "placeholders": { @@ -3105,11 +3105,11 @@ } } }, - "queueFlacNoReliableMatches": "No reliable online matches found for the selection", + "queueFlacNoReliableMatches": "Aucun résultat pertinent n'a été trouvé en ligne pour cette sélection", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" }, - "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", + "queueFlacQueuedWithSkipped": "{addedCount} titres ajoutés à la file d'attente, {skippedCount} titres ignorés", "@queueFlacQueuedWithSkipped": { "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", "placeholders": { @@ -3121,7 +3121,7 @@ } } }, - "trackSaveFailed": "Failed: {error}", + "trackSaveFailed": "Échec : {error}", "@trackSaveFailed": { "description": "Snackbar when save operation fails", "placeholders": { @@ -3130,31 +3130,31 @@ } } }, - "trackConvertFormat": "Convert Format", + "trackConvertFormat": "Convertir le format", "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to MP3, Opus, ALAC, or FLAC", + "trackConvertFormatSubtitle": "Convertir au format AAC/M4A, MP3, Opus, ALAC ou FLAC", "@trackConvertFormatSubtitle": { "description": "Subtitle for convert format menu item" }, - "trackConvertTitle": "Convert Audio", + "trackConvertTitle": "Convertir un fichier audio", "@trackConvertTitle": { "description": "Title of convert bottom sheet" }, - "trackConvertTargetFormat": "Target Format", + "trackConvertTargetFormat": "Format cible", "@trackConvertTargetFormat": { "description": "Label for format selection" }, - "trackConvertBitrate": "Bitrate", + "trackConvertBitrate": "Débit binaire", "@trackConvertBitrate": { "description": "Label for bitrate selection" }, - "trackConvertConfirmTitle": "Confirm Conversion", + "trackConvertConfirmTitle": "Confirmer la conversion", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" }, - "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", + "trackConvertConfirmMessage": "Convertir du format {sourceFormat} au format {targetFormat} avec un débit binaire de {bitrate} ?\n\nLe fichier d'origine sera supprimé après la conversion.", "@trackConvertConfirmMessage": { "description": "Confirmation dialog message", "placeholders": { @@ -3169,7 +3169,7 @@ } } }, - "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", + "trackConvertConfirmMessageLossless": "Convertir de {sourceFormat} vers {targetFormat} ? (Sans perte — aucune perte de qualité)\n\nLe fichier d'origine sera supprimé après la conversion.", "@trackConvertConfirmMessageLossless": { "description": "Confirmation dialog message for lossless-to-lossless conversion", "placeholders": { @@ -3181,15 +3181,15 @@ } } }, - "trackConvertLosslessHint": "Lossless conversion — no quality loss", + "trackConvertLosslessHint": "Conversion sans perte — aucune perte de qualité", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" }, - "trackConvertConverting": "Converting audio...", + "trackConvertConverting": "Conversion audio en cours...", "@trackConvertConverting": { "description": "Snackbar while converting" }, - "trackConvertSuccess": "Converted to {format} successfully", + "trackConvertSuccess": "Conversion vers {format} réussie", "@trackConvertSuccess": { "description": "Snackbar after successful conversion", "placeholders": { @@ -3198,19 +3198,19 @@ } } }, - "trackConvertFailed": "Conversion failed", + "trackConvertFailed": "Échec de la conversion", "@trackConvertFailed": { "description": "Snackbar when conversion fails" }, - "cueSplitTitle": "Split CUE Sheet", + "cueSplitTitle": "Fiche CUE fractionnée", "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Split CUE+FLAC into individual tracks", + "cueSplitSubtitle": "Diviser un fichier CUE+FLAC en pistes individuelles", "@cueSplitSubtitle": { "description": "Subtitle for CUE split menu item" }, - "cueSplitAlbum": "Album: {album}", + "cueSplitAlbum": "Album : {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", "placeholders": { @@ -3219,7 +3219,7 @@ } } }, - "cueSplitArtist": "Artist: {artist}", + "cueSplitArtist": "Artiste : {artist}", "@cueSplitArtist": { "description": "Artist name in CUE split sheet", "placeholders": { @@ -3228,7 +3228,7 @@ } } }, - "cueSplitTrackCount": "{count} tracks", + "cueSplitTrackCount": "{count} titres", "@cueSplitTrackCount": { "description": "Number of tracks in CUE sheet", "placeholders": { @@ -3237,11 +3237,11 @@ } } }, - "cueSplitConfirmTitle": "Split CUE Album", + "cueSplitConfirmTitle": "Album CUE fractionné", "@cueSplitConfirmTitle": { "description": "CUE split confirmation dialog title" }, - "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", + "cueSplitConfirmMessage": "Diviser « {album} » en {count} fichiers FLAC individuels ?\n\nLes fichiers seront enregistrés dans le même répertoire.", "@cueSplitConfirmMessage": { "description": "CUE split confirmation dialog message", "placeholders": { @@ -3253,7 +3253,7 @@ } } }, - "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", + "cueSplitSplitting": "Fractionnement de la liste CUE... ({current}/{total})", "@cueSplitSplitting": { "description": "Snackbar while splitting CUE", "placeholders": { @@ -3265,7 +3265,7 @@ } } }, - "cueSplitSuccess": "Split into {count} tracks successfully", + "cueSplitSuccess": "Le fichier a été divisé en {count} pistes avec succès", "@cueSplitSuccess": { "description": "Snackbar after successful CUE split", "placeholders": { @@ -3274,31 +3274,31 @@ } } }, - "cueSplitFailed": "CUE split failed", + "cueSplitFailed": "Échec de la division CUE", "@cueSplitFailed": { "description": "Snackbar when CUE split fails" }, - "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", + "cueSplitNoAudioFile": "Fichier audio introuvable pour cette liste CUE", "@cueSplitNoAudioFile": { "description": "Error when CUE audio file is missing" }, - "cueSplitButton": "Split into Tracks", + "cueSplitButton": "Diviser en pistes", "@cueSplitButton": { "description": "Button text to start CUE splitting" }, - "actionCreate": "Create", + "actionCreate": "Créer", "@actionCreate": { "description": "Generic action button - create" }, - "collectionFoldersTitle": "My folders", + "collectionFoldersTitle": "Mes dossiers", "@collectionFoldersTitle": { "description": "Library section title for custom folders" }, - "collectionWishlist": "Wishlist", + "collectionWishlist": "Liste de souhaits", "@collectionWishlist": { "description": "Custom folder for saved tracks to download later" }, - "collectionLoved": "Loved", + "collectionLoved": "Favoris", "@collectionLoved": { "description": "Custom folder for favorite tracks" }, @@ -3310,23 +3310,23 @@ "@collectionPlaylist": { "description": "Single playlist label" }, - "collectionAddToPlaylist": "Add to playlist", + "collectionAddToPlaylist": "Ajouter à la playlist", "@collectionAddToPlaylist": { "description": "Action to add a track to user playlist" }, - "collectionCreatePlaylist": "Create playlist", + "collectionCreatePlaylist": "Créer une playlist", "@collectionCreatePlaylist": { "description": "Action to create a new playlist" }, - "collectionNoPlaylistsYet": "No playlists yet", + "collectionNoPlaylistsYet": "Aucune playlist pour le moment", "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Create a playlist to start categorizing tracks", + "collectionNoPlaylistsSubtitle": "Créez une playlist pour commencer à classer vos morceaux", "@collectionNoPlaylistsSubtitle": { "description": "Empty state subtitle when user has no playlists" }, - "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", + "collectionPlaylistTracks": "{count, plural, =1{1 titre} other{{count} titres}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", "placeholders": { @@ -3335,7 +3335,7 @@ } } }, - "collectionAddedToPlaylist": "Added to \"{playlistName}\"", + "collectionAddedToPlaylist": "Ajouté à « {playlistName} »", "@collectionAddedToPlaylist": { "description": "Snackbar after adding track to playlist", "placeholders": { @@ -3344,7 +3344,7 @@ } } }, - "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", + "collectionAlreadyInPlaylist": "Déjà présent dans « {playlistName} »", "@collectionAlreadyInPlaylist": { "description": "Snackbar when track already exists in playlist", "placeholders": { @@ -3353,27 +3353,27 @@ } } }, - "collectionPlaylistCreated": "Playlist created", + "collectionPlaylistCreated": "Playlist créée", "@collectionPlaylistCreated": { "description": "Snackbar after creating playlist" }, - "collectionPlaylistNameHint": "Playlist name", + "collectionPlaylistNameHint": "Nom de la playlist", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" }, - "collectionPlaylistNameRequired": "Playlist name is required", + "collectionPlaylistNameRequired": "Le nom de la playlist est requis", "@collectionPlaylistNameRequired": { "description": "Validation error for empty playlist name" }, - "collectionRenamePlaylist": "Rename playlist", + "collectionRenamePlaylist": "Renommer la playlist", "@collectionRenamePlaylist": { "description": "Action to rename playlist" }, - "collectionDeletePlaylist": "Delete playlist", + "collectionDeletePlaylist": "Supprimer la playlist", "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Delete \"{playlistName}\" and all tracks inside it?", + "collectionDeletePlaylistMessage": "Supprimer « {playlistName} » et tous les morceaux qu'elle contient ?", "@collectionDeletePlaylistMessage": { "description": "Confirmation message for deleting playlist", "placeholders": { @@ -3382,47 +3382,47 @@ } } }, - "collectionPlaylistDeleted": "Playlist deleted", + "collectionPlaylistDeleted": "Playlist supprimée", "@collectionPlaylistDeleted": { "description": "Snackbar after deleting playlist" }, - "collectionPlaylistRenamed": "Playlist renamed", + "collectionPlaylistRenamed": "Playlist renommée", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" }, - "collectionWishlistEmptyTitle": "Wishlist is empty", + "collectionWishlistEmptyTitle": "La liste de souhaits est vide", "@collectionWishlistEmptyTitle": { "description": "Wishlist empty state title" }, - "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", + "collectionWishlistEmptySubtitle": "Appuyez sur le signe « + » à côté des morceaux pour enregistrer ceux que vous souhaitez télécharger plus tard", "@collectionWishlistEmptySubtitle": { "description": "Wishlist empty state subtitle" }, - "collectionLovedEmptyTitle": "Loved folder is empty", + "collectionLovedEmptyTitle": "Le dossier « Favoris » est vide", "@collectionLovedEmptyTitle": { "description": "Loved empty state title" }, - "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", + "collectionLovedEmptySubtitle": "Appuyez sur les morceaux que vous aimez pour les ajouter à vos favoris", "@collectionLovedEmptySubtitle": { "description": "Loved empty state subtitle" }, - "collectionPlaylistEmptyTitle": "Playlist is empty", + "collectionPlaylistEmptyTitle": "La playlist est vide", "@collectionPlaylistEmptyTitle": { "description": "Playlist empty state title" }, - "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", + "collectionPlaylistEmptySubtitle": "Appuyez longuement sur le bouton « + » sur n'importe quel morceau pour l'ajouter ici", "@collectionPlaylistEmptySubtitle": { "description": "Playlist empty state subtitle" }, - "collectionRemoveFromPlaylist": "Remove from playlist", + "collectionRemoveFromPlaylist": "Supprimer de la playlist", "@collectionRemoveFromPlaylist": { "description": "Tooltip for removing track from playlist" }, - "collectionRemoveFromFolder": "Remove from folder", + "collectionRemoveFromFolder": "Supprimer du dossier", "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "\"{trackName}\" removed", + "collectionRemoved": "« {trackName} » supprimé", "@collectionRemoved": { "description": "Snackbar after removing a track from a collection", "placeholders": { @@ -3431,7 +3431,7 @@ } } }, - "collectionAddedToLoved": "\"{trackName}\" added to Loved", + "collectionAddedToLoved": "\"{trackName}\" ajouté aux Favoris", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", "placeholders": { @@ -3440,7 +3440,7 @@ } } }, - "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", + "collectionRemovedFromLoved": "\"{trackName}\" supprimé des Favoris", "@collectionRemovedFromLoved": { "description": "Snackbar after removing track from loved folder", "placeholders": { @@ -3449,7 +3449,7 @@ } } }, - "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", + "collectionAddedToWishlist": "« {trackName} » a été ajouté à la liste de souhaits", "@collectionAddedToWishlist": { "description": "Snackbar after adding track to wishlist", "placeholders": { @@ -3458,7 +3458,7 @@ } } }, - "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", + "collectionRemovedFromWishlist": "« {trackName} » a été supprimé de la liste de souhaits", "@collectionRemovedFromWishlist": { "description": "Snackbar after removing track from wishlist", "placeholders": { @@ -3467,31 +3467,31 @@ } } }, - "trackOptionAddToLoved": "Add to Loved", + "trackOptionAddToLoved": "Ajouter aux Favoris", "@trackOptionAddToLoved": { "description": "Bottom sheet action label - add track to loved folder" }, - "trackOptionRemoveFromLoved": "Remove from Loved", + "trackOptionRemoveFromLoved": "Supprimer des Favoris", "@trackOptionRemoveFromLoved": { "description": "Bottom sheet action label - remove track from loved folder" }, - "trackOptionAddToWishlist": "Add to Wishlist", + "trackOptionAddToWishlist": "Ajouter à la liste de souhaits", "@trackOptionAddToWishlist": { "description": "Bottom sheet action label - add track to wishlist" }, - "trackOptionRemoveFromWishlist": "Remove from Wishlist", + "trackOptionRemoveFromWishlist": "Supprimer de la liste de souhaits", "@trackOptionRemoveFromWishlist": { "description": "Bottom sheet action label - remove track from wishlist" }, - "collectionPlaylistChangeCover": "Change cover image", + "collectionPlaylistChangeCover": "Changer l'image de couverture", "@collectionPlaylistChangeCover": { "description": "Bottom sheet action to pick a custom cover image for a playlist" }, - "collectionPlaylistRemoveCover": "Remove cover image", + "collectionPlaylistRemoveCover": "Supprimer l'image de couverture", "@collectionPlaylistRemoveCover": { "description": "Bottom sheet action to remove custom cover image from a playlist" }, - "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", + "selectionShareCount": "Partager {count} {count, plural, =1{titre} other{titres}}", "@selectionShareCount": { "description": "Share button text with count in selection mode", "placeholders": { @@ -3500,11 +3500,11 @@ } } }, - "selectionShareNoFiles": "No shareable files found", + "selectionShareNoFiles": "Aucun fichier partageable n'a été trouvé", "@selectionShareNoFiles": { "description": "Snackbar when no selected files exist on disk" }, - "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", + "selectionConvertCount": "Convertir {count} {count, plural, =1{titre} other{titres}}", "@selectionConvertCount": { "description": "Convert button text with count in selection mode", "placeholders": { @@ -3513,15 +3513,15 @@ } } }, - "selectionConvertNoConvertible": "No convertible tracks selected", + "selectionConvertNoConvertible": "Aucune piste convertible sélectionnée", "@selectionConvertNoConvertible": { "description": "Snackbar when no selected tracks support conversion" }, - "selectionBatchConvertConfirmTitle": "Batch Convert", + "selectionBatchConvertConfirmTitle": "Conversion par lots", "@selectionBatchConvertConfirmTitle": { "description": "Confirmation dialog title for batch conversion" }, - "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", + "selectionBatchConvertConfirmMessage": "Convertir {count} {count, plural, =1{titre} other{titres}} au format {format} avec un débit binaire de {bitrate} ?\n\nLes fichiers d'origine seront supprimés après la conversion.", "@selectionBatchConvertConfirmMessage": { "description": "Confirmation dialog message for batch conversion", "placeholders": { @@ -3536,7 +3536,7 @@ } } }, - "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", + "selectionBatchConvertConfirmMessageLossless": "Convertir {count} {count, plural, =1{titre} other{titres}} au format {format} ? (Sans perte — aucune perte de qualité)\n\nLes fichiers d'origine seront supprimés après la conversion.", "@selectionBatchConvertConfirmMessageLossless": { "description": "Confirmation dialog message for lossless batch conversion", "placeholders": { @@ -3548,7 +3548,7 @@ } } }, - "selectionBatchConvertProgress": "Converting {current} of {total}...", + "selectionBatchConvertProgress": "Conversion de {current} sur {total}...", "@selectionBatchConvertProgress": { "description": "Snackbar during batch conversion progress", "placeholders": { @@ -3560,7 +3560,7 @@ } } }, - "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", + "selectionBatchConvertSuccess": "{success} pistes sur {total} ont été converties au format {format}", "@selectionBatchConvertSuccess": { "description": "Snackbar after batch conversion completes", "placeholders": { @@ -3575,7 +3575,7 @@ } } }, - "downloadedAlbumDownloadedCount": "{count} downloaded", + "downloadedAlbumDownloadedCount": "{count} téléchargements", "@downloadedAlbumDownloadedCount": { "description": "Downloaded tracks count badge", "placeholders": { @@ -3584,27 +3584,27 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Artist folders use Album Artist when available", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Dossier nommé d'après la balise « Artiste de l'album »", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when Album Artist is used for folder naming" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Artist folders use Track Artist only", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Dossier nommé d'après la balise « Artiste » de la piste", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when Track Artist is used for folder naming" }, - "lyricsProvidersTitle": "Lyrics Providers", + "lyricsProvidersTitle": "Priorité au fournisseur de paroles", "@lyricsProvidersTitle": { "description": "Title for the lyrics provider priority page" }, - "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", + "lyricsProvidersDescription": "Activer, désactiver et réorganiser les sources de paroles. Les sources sont parcourues de haut en bas jusqu'à ce que les paroles soient trouvées.", "@lyricsProvidersDescription": { "description": "Description on the lyrics provider priority page" }, - "lyricsProvidersInfoText": "Extension lyrics providers always run before built-in providers. At least one provider must remain enabled.", + "lyricsProvidersInfoText": "Les fournisseurs de paroles des extensions s'exécutent toujours avant les fournisseurs intégrés. Au moins un fournisseur doit rester activé.", "@lyricsProvidersInfoText": { "description": "Info tip on lyrics provider priority page" }, - "lyricsProvidersEnabledSection": "Enabled ({count})", + "lyricsProvidersEnabledSection": "Activé ({count})", "@lyricsProvidersEnabledSection": { "description": "Section header for enabled providers", "placeholders": { @@ -3613,7 +3613,7 @@ } } }, - "lyricsProvidersDisabledSection": "Disabled ({count})", + "lyricsProvidersDisabledSection": "Désactivés ({count})", "@lyricsProvidersDisabledSection": { "description": "Section header for disabled providers", "placeholders": { @@ -3622,75 +3622,75 @@ } } }, - "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", + "lyricsProvidersAtLeastOne": "Au moins un fournisseur doit rester activé", "@lyricsProvidersAtLeastOne": { "description": "Snackbar when user tries to disable the last enabled provider" }, - "lyricsProvidersSaved": "Lyrics provider priority saved", + "lyricsProvidersSaved": "Priorité du fournisseur de paroles enregistrée", "@lyricsProvidersSaved": { "description": "Snackbar after saving lyrics provider priority" }, - "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", + "lyricsProvidersDiscardContent": "Vous avez des modifications non enregistrées qui seront perdues.", "@lyricsProvidersDiscardContent": { "description": "Body text of the discard-changes dialog on lyrics provider page" }, - "lyricsProviderLrclibDesc": "Open-source synced lyrics database", + "lyricsProviderLrclibDesc": "Base de données open source de paroles synchronisées", "@lyricsProviderLrclibDesc": { "description": "Description for LRCLIB provider" }, - "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", + "lyricsProviderNeteaseDesc": "NetEase Cloud Music (idéal pour les titres asiatiques)", "@lyricsProviderNeteaseDesc": { "description": "Description for Netease provider" }, - "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", + "lyricsProviderMusixmatchDesc": "La plus grande base de données de paroles (multilingue)", "@lyricsProviderMusixmatchDesc": { "description": "Description for Musixmatch provider" }, - "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", + "lyricsProviderAppleMusicDesc": "Paroles synchronisées mot à mot (via un proxy)", "@lyricsProviderAppleMusicDesc": { "description": "Description for Apple Music provider" }, - "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", + "lyricsProviderQqMusicDesc": "QQ Music (idéal pour écouter des titres chinois, via un proxy)", "@lyricsProviderQqMusicDesc": { "description": "Description for QQ Music provider" }, - "lyricsProviderExtensionDesc": "Extension provider", + "lyricsProviderExtensionDesc": "Fournisseur d'extensions", "@lyricsProviderExtensionDesc": { "description": "Generic description for extension-based lyrics providers" }, - "safMigrationTitle": "Storage Update Required", + "safMigrationTitle": "Mise à jour du stockage requise", "@safMigrationTitle": { "description": "Title of SAF migration dialog" }, - "safMigrationMessage1": "SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.", + "safMigrationMessage1": "SpotiFLAC utilise désormais le framework d'accès au stockage Android (SAF) pour les téléchargements. Cela permet de résoudre les erreurs « autorisation refusée » sur Android 10 et versions ultérieures.", "@safMigrationMessage1": { "description": "First paragraph of SAF migration dialog" }, - "safMigrationMessage2": "Please select your download folder again to switch to the new storage system.", + "safMigrationMessage2": "Veuillez sélectionner à nouveau votre dossier de téléchargement pour passer au nouveau système de stockage.", "@safMigrationMessage2": { "description": "Second paragraph of SAF migration dialog" }, - "safMigrationSuccess": "Download folder updated to SAF mode", + "safMigrationSuccess": "Le dossier de téléchargement a été mis à jour en mode SAF", "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Donate", + "settingsDonate": "Soutien au développement", "@settingsDonate": { "description": "Settings menu item - donate" }, - "settingsDonateSubtitle": "Support SpotiFLAC-Mobile development", + "settingsDonateSubtitle": "Offrez un café au développeur", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, - "tooltipLoveAll": "Love All", + "tooltipLoveAll": "Tout aimer", "@tooltipLoveAll": { "description": "Tooltip for the Love All button on album/playlist screens" }, - "tooltipAddToPlaylist": "Add to Playlist", + "tooltipAddToPlaylist": "Ajouter à la playlist", "@tooltipAddToPlaylist": { "description": "Tooltip for the Add to Playlist button" }, - "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", + "snackbarRemovedTracksFromLoved": "{count} titres supprimés des Favoris", "@snackbarRemovedTracksFromLoved": { "description": "Snackbar after removing multiple tracks from Loved folder", "placeholders": { @@ -3699,7 +3699,7 @@ } } }, - "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", + "snackbarAddedTracksToLoved": "{count} titres ajoutés aux Favoris", "@snackbarAddedTracksToLoved": { "description": "Snackbar after adding multiple tracks to Loved folder", "placeholders": { @@ -3708,11 +3708,11 @@ } } }, - "dialogDownloadAllTitle": "Download All", + "dialogDownloadAllTitle": "Tout télécharger", "@dialogDownloadAllTitle": { "description": "Dialog title for bulk download confirmation" }, - "dialogDownloadAllMessage": "Download {count} tracks?", + "dialogDownloadAllMessage": "Télécharger {count} titres ?", "@dialogDownloadAllMessage": { "description": "Body of the Download All confirmation dialog", "placeholders": { @@ -3721,35 +3721,35 @@ } } }, - "homeSkipAlreadyDownloaded": "Skip already downloaded songs", + "homeSkipAlreadyDownloaded": "Ignorer les morceaux déjà téléchargés", "@homeSkipAlreadyDownloaded": { "description": "Checkbox label in import dialog to skip already-downloaded songs" }, - "homeGoToAlbum": "Go to Album", + "homeGoToAlbum": "Aller à l'album", "@homeGoToAlbum": { "description": "Context menu item to navigate to the album page" }, - "homeAlbumInfoUnavailable": "Album info not available", + "homeAlbumInfoUnavailable": "Informations sur l'album non disponibles", "@homeAlbumInfoUnavailable": { "description": "Snackbar when album info cannot be loaded" }, - "snackbarLoadingCueSheet": "Loading CUE sheet...", + "snackbarLoadingCueSheet": "Chargement de la liste CUE...", "@snackbarLoadingCueSheet": { "description": "Snackbar while loading a CUE sheet file" }, - "snackbarMetadataSaved": "Metadata saved successfully", + "snackbarMetadataSaved": "Les métadonnées ont été enregistrées avec succès", "@snackbarMetadataSaved": { "description": "Snackbar after successfully saving track metadata" }, - "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", + "snackbarFailedToEmbedLyrics": "Impossible d'intégrer les paroles", "@snackbarFailedToEmbedLyrics": { "description": "Snackbar when lyrics embedding fails" }, - "snackbarFailedToWriteStorage": "Failed to write back to storage", + "snackbarFailedToWriteStorage": "Échec de l'écriture sur le support de stockage", "@snackbarFailedToWriteStorage": { "description": "Snackbar when writing metadata back to file fails" }, - "snackbarError": "Error: {error}", + "snackbarError": "Erreur : {error}", "@snackbarError": { "description": "Generic error snackbar with error detail", "placeholders": { @@ -3758,167 +3758,167 @@ } } }, - "snackbarNoActionDefined": "No action defined for this button", + "snackbarNoActionDefined": "Aucune action n'est associée à ce bouton", "@snackbarNoActionDefined": { "description": "Snackbar when an extension button has no action configured" }, - "noTracksFoundForAlbum": "No tracks found for this album", + "noTracksFoundForAlbum": "Aucun morceau trouvé pour cet album", "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose storage mode for downloaded files.", + "downloadLocationSubtitle": "Choisissez l'emplacement où enregistrer vos morceaux téléchargés", "@downloadLocationSubtitle": { "description": "Subtitle text in Android download location bottom sheet" }, - "storageModeAppFolder": "App folder (non-SAF)", + "storageModeAppFolder": "Dossier « Applications » (recommandé)", "@storageModeAppFolder": { "description": "Storage mode option - use legacy app folder" }, - "storageModeAppFolderSubtitle": "Use default Music/SpotiFLAC path", + "storageModeAppFolderSubtitle": "Enregistrement par défaut dans le dossier « Musique/SpotiFLAC »", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "SAF folder", + "storageModeSaf": "Dossier personnalisé (SAF)", "@storageModeSaf": { "description": "Storage mode option - use Android SAF picker" }, - "storageModeSafSubtitle": "Pick folder via Android Storage Access Framework", + "storageModeSafSubtitle": "Choisissez n'importe quel dossier, y compris la carte SD", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFilenameDescription": "Customize how your files are named.", + "downloadFilenameDescription": "Utilisez {artist}, {title}, {album}, {track}, {year}, {date} et {disc} comme variables de remplacement.", "@downloadFilenameDescription": { "description": "Description text in filename format bottom sheet" }, - "downloadFilenameInsertTag": "Tap to insert tag:", + "downloadFilenameInsertTag": "Appuyez pour insérer une balise :", "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Albums/ and Singles/ folders", + "downloadSeparateSinglesEnabled": "Les singles et les EP sont enregistrés dans un dossier séparé", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is enabled" }, - "downloadSeparateSinglesDisabled": "All files in same structure", + "downloadSeparateSinglesDisabled": "Les singles et les albums sont enregistrés dans le même dossier", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is disabled" }, - "downloadArtistNameFilters": "Artist Name Filters", + "downloadArtistNameFilters": "Filtres par nom d'artiste", "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Create playlist source folder", + "downloadCreatePlaylistSourceFolder": "Dossier source de la playlist", "@downloadCreatePlaylistSourceFolder": { "description": "Setting title for adding a playlist folder prefix before the normal organization structure" }, - "downloadCreatePlaylistSourceFolderEnabled": "Playlist downloads use Playlist/ plus your normal folder structure.", + "downloadCreatePlaylistSourceFolderEnabled": "Un sous-dossier est créé pour chaque playlist", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist source folder prefix is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "Playlist downloads use the normal folder structure only.", + "downloadCreatePlaylistSourceFolderDisabled": "Tous les morceaux sont enregistrés directement dans le dossier de téléchargement", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist source folder prefix is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "By Playlist already places downloads inside a playlist folder.", + "downloadCreatePlaylistSourceFolderRedundant": "Géré par les paramètres d'organisation des dossiers", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when playlist folder prefix setting is redundant because folder organization is already by playlist" }, - "downloadSongLinkRegion": "SongLink Region", + "downloadSongLinkRegion": "Région SongLink", "@downloadSongLinkRegion": { "description": "Setting title for SongLink country region" }, - "downloadNetworkCompatibilityMode": "Network compatibility mode", + "downloadNetworkCompatibilityMode": "Mode de compatibilité réseau", "@downloadNetworkCompatibilityMode": { "description": "Setting title for network compatibility toggle" }, - "downloadNetworkCompatibilityModeEnabled": "Enabled: try HTTP + accept invalid TLS certificates (unsafe)", + "downloadNetworkCompatibilityModeEnabled": "Utilisation des paramètres TLS hérités pour les réseaux plus anciens", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is enabled" }, - "downloadNetworkCompatibilityModeDisabled": "Off: strict HTTPS certificate validation (recommended)", + "downloadNetworkCompatibilityModeDisabled": "Utilisation des paramètres réseau par défaut", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is disabled" }, - "downloadSelectServiceToEnable": "Select a built-in service to enable", + "downloadSelectServiceToEnable": "Sélectionnez Tidal ou Qobuz pour activer cette option", "@downloadSelectServiceToEnable": { "description": "Hint shown instead of Ask-quality subtitle when no built-in service selected" }, - "downloadSelectTidalQobuz": "Select Tidal or Qobuz above to configure quality", + "downloadSelectTidalQobuz": "Sélectionnez Tidal ou Qobuz pour choisir la qualité audio", "@downloadSelectTidalQobuz": { "description": "Info hint when non-Tidal/Qobuz service is selected" }, - "downloadEmbedLyricsDisabled": "Disabled while Embed Metadata is turned off", + "downloadEmbedLyricsDisabled": "Activez d'abord l'intégration des métadonnées", "@downloadEmbedLyricsDisabled": { "description": "Subtitle for Embed Lyrics when Embed Metadata is disabled" }, - "downloadNeteaseIncludeTranslation": "Netease: Include Translation", + "downloadNeteaseIncludeTranslation": "Netease : inclure la traduction", "@downloadNeteaseIncludeTranslation": { "description": "Toggle title for including Netease translated lyrics" }, - "downloadNeteaseIncludeTranslationEnabled": "Append translated lyrics when available", + "downloadNeteaseIncludeTranslationEnabled": "Lignes de traduction en chinois incluses", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is enabled" }, - "downloadNeteaseIncludeTranslationDisabled": "Use original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Paroles originales uniquement", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is disabled" }, - "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", + "downloadNeteaseIncludeRomanization": "Netease : inclure la romanisation", "@downloadNeteaseIncludeRomanization": { "description": "Toggle title for including Netease romanized lyrics" }, - "downloadNeteaseIncludeRomanizationEnabled": "Append romanized lyrics when available", + "downloadNeteaseIncludeRomanizationEnabled": "Lignes de romanisation incluses", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is enabled" }, - "downloadNeteaseIncludeRomanizationDisabled": "Disabled", + "downloadNeteaseIncludeRomanizationDisabled": "Pas de romanisation", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is disabled" }, - "downloadAppleQqMultiPerson": "Apple/QQ Multi-Person Word-by-Word", + "downloadAppleQqMultiPerson": "Apple / QQ : Paroles pour plusieurs personnes", "@downloadAppleQqMultiPerson": { "description": "Toggle title for Apple/QQ multi-person word-by-word lyrics" }, - "downloadAppleQqMultiPersonEnabled": "Enable v1/v2 speaker and [bg:] tags", + "downloadAppleQqMultiPersonEnabled": "Étiquettes d'intervenants incluses pour les duos et les morceaux en groupe", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person word-by-word is enabled" }, - "downloadAppleQqMultiPersonDisabled": "Simplified word-by-word formatting", + "downloadAppleQqMultiPersonDisabled": "Paroles standard sans indication du haut-parleur", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person word-by-word is disabled" }, - "downloadMusixmatchLanguage": "Musixmatch Language", + "downloadMusixmatchLanguage": "Langue Musixmatch", "@downloadMusixmatchLanguage": { "description": "Setting title for Musixmatch language preference" }, - "downloadMusixmatchLanguageAuto": "Auto (original)", + "downloadMusixmatchLanguageAuto": "Auto (langue d'origine)", "@downloadMusixmatchLanguageAuto": { "description": "Option label when Musixmatch uses original language" }, - "downloadFilterContributing": "Filter contributing artists in Album Artist", + "downloadFilterContributing": "Filtrer les artistes participants", "@downloadFilterContributing": { "description": "Toggle title for filtering contributing artists in Album Artist metadata" }, - "downloadFilterContributingEnabled": "Album Artist metadata uses primary artist only", + "downloadFilterContributingEnabled": "Les artistes ayant contribué à l'album ont été supprimés du nom du dossier « Artiste de l'album »", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is enabled" }, - "downloadFilterContributingDisabled": "Keep full Album Artist metadata value", + "downloadFilterContributingDisabled": "Chaîne « Artiste » de l'album complet utilisée", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is disabled" }, - "downloadProvidersNoneEnabled": "None enabled", + "downloadProvidersNoneEnabled": "Aucun fournisseur n'est activé", "@downloadProvidersNoneEnabled": { "description": "Subtitle for lyrics providers setting when no providers are enabled" }, - "downloadMusixmatchLanguageCode": "Language code", + "downloadMusixmatchLanguageCode": "Code de langue", "@downloadMusixmatchLanguageCode": { "description": "Label for the Musixmatch language code text field" }, - "downloadMusixmatchLanguageHint": "auto / en / es / ja", + "downloadMusixmatchLanguageHint": "par exemple : en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Hint text for the Musixmatch language code field" }, - "downloadMusixmatchLanguageDesc": "Set preferred language code (example: en, es, ja). Leave empty for auto.", + "downloadMusixmatchLanguageDesc": "Saisissez un code de langue BCP-47 (par exemple : en, de, ja) pour demander les paroles traduites à Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in the Musixmatch language picker" }, @@ -3926,27 +3926,27 @@ "@downloadMusixmatchAuto": { "description": "Button to reset Musixmatch language to automatic" }, - "downloadNetworkAnySubtitle": "WiFi + Mobile Data", + "downloadNetworkAnySubtitle": "Utilisez le Wi-Fi ou les données mobiles", "@downloadNetworkAnySubtitle": { "description": "Subtitle for 'Any' network mode option" }, - "downloadNetworkWifiOnlySubtitle": "Pause downloads on mobile data", + "downloadNetworkWifiOnlySubtitle": "Les téléchargements sont mis en pause lors de l'utilisation des données mobiles", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for 'WiFi only' network mode option" }, - "downloadSongLinkRegionDesc": "Used as userCountry for SongLink API lookup.", + "downloadSongLinkRegionDesc": "Région utilisée lors de la résolution des liens vers les morceaux via SongLink. Sélectionnez le pays dans lequel vos services de streaming sont disponibles.", "@downloadSongLinkRegionDesc": { "description": "Description in the SongLink region picker" }, - "snackbarUnsupportedAudioFormat": "Unsupported audio format", + "snackbarUnsupportedAudioFormat": "Format audio non pris en charge", "@snackbarUnsupportedAudioFormat": { "description": "Snackbar when the audio format is not supported for the requested operation" }, - "cacheRefresh": "Refresh", + "cacheRefresh": "Actualiser", "@cacheRefresh": { "description": "Tooltip for refresh button on cache management page" }, - "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", + "dialogDownloadPlaylistsMessage": "Télécharger {trackCount} {trackCount, plural, =1{titre} other{titres}} depuis {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}} ?", "@dialogDownloadPlaylistsMessage": { "description": "Dialog message for bulk playlist download confirmation", "placeholders": { @@ -3958,7 +3958,7 @@ } } }, - "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", + "bulkDownloadPlaylistsButton": "Télécharger {count} {count, plural, =1{playlist} other{playlists}}", "@bulkDownloadPlaylistsButton": { "description": "Button label for bulk downloading selected playlists", "placeholders": { @@ -3967,15 +3967,15 @@ } } }, - "bulkDownloadSelectPlaylists": "Select playlists to download", + "bulkDownloadSelectPlaylists": "Sélectionnez les playlists à télécharger", "@bulkDownloadSelectPlaylists": { "description": "Button label when no playlists are selected for download" }, - "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", + "snackbarSelectedPlaylistsEmpty": "Les playlists sélectionnées ne contiennent aucun morceau", "@snackbarSelectedPlaylistsEmpty": { "description": "Snackbar when selected playlists contain no tracks" }, - "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "playlistsCount": "{count, plural, one {}=1{1 playlist} other{{count} playlists}}", "@playlistsCount": { "description": "Playlist count display", "placeholders": { @@ -3984,27 +3984,27 @@ } } }, - "editMetadataAutoFill": "Auto-fill from online", + "editMetadataAutoFill": "Remplissage automatique en ligne", "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Select fields to fill automatically from online metadata", + "editMetadataAutoFillDesc": "Sélectionnez les champs à remplir automatiquement à partir des métadonnées en ligne", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, - "editMetadataAutoFillFetch": "Fetch & Fill", + "editMetadataAutoFillFetch": "Récupérer & remplir", "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" }, - "editMetadataAutoFillSearching": "Searching online...", + "editMetadataAutoFillSearching": "Recherche en ligne...", "@editMetadataAutoFillSearching": { "description": "Snackbar shown while searching for online metadata" }, - "editMetadataAutoFillNoResults": "No matching metadata found online", + "editMetadataAutoFillNoResults": "Aucune métadonnée correspondante n'a été trouvée en ligne", "@editMetadataAutoFillNoResults": { "description": "Snackbar when online metadata search returns no results" }, - "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", + "editMetadataAutoFillDone": "{count} {count, plural, =1{champ} other{champs}} renseignés à partir des métadonnées en ligne", "@editMetadataAutoFillDone": { "description": "Snackbar confirming how many fields were auto-filled", "placeholders": { @@ -4013,15 +4013,15 @@ } } }, - "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", + "editMetadataAutoFillNoneSelected": "Sélectionnez au moins un champ pour le remplir automatiquement", "@editMetadataAutoFillNoneSelected": { "description": "Snackbar when user taps Fetch without selecting any fields" }, - "editMetadataFieldTitle": "Title", + "editMetadataFieldTitle": "Titre", "@editMetadataFieldTitle": { "description": "Chip label for title field in auto-fill selector" }, - "editMetadataFieldArtist": "Artist", + "editMetadataFieldArtist": "Artiste", "@editMetadataFieldArtist": { "description": "Chip label for artist field in auto-fill selector" }, @@ -4029,7 +4029,7 @@ "@editMetadataFieldAlbum": { "description": "Chip label for album field in auto-fill selector" }, - "editMetadataFieldAlbumArtist": "Album Artist", + "editMetadataFieldAlbumArtist": "Artiste de l'album", "@editMetadataFieldAlbumArtist": { "description": "Chip label for album artist field in auto-fill selector" }, @@ -4037,11 +4037,11 @@ "@editMetadataFieldDate": { "description": "Chip label for date field in auto-fill selector" }, - "editMetadataFieldTrackNum": "Track #", + "editMetadataFieldTrackNum": "Piste n°", "@editMetadataFieldTrackNum": { "description": "Chip label for track number field in auto-fill selector" }, - "editMetadataFieldDiscNum": "Disc #", + "editMetadataFieldDiscNum": "Disque n°", "@editMetadataFieldDiscNum": { "description": "Chip label for disc number field in auto-fill selector" }, @@ -4057,23 +4057,23 @@ "@editMetadataFieldLabel": { "description": "Chip label for label field in auto-fill selector" }, - "editMetadataFieldCopyright": "Copyright", + "editMetadataFieldCopyright": "Droits d'auteur", "@editMetadataFieldCopyright": { "description": "Chip label for copyright field in auto-fill selector" }, - "editMetadataFieldCover": "Cover Art", + "editMetadataFieldCover": "Illustration de couverture", "@editMetadataFieldCover": { "description": "Chip label for cover art field in auto-fill selector" }, - "editMetadataSelectAll": "All", + "editMetadataSelectAll": "Tout", "@editMetadataSelectAll": { "description": "Button to select all fields for auto-fill" }, - "editMetadataSelectEmpty": "Empty only", + "editMetadataSelectEmpty": "Vide uniquement", "@editMetadataSelectEmpty": { "description": "Button to select only fields that are currently empty" }, - "queueDownloadingCount": "Downloading ({count})", + "queueDownloadingCount": "Téléchargement ({count})", "@queueDownloadingCount": { "description": "Header for active downloads section with count", "placeholders": { @@ -4082,15 +4082,15 @@ } } }, - "queueDownloadedHeader": "Downloaded", + "queueDownloadedHeader": "Téléchargé", "@queueDownloadedHeader": { "description": "Header label for downloaded items section in library" }, - "queueFilteringIndicator": "Filtering...", + "queueFilteringIndicator": "Filtrage...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" }, - "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", + "queueTrackCount": "{count, plural, one {}=1{1 titre} other{{count} titres}}", "@queueTrackCount": { "description": "Track count label with plural support", "placeholders": { @@ -4108,67 +4108,67 @@ } } }, - "queueEmptyAlbums": "No album downloads", + "queueEmptyAlbums": "Aucun album téléchargé", "@queueEmptyAlbums": { "description": "Empty state title when no album downloads exist" }, - "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", + "queueEmptyAlbumsSubtitle": "Téléchargez plusieurs titres d'un album pour les écouter ici", "@queueEmptyAlbumsSubtitle": { "description": "Empty state subtitle for album downloads" }, - "queueEmptySingles": "No single downloads", + "queueEmptySingles": "Pas de téléchargement individuel", "@queueEmptySingles": { "description": "Empty state title when no single track downloads exist" }, - "queueEmptySinglesSubtitle": "Single track downloads will appear here", + "queueEmptySinglesSubtitle": "Les téléchargements de titres individuels apparaîtront ici", "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, - "queueEmptyHistory": "No download history", + "queueEmptyHistory": "Aucun historique de téléchargement", "@queueEmptyHistory": { "description": "Empty state title when download history is empty" }, - "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", + "queueEmptyHistorySubtitle": "Les morceaux téléchargés apparaîtront ici", "@queueEmptyHistorySubtitle": { "description": "Empty state subtitle for download history" }, - "selectionAllPlaylistsSelected": "All playlists selected", + "selectionAllPlaylistsSelected": "Toutes les playlists sélectionnées", "@selectionAllPlaylistsSelected": { "description": "Shown when all playlists are selected in selection mode" }, - "selectionTapPlaylistsToSelect": "Tap playlists to select", + "selectionTapPlaylistsToSelect": "Appuyez sur les playlists pour les sélectionner", "@selectionTapPlaylistsToSelect": { "description": "Hint shown in playlist selection mode" }, - "selectionSelectPlaylistsToDelete": "Select playlists to delete", + "selectionSelectPlaylistsToDelete": "Sélectionnez les playlists à supprimer", "@selectionSelectPlaylistsToDelete": { "description": "Hint shown when no playlists are selected for deletion" }, - "audioAnalysisTitle": "Audio Quality Analysis", + "audioAnalysisTitle": "Analyse de la qualité audio", "@audioAnalysisTitle": { "description": "Title for audio analysis section" }, - "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", + "audioAnalysisDescription": "Vérifier la qualité sans perte à l'aide d'une analyse spectrale", "@audioAnalysisDescription": { "description": "Description for audio analysis tap-to-analyze prompt" }, - "audioAnalysisAnalyzing": "Analyzing audio...", + "audioAnalysisAnalyzing": "Analyse audio en cours...", "@audioAnalysisAnalyzing": { "description": "Loading text while analyzing audio" }, - "audioAnalysisSampleRate": "Sample Rate", + "audioAnalysisSampleRate": "Fréquence d'échantillonnage", "@audioAnalysisSampleRate": { "description": "Sample rate metric label" }, - "audioAnalysisBitDepth": "Bit Depth", + "audioAnalysisBitDepth": "Nombre de bits", "@audioAnalysisBitDepth": { "description": "Bit depth metric label" }, - "audioAnalysisChannels": "Channels", + "audioAnalysisChannels": "Chaînes", "@audioAnalysisChannels": { "description": "Channels metric label" }, - "audioAnalysisDuration": "Duration", + "audioAnalysisDuration": "Durée", "@audioAnalysisDuration": { "description": "Duration metric label" }, @@ -4176,15 +4176,15 @@ "@audioAnalysisNyquist": { "description": "Nyquist frequency metric label" }, - "audioAnalysisFileSize": "Size", + "audioAnalysisFileSize": "Taille", "@audioAnalysisFileSize": { "description": "File size metric label" }, - "audioAnalysisDynamicRange": "Dynamic Range", + "audioAnalysisDynamicRange": "Plage dynamique", "@audioAnalysisDynamicRange": { "description": "Dynamic range metric label" }, - "audioAnalysisPeak": "Peak", + "audioAnalysisPeak": "Pic", "@audioAnalysisPeak": { "description": "Peak amplitude metric label" }, @@ -4192,19 +4192,19 @@ "@audioAnalysisRms": { "description": "RMS level metric label" }, - "audioAnalysisSamples": "Samples", + "audioAnalysisSamples": "Échantillons", "@audioAnalysisSamples": { "description": "Total samples metric label" }, - "audioAnalysisRescan": "Re-analyze", + "audioAnalysisRescan": "Réanalyser", "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Réanalyse du fichier audio...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Search with {providerName}", + "extensionsSearchWith": "Rechercher avec {providerName}", "@extensionsSearchWith": { "description": "Extensions page - subtitle for built-in search provider option", "placeholders": { @@ -4213,11 +4213,11 @@ } } }, - "extensionsHomeFeedProvider": "Home Feed Provider", + "extensionsHomeFeedProvider": "Fournisseur de flux RSS", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" }, - "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", + "extensionsHomeFeedDescription": "Choisissez l'extension qui affiche le fil d'actualité sur l'écran principal", "@extensionsHomeFeedDescription": { "description": "Extensions page - description for home feed provider picker" }, @@ -4225,11 +4225,11 @@ "@extensionsHomeFeedAuto": { "description": "Extensions page - home feed provider option: auto" }, - "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", + "extensionsHomeFeedAutoSubtitle": "Sélectionnez automatiquement la meilleure option disponible", "@extensionsHomeFeedAutoSubtitle": { "description": "Extensions page - subtitle for auto home feed option" }, - "extensionsHomeFeedUse": "Use {extensionName} home feed", + "extensionsHomeFeedUse": "Utiliser le fil d'actualité de {extensionName}", "@extensionsHomeFeedUse": { "description": "Extensions page - subtitle for a specific extension home feed option", "placeholders": { @@ -4238,7 +4238,7 @@ } } }, - "extensionsNoHomeFeedExtensions": "No extensions with home feed", + "extensionsNoHomeFeedExtensions": "Aucune extension avec le flux principal", "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, @@ -4250,11 +4250,11 @@ "@sortAlphaDesc": { "description": "Sort option - alphabetical descending" }, - "cancelDownloadTitle": "Cancel download?", + "cancelDownloadTitle": "Annuler le téléchargement ?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" }, - "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", + "cancelDownloadContent": "Cela annulera le téléchargement en cours de « {trackName} ».", "@cancelDownloadContent": { "description": "Dialog body when confirming cancellation of an active download", "placeholders": { @@ -4263,19 +4263,19 @@ } } }, - "cancelDownloadKeep": "Keep", + "cancelDownloadKeep": "Conserver", "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, - "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", + "metadataSaveFailedFfmpeg": "Échec de l'enregistrement des métadonnées via FFmpeg", "@metadataSaveFailedFfmpeg": { "description": "Snackbar error when FFmpeg fails to write metadata" }, - "metadataSaveFailedStorage": "Failed to write metadata back to storage", + "metadataSaveFailedStorage": "Échec de la réécriture des métadonnées sur le support de stockage", "@metadataSaveFailedStorage": { "description": "Snackbar error when writing metadata file back to storage fails" }, - "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", + "snackbarFolderPickerFailed": "Impossible d'ouvrir le sélecteur de dossiers : {error}", "@snackbarFolderPickerFailed": { "description": "Snackbar shown when folder picker fails to open", "placeholders": { @@ -4284,35 +4284,35 @@ } } }, - "errorLoadAlbum": "Failed to load album", + "errorLoadAlbum": "Impossible de charger l'album", "@errorLoadAlbum": { "description": "Error state shown when album fails to load" }, - "errorLoadPlaylist": "Failed to load playlist", + "errorLoadPlaylist": "Impossible de charger la playlist", "@errorLoadPlaylist": { "description": "Error state shown when playlist fails to load" }, - "errorLoadArtist": "Failed to load artist", + "errorLoadArtist": "Impossible de charger l'artiste", "@errorLoadArtist": { "description": "Error state shown when artist fails to load" }, - "notifChannelDownloadName": "Download Progress", + "notifChannelDownloadName": "Progression du téléchargement", "@notifChannelDownloadName": { "description": "Android notification channel name for download progress" }, - "notifChannelDownloadDesc": "Shows download progress for tracks", + "notifChannelDownloadDesc": "Affiche la progression du téléchargement des morceaux", "@notifChannelDownloadDesc": { "description": "Android notification channel description for download progress" }, - "notifChannelLibraryScanName": "Library Scan", + "notifChannelLibraryScanName": "Analyse de la bibliothèque", "@notifChannelLibraryScanName": { "description": "Android notification channel name for library scan" }, - "notifChannelLibraryScanDesc": "Shows local library scan progress", + "notifChannelLibraryScanDesc": "Affiche la progression de la numérisation dans la bibliothèque locale", "@notifChannelLibraryScanDesc": { "description": "Android notification channel description for library scan" }, - "notifDownloadingTrack": "Downloading {trackName}", + "notifDownloadingTrack": "Téléchargement de {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", "placeholders": { @@ -4321,7 +4321,7 @@ } } }, - "notifFinalizingTrack": "Finalizing {trackName}", + "notifFinalizingTrack": "Finalisation de {trackName}", "@notifFinalizingTrack": { "description": "Notification title while finalizing (embedding metadata) a track", "placeholders": { @@ -4330,11 +4330,11 @@ } } }, - "notifEmbeddingMetadata": "Embedding metadata...", + "notifEmbeddingMetadata": "Intégration des métadonnées...", "@notifEmbeddingMetadata": { "description": "Notification body while embedding metadata into a downloaded track" }, - "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", + "notifAlreadyInLibraryCount": "Déjà dans la bibliothèque ({completed}/{total})", "@notifAlreadyInLibraryCount": { "description": "Notification title when track is already in library, with count", "placeholders": { @@ -4346,11 +4346,11 @@ } } }, - "notifAlreadyInLibrary": "Already in Library", + "notifAlreadyInLibrary": "Déjà dans la bibliothèque", "@notifAlreadyInLibrary": { "description": "Notification title when track is already in library" }, - "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", + "notifDownloadCompleteCount": "Téléchargement terminé ({completed}/{total})", "@notifDownloadCompleteCount": { "description": "Notification title when download is complete, with count", "placeholders": { @@ -4362,11 +4362,11 @@ } } }, - "notifDownloadComplete": "Download Complete", + "notifDownloadComplete": "Télécharger l'intégralité", "@notifDownloadComplete": { "description": "Notification title when a single download is complete" }, - "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", + "notifDownloadsFinished": "Téléchargements terminés ({completed} terminé, {failed} en échec)", "@notifDownloadsFinished": { "description": "Notification title when queue finishes with some failures", "placeholders": { @@ -4378,11 +4378,11 @@ } } }, - "notifAllDownloadsComplete": "All Downloads Complete", + "notifAllDownloadsComplete": "Tous les téléchargements sont terminés", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count} tracks downloaded successfully", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 piste téléchargée avec succès} other{{count} pistes téléchargées avec succès}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -4391,11 +4391,11 @@ } } }, - "notifScanningLibrary": "Scanning local library", + "notifScanningLibrary": "Numérisation de la bibliothèque locale", "@notifScanningLibrary": { "description": "Notification title while scanning local library" }, - "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", + "notifLibraryScanProgressWithTotal": "{scanned}/{total} fichiers • {percentage} %", "@notifLibraryScanProgressWithTotal": { "description": "Notification body for library scan progress when total is known", "placeholders": { @@ -4410,7 +4410,7 @@ } } }, - "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", + "notifLibraryScanProgressNoTotal": "{scanned} fichiers analysés • {percentage} %", "@notifLibraryScanProgressNoTotal": { "description": "Notification body for library scan progress when total is unknown", "placeholders": { @@ -4422,11 +4422,11 @@ } } }, - "notifLibraryScanComplete": "Library scan complete", + "notifLibraryScanComplete": "Analyse de la bibliothèque terminée", "@notifLibraryScanComplete": { "description": "Notification title when library scan finishes" }, - "notifLibraryScanCompleteBody": "{count} tracks indexed", + "notifLibraryScanCompleteBody": "{count} titres indexés", "@notifLibraryScanCompleteBody": { "description": "Notification body for library scan complete - number of indexed tracks", "placeholders": { @@ -4435,7 +4435,7 @@ } } }, - "notifLibraryScanExcluded": "{count} excluded", + "notifLibraryScanExcluded": "{count} exclus", "@notifLibraryScanExcluded": { "description": "Library scan complete suffix - excluded track count", "placeholders": { @@ -4444,7 +4444,7 @@ } } }, - "notifLibraryScanErrors": "{count} errors", + "notifLibraryScanErrors": "{count} erreurs", "@notifLibraryScanErrors": { "description": "Library scan complete suffix - error count", "placeholders": { @@ -4453,19 +4453,19 @@ } } }, - "notifLibraryScanFailed": "Library scan failed", + "notifLibraryScanFailed": "Échec de l'analyse de la bibliothèque", "@notifLibraryScanFailed": { "description": "Notification title when library scan fails" }, - "notifLibraryScanCancelled": "Library scan cancelled", + "notifLibraryScanCancelled": "Annulation de la numérisation de la bibliothèque", "@notifLibraryScanCancelled": { "description": "Notification title when library scan is cancelled by the user" }, - "notifLibraryScanStopped": "Scan stopped before completion.", + "notifLibraryScanStopped": "L'analyse a été interrompue avant d'être terminée.", "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, - "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", + "notifDownloadingUpdate": "Télécharger SpotiFLAC v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", "placeholders": { @@ -4474,7 +4474,7 @@ } } }, - "notifUpdateProgress": "{received} / {total} MB • {percentage}%", + "notifUpdateProgress": "{received} / {total} Mo • {percentage}%", "@notifUpdateProgress": { "description": "Notification body showing update download progress", "placeholders": { @@ -4489,11 +4489,11 @@ } } }, - "notifUpdateReady": "Update Ready", + "notifUpdateReady": "Prêt pour la mise à jour", "@notifUpdateReady": { "description": "Notification title when app update download is complete" }, - "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", + "notifUpdateReadyBody": "SpotiFLAC v{version} a été téléchargé. Appuyez pour l'installer.", "@notifUpdateReadyBody": { "description": "Notification body when app update is ready to install", "placeholders": { @@ -4502,84 +4502,1057 @@ } } }, - "notifUpdateFailed": "Update Failed", + "notifUpdateFailed": "Échec de la mise à jour", "@notifUpdateFailed": { "description": "Notification title when app update download fails" }, - "notifUpdateFailedBody": "Could not download update. Try again later.", + "notifUpdateFailedBody": "Impossible de télécharger la mise à jour. Veuillez réessayer plus tard.", "@notifUpdateFailedBody": { "description": "Notification body when app update download fails" }, - "settingsFiles": "Files & Folders", + "settingsFiles": "Fichiers & Dossiers", "@settingsFiles": { "description": "Settings menu item - file and folder settings" }, - "settingsFilesSubtitle": "Download location, filename, folder structure", + "settingsFilesSubtitle": "Emplacement de téléchargement, nom de fichier, structure des dossiers", "@settingsFilesSubtitle": { "description": "Subtitle for files & folders settings" }, - "settingsMetadata": "Metadata", + "settingsMetadata": "Métadonnées", "@settingsMetadata": { "description": "Settings menu item - metadata settings" }, - "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", + "settingsMetadataSubtitle": "Pochettes, balises, ReplayGain, fournisseurs", "@settingsMetadataSubtitle": { "description": "Subtitle for metadata settings" }, - "settingsLyrics": "Lyrics", + "settingsLyrics": "Paroles", "@settingsLyrics": { "description": "Settings menu item - lyrics settings" }, - "settingsLyricsSubtitle": "Embed, mode, providers, language options", + "settingsLyricsSubtitle": "Intégration, mode, fournisseurs, options linguistiques", "@settingsLyricsSubtitle": { "description": "Subtitle for lyrics settings" }, - "settingsApp": "App", + "settingsApp": "Application", "@settingsApp": { "description": "Settings menu item - app settings" }, - "settingsAppSubtitle": "Updates, data, extension repo, debug", + "settingsAppSubtitle": "Mises à jour, données, dépôt d'extension, débogage", "@settingsAppSubtitle": { "description": "Subtitle for app settings" }, - "sectionMetadataProviders": "Providers", + "sectionMetadataProviders": "Fournisseurs", "@sectionMetadataProviders": { "description": "Settings section header for metadata providers" }, - "sectionDuplicates": "Duplicates", + "sectionDuplicates": "Doublons", "@sectionDuplicates": { "description": "Settings section header for deduplication" }, - "sectionLyricsProviderOptions": "Provider Options", + "sectionLyricsProviderOptions": "Options du fournisseur", "@sectionLyricsProviderOptions": { "description": "Settings section header for per-provider lyrics options" }, - "metadataProvidersTitle": "Metadata Provider Priority", + "metadataProvidersTitle": "Priorité des fournisseurs de métadonnées", "@metadataProvidersTitle": { "description": "Settings item title for metadata provider order" }, - "metadataProvidersSubtitle": "Drag to set search and metadata source order", + "metadataProvidersSubtitle": "Faites glisser pour définir l'ordre des sources de recherche et de métadonnées", "@metadataProvidersSubtitle": { "description": "Subtitle for metadata provider priority item" }, - "downloadDeduplication": "Skip Duplicate Downloads", + "downloadDeduplication": "Éviter les téléchargements en double", "@downloadDeduplication": { "description": "Setting - skip tracks already in download history" }, - "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", + "downloadDeduplicationEnabled": "Les morceaux déjà téléchargés seront ignorés", "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, - "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", + "downloadDeduplicationDisabled": "Tous les morceaux seront téléchargés, quel que soit l'historique", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, - "downloadFallbackExtensions": "Fallback Extensions", + "downloadFallbackExtensions": "Extensions de secours", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" }, - "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", + "downloadFallbackExtensionsSubtitle": "Choisissez les extensions pouvant servir de solution de secours", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" + }, + "homeEmptyTitle": "Aucun moteur de recherche pour le moment", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Installez une extension pour continuer.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "setupLanguageTitle": "Choisir la langue", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Sélectionnez la langue de votre choix pour l'application. Vous pourrez la modifier ultérieurement dans les Paramètres.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "Paramètres par défaut du système", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "searchEmptyResultSubtitle": "Essayez un autre mot-clé", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "trackLyricsSource": "Source : {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "extensionsInstalledCount": "{count} extensions ont été installées avec succès", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "{installed} extensions sur {attempted}", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "downloadLossyAac": "AAC/M4A 320 kbps", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Compatibilité optimale avec les appareils mobiles, format M4A", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "collectionFavoriteArtists": "Artistes Favoris", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionArtistCount": "{count, plural, =1{1 artiste} other{{count} artistes}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionFavoriteArtistsEmptyTitle": "Pas encore d'artistes préférés", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Appuyez sur le cœur sur la page d'un artiste pour le garder ici", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionAddedToFavoriteArtists": "« {artistName} » a été ajouté à vos artistes préférés", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "« {artistName} » a été supprimé de vos artistes favoris", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "artistOptionAddToFavorites": "Ajouter aux Artistes Favoris", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Supprimer des Artistes Favoris", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "downloadAppleElrcWordSync": "Synchronisation des paroles Apple Music eLRC", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Conservation des horodatages bruts mot à mot", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Paroles d'Apple Music, ligne par ligne, en toute sécurité", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Conteneur", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Format décodé", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Coupure", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "Pas de coupure", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Limite spectrale", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Statistiques par chaîne", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Ne pas afficher le fil d'actualité sur l'écran principal", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 titre téléchargé} other{{completed} titres téléchargés}}, {failed, plural, =1{1 échec} other{{failed} échecs}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Téléchargements annulés", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 téléchargement annulé par l'utilisateur} other{{count} téléchargements annulés par l'utilisateur}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "searchTracks": "Titres", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Collez une URL valide ou effectuez une recherche...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Rechercher avec {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Importer un fichier CSV", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Changer de moteur de recherche", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Coller", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Rechercher des morceaux...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Rechercher des morceaux", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Collez ou effectuez une recherche...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Téléchargement terminé", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Téléchargement en cours", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Lancer le téléchargement", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Intégrer des métadonnées", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Ajouter des métadonnées, des pochettes et des paroles intégrées aux fichiers", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Désactivé (avancé) : ignorer l'intégration de toutes les métadonnées", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Désactivé lorsque l'intégration des métadonnées est désactivée", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "Aucune pochette d'album n'a été trouvée", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Remplacer la pochette", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Choisir une pochette", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Supprimer la pochette sélectionnée", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Pochette actuelle", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Pochette choisie", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "La pochette sélectionnée remplacera la pochette actuellement intégrée lorsque vous appuierez sur « Enregistrer ».", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Arrêter", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Téléchargement en cours", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Fichier téléchargé manquant", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Téléchargement terminé", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Débit limité", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "Ce titre est peut-être encore disponible. Patientez quelques minutes, réduisez le nombre de téléchargements simultanés, puis réessayez.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Sélectionnez une couleur d'accentuation {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Défilement automatique activé", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Défilement automatique désactivé", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copier les journaux", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Effacer la recherche", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "BLOCAGE PAR LE FAI DÉTECTÉ", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Il se peut que votre fournisseur d'accès Internet bloque l'accès aux services de téléchargement", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Essayez d'utiliser un VPN ou de modifier vos paramètres DNS pour les remplacer par 1.1.1.1 ou 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "NOMBRE LIMITÉ", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Trop de requêtes adressées au service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Attendez quelques minutes avant de réessayer", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "ERREUR DE RÉSEAU", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Problèmes de connexion détectés", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Vérifiez votre connexion Internet", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "PISTE INTROUVABLE", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Certains titres n'ont pas pu être trouvés sur les plateformes de téléchargement", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "Il se peut que ce morceau ne soit pas disponible en qualité sans perte", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Recherche d'artiste...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "Informations sur {type} non disponibles", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Balises", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Fonctions utilitaires", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Ignorer", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Changer de dossier", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Écouter le morceau {trackName} de {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Ouvrir {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Ouvrir {title}, {count} {count, plural, =1{item} other{éléments}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Ouvrir l'album {albumName} de {artistName}, {trackCount} titres", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} de {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Sélectionnez l'album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Ouvrir l'album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "editMetadataFieldDateHint": "AAAA-MM-JJ ou AAAA", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Total des pistes", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Total des disques", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Compositeur", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Commentaire", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Avancé", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Numéro de piste manquant", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Numéro de disque manquant", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Artiste manquant", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Format ISRC incorrect", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Label manquant", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Supprimer {count} {count, plural, one {}=1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, one {}=1{playlist} other{playlists}} supprimées", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Ajout de {count} {count, plural, =1{titre} other{titres}} à {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Ajout de {count} {count, plural, =1{titre} other{titres}} à {playlistName} ({alreadyCount} titres déjà présents dans la playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{élément} other{éléments}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Les métadonnées ont été réenrichies avec succès ({successCount}/{total}) - Échec : {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Supprimer {count} {count, plural, =1{titre} other{titres}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Téléchargement - {speed} Mo/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "C'est parti...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Sélectionner une piste", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Désélectionner la piste", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Écouter {trackName} de {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Nécessite la version v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Aller", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Résumé du problème", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Nombre total d'erreurs : {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Concerne : {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Analyse annulée", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "Vous pouvez relancer l'analyse dès que vous êtes prêt.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} dans l'historique des téléchargements (exclu de la liste)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Tâche de téléchargement native", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Service worker Android en version bêta pour le téléchargement d'extensions", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BÊTA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "État du service", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Santé du service", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{vérification} other{vérifications}} configurées", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Appuyez sur « Se connecter à Spotify » pour remplir ce champ.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Dernière vérification à {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Actualiser l'état", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Gestion des URL personnalisées", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "Cette extension prend en charge les liens provenant de ces sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Partagez des liens provenant de ces sites vers SpotiFLAC Mobile et cette extension s'en chargera.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{paramètre} other{paramètres}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "En ligne", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Dégradé", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Hors ligne", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Non configuré", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Inconnu", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "requis", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Non défini", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "L'action a échoué", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Saisir une valeur", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service en ligne", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service perturbé", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service hors ligne", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "État du service inconnu", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stéréo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Ouvrir dans {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Intégré", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Album inconnu", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Artiste inconnu", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Stockage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Dossier non valide sélectionné", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "Impossible de conserver l'accès au dossier sélectionné", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "N'importe lequel", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Métadonnées", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Télécharger", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utilitaire", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Paroles", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Intégration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Sorties", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "Aucun", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "{count} tentatives ont échoué", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Enregistrer l'historique des téléchargements", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Conserver les téléchargements terminés dans l'historique et la bibliothèque", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Désactiver l'historique des téléchargements ?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "L'historique actuel sera effacé. Les fichiers téléchargés ne seront pas supprimés.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Désactiver et effacer", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Ouvrir dans d'autres services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "Aucun autre service compatible", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Introuvable", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copier le lien", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "Lien {service} copié", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } } -} \ No newline at end of file +} diff --git a/lib/l10n/arb/app_hi.arb b/lib/l10n/arb/app_hi.arb index de8cab74..5e6e7bf4 100644 --- a/lib/l10n/arb/app_hi.arb +++ b/lib/l10n/arb/app_hi.arb @@ -1,6 +1,6 @@ { "@@locale": "hi", - "@@last_modified": "2026-01-16", + "@@last_modified": "2026-04-28", "appName": "SpotiFLAC Mobile", "@appName": { "description": "App name - DO NOT TRANSLATE" @@ -145,7 +145,7 @@ "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Service used when searching by track name.", + "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, @@ -202,7 +202,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Embed synced lyrics into FLAC files", + "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -1441,11 +1441,11 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Service, quality, filename format", + "settingsDownloadSubtitle": "Service, quality, fallback", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, lyrics, cover art, updates", + "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", "@settingsOptionsSubtitle": { "description": "Options settings description" }, @@ -3134,7 +3134,7 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to MP3, Opus, ALAC, or FLAC", + "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", "@trackConvertFormatSubtitle": { "description": "Subtitle for convert format menu item" }, @@ -3584,15 +3584,15 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Artist folders use Album Artist when available", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when Album Artist is used for folder naming" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Artist folders use Track Artist only", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when Track Artist is used for folder naming" }, - "lyricsProvidersTitle": "Lyrics Providers", + "lyricsProvidersTitle": "Lyrics Provider Priority", "@lyricsProvidersTitle": { "description": "Title for the lyrics provider priority page" }, @@ -3674,11 +3674,11 @@ "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Donate", + "settingsDonate": "Support Development", "@settingsDonate": { "description": "Settings menu item - donate" }, - "settingsDonateSubtitle": "Support SpotiFLAC-Mobile development", + "settingsDonateSubtitle": "Buy the developer a coffee", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, @@ -3766,27 +3766,27 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose storage mode for downloaded files.", + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", "@downloadLocationSubtitle": { "description": "Subtitle text in Android download location bottom sheet" }, - "storageModeAppFolder": "App folder (non-SAF)", + "storageModeAppFolder": "App Folder (Recommended)", "@storageModeAppFolder": { "description": "Storage mode option - use legacy app folder" }, - "storageModeAppFolderSubtitle": "Use default Music/SpotiFLAC path", + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "SAF folder", + "storageModeSaf": "Custom Folder (SAF)", "@storageModeSaf": { "description": "Storage mode option - use Android SAF picker" }, - "storageModeSafSubtitle": "Pick folder via Android Storage Access Framework", + "storageModeSafSubtitle": "Pick any folder, including SD card", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFilenameDescription": "Customize how your files are named.", + "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description text in filename format bottom sheet" }, @@ -3794,11 +3794,11 @@ "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Albums/ and Singles/ folders", + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is enabled" }, - "downloadSeparateSinglesDisabled": "All files in same structure", + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is disabled" }, @@ -3806,19 +3806,19 @@ "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Create playlist source folder", + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", "@downloadCreatePlaylistSourceFolder": { "description": "Setting title for adding a playlist folder prefix before the normal organization structure" }, - "downloadCreatePlaylistSourceFolderEnabled": "Playlist downloads use Playlist/ plus your normal folder structure.", + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist source folder prefix is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "Playlist downloads use the normal folder structure only.", + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist source folder prefix is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "By Playlist already places downloads inside a playlist folder.", + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when playlist folder prefix setting is redundant because folder organization is already by playlist" }, @@ -3826,27 +3826,27 @@ "@downloadSongLinkRegion": { "description": "Setting title for SongLink country region" }, - "downloadNetworkCompatibilityMode": "Network compatibility mode", + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", "@downloadNetworkCompatibilityMode": { "description": "Setting title for network compatibility toggle" }, - "downloadNetworkCompatibilityModeEnabled": "Enabled: try HTTP + accept invalid TLS certificates (unsafe)", + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is enabled" }, - "downloadNetworkCompatibilityModeDisabled": "Off: strict HTTPS certificate validation (recommended)", + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is disabled" }, - "downloadSelectServiceToEnable": "Select a built-in service to enable", + "downloadSelectServiceToEnable": "Select Tidal or Qobuz to enable this option", "@downloadSelectServiceToEnable": { "description": "Hint shown instead of Ask-quality subtitle when no built-in service selected" }, - "downloadSelectTidalQobuz": "Select Tidal or Qobuz above to configure quality", + "downloadSelectTidalQobuz": "Select Tidal or Qobuz to choose audio quality", "@downloadSelectTidalQobuz": { "description": "Info hint when non-Tidal/Qobuz service is selected" }, - "downloadEmbedLyricsDisabled": "Disabled while Embed Metadata is turned off", + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle for Embed Lyrics when Embed Metadata is disabled" }, @@ -3854,11 +3854,11 @@ "@downloadNeteaseIncludeTranslation": { "description": "Toggle title for including Netease translated lyrics" }, - "downloadNeteaseIncludeTranslationEnabled": "Append translated lyrics when available", + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is enabled" }, - "downloadNeteaseIncludeTranslationDisabled": "Use original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is disabled" }, @@ -3866,23 +3866,23 @@ "@downloadNeteaseIncludeRomanization": { "description": "Toggle title for including Netease romanized lyrics" }, - "downloadNeteaseIncludeRomanizationEnabled": "Append romanized lyrics when available", + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is enabled" }, - "downloadNeteaseIncludeRomanizationDisabled": "Disabled", + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is disabled" }, - "downloadAppleQqMultiPerson": "Apple/QQ Multi-Person Word-by-Word", + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", "@downloadAppleQqMultiPerson": { "description": "Toggle title for Apple/QQ multi-person word-by-word lyrics" }, - "downloadAppleQqMultiPersonEnabled": "Enable v1/v2 speaker and [bg:] tags", + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person word-by-word is enabled" }, - "downloadAppleQqMultiPersonDisabled": "Simplified word-by-word formatting", + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person word-by-word is disabled" }, @@ -3890,23 +3890,23 @@ "@downloadMusixmatchLanguage": { "description": "Setting title for Musixmatch language preference" }, - "downloadMusixmatchLanguageAuto": "Auto (original)", + "downloadMusixmatchLanguageAuto": "Auto (original language)", "@downloadMusixmatchLanguageAuto": { "description": "Option label when Musixmatch uses original language" }, - "downloadFilterContributing": "Filter contributing artists in Album Artist", + "downloadFilterContributing": "Filter Contributing Artists", "@downloadFilterContributing": { "description": "Toggle title for filtering contributing artists in Album Artist metadata" }, - "downloadFilterContributingEnabled": "Album Artist metadata uses primary artist only", + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is enabled" }, - "downloadFilterContributingDisabled": "Keep full Album Artist metadata value", + "downloadFilterContributingDisabled": "Full Album Artist string used", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is disabled" }, - "downloadProvidersNoneEnabled": "None enabled", + "downloadProvidersNoneEnabled": "No providers enabled", "@downloadProvidersNoneEnabled": { "description": "Subtitle for lyrics providers setting when no providers are enabled" }, @@ -3914,11 +3914,11 @@ "@downloadMusixmatchLanguageCode": { "description": "Label for the Musixmatch language code text field" }, - "downloadMusixmatchLanguageHint": "auto / en / es / ja", + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Hint text for the Musixmatch language code field" }, - "downloadMusixmatchLanguageDesc": "Set preferred language code (example: en, es, ja). Leave empty for auto.", + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in the Musixmatch language picker" }, @@ -3926,15 +3926,15 @@ "@downloadMusixmatchAuto": { "description": "Button to reset Musixmatch language to automatic" }, - "downloadNetworkAnySubtitle": "WiFi + Mobile Data", + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", "@downloadNetworkAnySubtitle": { "description": "Subtitle for 'Any' network mode option" }, - "downloadNetworkWifiOnlySubtitle": "Pause downloads on mobile data", + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for 'WiFi only' network mode option" }, - "downloadSongLinkRegionDesc": "Used as userCountry for SongLink API lookup.", + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", "@downloadSongLinkRegionDesc": { "description": "Description in the SongLink region picker" }, @@ -4200,7 +4200,7 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Re-analyzing audio...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, @@ -4382,7 +4382,7 @@ "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count} tracks downloaded successfully", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -4581,5 +4581,978 @@ "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" + }, + "homeEmptyTitle": "No search providers yet", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Install an extension to continue.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import CSV", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Search tracks...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Search for tracks", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "Starting...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BETA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } } -} \ No newline at end of file +} diff --git a/lib/l10n/arb/app_id.arb b/lib/l10n/arb/app_id.arb index 8ec985fa..c4ef0056 100644 --- a/lib/l10n/arb/app_id.arb +++ b/lib/l10n/arb/app_id.arb @@ -1,6 +1,6 @@ { "@@locale": "id", - "@@last_modified": "2026-01-16", + "@@last_modified": "2026-04-28", "appName": "SpotiFLAC Mobile", "@appName": { "description": "App name - DO NOT TRANSLATE" @@ -17,7 +17,7 @@ "@navSettings": { "description": "Bottom navigation - Settings tab" }, - "navStore": "Repo", + "navStore": "Repositori", "@navStore": { "description": "Bottom navigation - Extension store tab" }, @@ -29,11 +29,11 @@ "@homeSubtitle": { "description": "Subtitle shown below search box" }, - "homeEmptyTitle": "Belum ada provider pencarian", + "homeEmptyTitle": "Belum ada penyedia pencarian", "@homeEmptyTitle": { "description": "Title shown on home when no providers are available yet" }, - "homeEmptySubtitle": "Pasang ekstensi untuk melanjutkan.", + "homeEmptySubtitle": "Instal ekstensi untuk melanjutkan.", "@homeEmptySubtitle": { "description": "Subtitle shown on home when no providers are available yet" }, @@ -145,7 +145,7 @@ "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Layanan yang digunakan saat mencari berdasarkan nama lagu.", + "optionsPrimaryProviderSubtitle": "Layanan yang digunakan untuk mencari berdasarkan nama lagu atau album", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, @@ -162,7 +162,7 @@ "@optionsDefaultSearchTab": { "description": "Title for the preferred default search tab setting" }, - "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "optionsDefaultSearchTabSubtitle": "Pilih tab mana yang terbuka terlebih dahulu untuk hasil pencarian baru.", "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, @@ -194,7 +194,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Sematkan lirik sinkron ke file FLAC", + "optionsEmbedLyricsSubtitle": "Simpan lirik yang disinkronkan bersama dengan lagu yang Anda unduh", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -905,7 +905,7 @@ "@errorNoTracksFound": { "description": "Error - search returned no results" }, - "searchEmptyResultSubtitle": "Coba kata kunci lain", + "searchEmptyResultSubtitle": "Try another keyword", "@searchEmptyResultSubtitle": { "description": "Subtitle shown under the empty search result state on the home screen" }, @@ -1361,11 +1361,11 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Layanan, kualitas, format nama file", + "settingsDownloadSubtitle": "Service, quality, fallback", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, lirik, cover art, pembaruan", + "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", "@settingsOptionsSubtitle": { "description": "Options settings description" }, @@ -1825,19 +1825,19 @@ "@downloadUseAlbumArtistForFolders": { "description": "Setting - choose whether artist folders use Album Artist or Track Artist" }, - "downloadCreatePlaylistSourceFolder": "Create playlist source folder", + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", "@downloadCreatePlaylistSourceFolder": { "description": "Setting title for adding a playlist folder prefix before the normal organization structure" }, - "downloadCreatePlaylistSourceFolderEnabled": "Playlist downloads use Playlist/ plus your normal folder structure.", + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist source folder prefix is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "Playlist downloads use the normal folder structure only.", + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist source folder prefix is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "By Playlist already places downloads inside a playlist folder.", + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when playlist folder prefix setting is redundant because folder organization is already by playlist" }, @@ -2853,7 +2853,7 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to MP3, Opus, ALAC, or FLAC", + "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", "@trackConvertFormatSubtitle": { "description": "Subtitle for convert format menu item" }, @@ -3291,19 +3291,19 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Artist folders use Album Artist when available", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when Album Artist is used for folder naming" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Artist folders use Track Artist only", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when Track Artist is used for folder naming" }, - "downloadSingleFilenameFormat": "Single Filename Format", + "downloadSingleFilenameFormat": "Format Nama Berkas Tunggal", "@downloadSingleFilenameFormat": { "description": "Setting for output filename pattern for singles/EPs" }, - "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", + "downloadSingleFilenameFormatDescription": "Pola nama file untuk single dan EP. Menggunakan tag yang sama dengan format album.", "@downloadSingleFilenameFormatDescription": { "description": "Subtitle description for single filename format setting" }, @@ -3319,35 +3319,35 @@ "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" }, - "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", + "optionsReplayGainSubtitleOn": "Pindai kenyaringan dan sematkan tag ReplayGain (EBU R128)", "@optionsReplayGainSubtitleOn": { "description": "Subtitle when ReplayGain is enabled" }, - "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", + "optionsReplayGainSubtitleOff": "Dinonaktifkan: tidak ada tag normalisasi kenyaringan", "@optionsReplayGainSubtitleOff": { "description": "Subtitle when ReplayGain is disabled" }, - "optionsArtistTagMode": "Artist Tag Mode", + "optionsArtistTagMode": "Mode Tag Artis", "@optionsArtistTagMode": { "description": "Setting title for how artist metadata is written into files" }, - "optionsArtistTagModeDescription": "Choose how multiple artists are written into embedded tags.", + "optionsArtistTagModeDescription": "Pilih bagaimana beberapa artis dicantumkan dalam tag yang disematkan.", "@optionsArtistTagModeDescription": { "description": "Bottom-sheet description for artist tag mode setting" }, - "optionsArtistTagModeJoined": "Single joined value", + "optionsArtistTagModeJoined": "Nilai gabungan tunggal", "@optionsArtistTagModeJoined": { "description": "Artist tag mode option that joins multiple artists into one value" }, - "optionsArtistTagModeJoinedSubtitle": "Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.", + "optionsArtistTagModeJoinedSubtitle": "Tuliskan satu nilai ARTIS seperti \"Artis A, Artis B\" untuk kompatibilitas pemain maksimal.", "@optionsArtistTagModeJoinedSubtitle": { "description": "Subtitle for joined artist tag mode" }, - "optionsArtistTagModeSplitVorbis": "Split tags for FLAC/Opus", + "optionsArtistTagModeSplitVorbis": "Tag terpisah untuk FLAC/Opus", "@optionsArtistTagModeSplitVorbis": { "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" }, - "optionsArtistTagModeSplitVorbisSubtitle": "Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.", + "optionsArtistTagModeSplitVorbisSubtitle": "Tulis satu tag artis per artis untuk FLAC dan Opus; MP3 dan M4A tetap tergabung.", "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, @@ -3620,7 +3620,7 @@ } } }, - "lyricsProvidersTitle": "Lyrics Providers", + "lyricsProvidersTitle": "Lyrics Provider Priority", "@lyricsProvidersTitle": { "description": "Title for the lyrics provider priority page" }, @@ -3702,11 +3702,11 @@ "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Donate", + "settingsDonate": "Support Development", "@settingsDonate": { "description": "Settings menu item - donate" }, - "settingsDonateSubtitle": "Support SpotiFLAC-Mobile development", + "settingsDonateSubtitle": "Buy the developer a coffee", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, @@ -3794,27 +3794,27 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose storage mode for downloaded files.", + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", "@downloadLocationSubtitle": { "description": "Subtitle text in Android download location bottom sheet" }, - "storageModeAppFolder": "App folder (non-SAF)", + "storageModeAppFolder": "App Folder (Recommended)", "@storageModeAppFolder": { "description": "Storage mode option - use legacy app folder" }, - "storageModeAppFolderSubtitle": "Use default Music/SpotiFLAC path", + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "SAF folder", + "storageModeSaf": "Custom Folder (SAF)", "@storageModeSaf": { "description": "Storage mode option - use Android SAF picker" }, - "storageModeSafSubtitle": "Pick folder via Android Storage Access Framework", + "storageModeSafSubtitle": "Pick any folder, including SD card", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFilenameDescription": "Customize how your files are named.", + "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description text in filename format bottom sheet" }, @@ -3822,11 +3822,11 @@ "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Albums/ and Singles/ folders", + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is enabled" }, - "downloadSeparateSinglesDisabled": "All files in same structure", + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is disabled" }, @@ -3838,27 +3838,27 @@ "@downloadSongLinkRegion": { "description": "Setting title for SongLink country region" }, - "downloadNetworkCompatibilityMode": "Network compatibility mode", + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", "@downloadNetworkCompatibilityMode": { "description": "Setting title for network compatibility toggle" }, - "downloadNetworkCompatibilityModeEnabled": "Enabled: try HTTP + accept invalid TLS certificates (unsafe)", + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is enabled" }, - "downloadNetworkCompatibilityModeDisabled": "Off: strict HTTPS certificate validation (recommended)", + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is disabled" }, - "downloadSelectServiceToEnable": "Select a built-in service to enable", + "downloadSelectServiceToEnable": "Select Tidal or Qobuz to enable this option", "@downloadSelectServiceToEnable": { "description": "Hint shown instead of Ask-quality subtitle when no built-in service selected" }, - "downloadSelectTidalQobuz": "Select Tidal or Qobuz above to configure quality", + "downloadSelectTidalQobuz": "Select Tidal or Qobuz to choose audio quality", "@downloadSelectTidalQobuz": { "description": "Info hint when non-Tidal/Qobuz service is selected" }, - "downloadEmbedLyricsDisabled": "Disabled while Embed Metadata is turned off", + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle for Embed Lyrics when Embed Metadata is disabled" }, @@ -3866,11 +3866,11 @@ "@downloadNeteaseIncludeTranslation": { "description": "Toggle title for including Netease translated lyrics" }, - "downloadNeteaseIncludeTranslationEnabled": "Append translated lyrics when available", + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is enabled" }, - "downloadNeteaseIncludeTranslationDisabled": "Use original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is disabled" }, @@ -3878,23 +3878,23 @@ "@downloadNeteaseIncludeRomanization": { "description": "Toggle title for including Netease romanized lyrics" }, - "downloadNeteaseIncludeRomanizationEnabled": "Append romanized lyrics when available", + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is enabled" }, - "downloadNeteaseIncludeRomanizationDisabled": "Disabled", + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is disabled" }, - "downloadAppleQqMultiPerson": "Apple/QQ Multi-Person Word-by-Word", + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", "@downloadAppleQqMultiPerson": { "description": "Toggle title for Apple/QQ multi-person word-by-word lyrics" }, - "downloadAppleQqMultiPersonEnabled": "Enable v1/v2 speaker and [bg:] tags", + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person word-by-word is enabled" }, - "downloadAppleQqMultiPersonDisabled": "Simplified word-by-word formatting", + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person word-by-word is disabled" }, @@ -3902,23 +3902,23 @@ "@downloadMusixmatchLanguage": { "description": "Setting title for Musixmatch language preference" }, - "downloadMusixmatchLanguageAuto": "Auto (original)", + "downloadMusixmatchLanguageAuto": "Auto (original language)", "@downloadMusixmatchLanguageAuto": { "description": "Option label when Musixmatch uses original language" }, - "downloadFilterContributing": "Filter contributing artists in Album Artist", + "downloadFilterContributing": "Filter Contributing Artists", "@downloadFilterContributing": { "description": "Toggle title for filtering contributing artists in Album Artist metadata" }, - "downloadFilterContributingEnabled": "Album Artist metadata uses primary artist only", + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is enabled" }, - "downloadFilterContributingDisabled": "Keep full Album Artist metadata value", + "downloadFilterContributingDisabled": "Full Album Artist string used", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is disabled" }, - "downloadProvidersNoneEnabled": "None enabled", + "downloadProvidersNoneEnabled": "No providers enabled", "@downloadProvidersNoneEnabled": { "description": "Subtitle for lyrics providers setting when no providers are enabled" }, @@ -3926,11 +3926,11 @@ "@downloadMusixmatchLanguageCode": { "description": "Label for the Musixmatch language code text field" }, - "downloadMusixmatchLanguageHint": "auto / en / es / ja", + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Hint text for the Musixmatch language code field" }, - "downloadMusixmatchLanguageDesc": "Set preferred language code (example: en, es, ja). Leave empty for auto.", + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in the Musixmatch language picker" }, @@ -3938,15 +3938,15 @@ "@downloadMusixmatchAuto": { "description": "Button to reset Musixmatch language to automatic" }, - "downloadNetworkAnySubtitle": "WiFi + Mobile Data", + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", "@downloadNetworkAnySubtitle": { "description": "Subtitle for 'Any' network mode option" }, - "downloadNetworkWifiOnlySubtitle": "Pause downloads on mobile data", + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for 'WiFi only' network mode option" }, - "downloadSongLinkRegionDesc": "Used as userCountry for SongLink API lookup.", + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", "@downloadSongLinkRegionDesc": { "description": "Description in the SongLink region picker" }, @@ -4212,7 +4212,7 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Re-analyzing audio...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, @@ -4378,7 +4378,7 @@ "@notifDownloadComplete": { "description": "Notification title when a single download is complete" }, - "notifDownloadsFinished": "Unduhan Selesai ({completed} selesai, {failed} gagal)", + "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", "@notifDownloadsFinished": { "description": "Notification title when queue finishes with some failures", "placeholders": { @@ -4390,11 +4390,11 @@ } } }, - "notifAllDownloadsComplete": "Semua Unduhan Selesai", + "notifAllDownloadsComplete": "All Downloads Complete", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count} lagu berhasil diunduh", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -4403,7 +4403,7 @@ } } }, - "notifDownloadsFinishedBody": "{completed} lagu diunduh, {failed} gagal", + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", "@notifDownloadsFinishedBody": { "description": "Notification body when queue finishes with failures", "placeholders": { @@ -4415,11 +4415,11 @@ } } }, - "notifDownloadsCanceledTitle": "Unduhan dibatalkan", + "notifDownloadsCanceledTitle": "Downloads canceled", "@notifDownloadsCanceledTitle": { "description": "Notification title when downloads are canceled by the user" }, - "notifDownloadsCanceledBody": "{count} unduhan dibatalkan oleh pengguna", + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", "@notifDownloadsCanceledBody": { "description": "Notification body when downloads are canceled by the user", "placeholders": { @@ -4619,19 +4619,19 @@ "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" }, - "queueRateLimitTitle": "Layanan sedang membatasi permintaan", + "queueRateLimitTitle": "Service rate limited", "@queueRateLimitTitle": { "description": "Title shown on a failed queue item when the download service rate limits requests" }, - "queueRateLimitMessage": "Lagu ini mungkin masih tersedia. Tunggu beberapa menit, kurangi unduhan paralel, lalu coba lagi.", + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", "@queueRateLimitMessage": { "description": "Explanation shown on a failed queue item when the download service rate limits requests" }, - "editMetadataSelectNone": "Tidak ada", + "editMetadataSelectNone": "None", "@editMetadataSelectNone": { "description": "Button to clear selected fields for auto-fill" }, - "queueRetryAllFailed": "Coba ulang {count} gagal", + "queueRetryAllFailed": "Retry {count} failed", "@queueRetryAllFailed": { "description": "Button to retry every failed download in the queue", "placeholders": { @@ -4640,47 +4640,919 @@ } } }, - "settingsSaveDownloadHistory": "Simpan riwayat unduhan", + "settingsSaveDownloadHistory": "Save download history", "@settingsSaveDownloadHistory": { "description": "Settings switch title for storing completed downloads in history" }, - "settingsSaveDownloadHistorySubtitle": "Simpan unduhan selesai di riwayat dan tampilan pustaka", + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", "@settingsSaveDownloadHistorySubtitle": { "description": "Settings switch subtitle for storing completed downloads in history" }, - "dialogDisableHistoryTitle": "Matikan riwayat unduhan?", + "dialogDisableHistoryTitle": "Turn off download history?", "@dialogDisableHistoryTitle": { "description": "Confirmation dialog title shown before disabling download history" }, - "dialogDisableHistoryMessage": "Riwayat yang ada akan dihapus. File unduhan tidak akan dihapus.", + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", "@dialogDisableHistoryMessage": { "description": "Confirmation dialog message shown before disabling download history" }, - "dialogDisableAndClear": "Matikan dan hapus", + "dialogDisableAndClear": "Turn off and clear", "@dialogDisableAndClear": { "description": "Confirmation action to disable download history and clear existing entries" }, - "openInOtherServices": "Buka di Layanan Lain", + "openInOtherServices": "Open in Other Services", "@openInOtherServices": { "description": "Title and tooltip for finding the current collection in other services" }, - "shareSheetNoExtensions": "Tidak ada layanan lain yang kompatibel", + "shareSheetNoExtensions": "No other compatible services", "@shareSheetNoExtensions": { "description": "Empty state when no extensions can be searched for cross-service links" }, - "shareSheetNotFound": "Tidak ditemukan", + "shareSheetNotFound": "Not found", "@shareSheetNotFound": { "description": "Cross-service share sheet row subtitle when a service has no match" }, - "shareSheetCopyLink": "Salin Tautan", + "shareSheetCopyLink": "Copy Link", "@shareSheetCopyLink": { "description": "Tooltip for copying a cross-service link" }, - "shareSheetLinkCopied": "Tautan {service} disalin", + "shareSheetLinkCopied": "{service} link copied", "@shareSheetLinkCopied": { "description": "Snackbar after copying a cross-service link", "placeholders": { "service": {} } + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import CSV", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Search tracks...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Search for tracks", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "Starting...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BETA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" } } diff --git a/lib/l10n/arb/app_ja.arb b/lib/l10n/arb/app_ja.arb index 6fac9706..5f754c4c 100644 --- a/lib/l10n/arb/app_ja.arb +++ b/lib/l10n/arb/app_ja.arb @@ -1,6 +1,6 @@ { "@@locale": "ja", - "@@last_modified": "2026-01-16", + "@@last_modified": "2026-04-28", "appName": "SpotiFLAC Mobile", "@appName": { "description": "App name - DO NOT TRANSLATE" @@ -137,7 +137,7 @@ "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Service used when searching by track name.", + "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, @@ -178,7 +178,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "同期する歌詞を FLAC ファイルに埋め込む", + "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -1325,11 +1325,11 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "サービス、品質、ファイル名、形式", + "settingsDownloadSubtitle": "Service, quality, fallback", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, lyrics, cover art, updates", + "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", "@settingsOptionsSubtitle": { "description": "Options settings description" }, @@ -2752,7 +2752,7 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to MP3, Opus, ALAC, or FLAC", + "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", "@trackConvertFormatSubtitle": { "description": "Subtitle for convert format menu item" }, @@ -3174,11 +3174,11 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Artist folders use Album Artist when available", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when Album Artist is used for folder naming" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Artist folders use Track Artist only", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when Track Artist is used for folder naming" }, @@ -3592,7 +3592,7 @@ } } }, - "lyricsProvidersTitle": "Lyrics Providers", + "lyricsProvidersTitle": "Lyrics Provider Priority", "@lyricsProvidersTitle": { "description": "Title for the lyrics provider priority page" }, @@ -3674,11 +3674,11 @@ "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Donate", + "settingsDonate": "Support Development", "@settingsDonate": { "description": "Settings menu item - donate" }, - "settingsDonateSubtitle": "Support SpotiFLAC-Mobile development", + "settingsDonateSubtitle": "Buy the developer a coffee", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, @@ -3766,27 +3766,27 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose storage mode for downloaded files.", + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", "@downloadLocationSubtitle": { "description": "Subtitle text in Android download location bottom sheet" }, - "storageModeAppFolder": "App folder (non-SAF)", + "storageModeAppFolder": "App Folder (Recommended)", "@storageModeAppFolder": { "description": "Storage mode option - use legacy app folder" }, - "storageModeAppFolderSubtitle": "Use default Music/SpotiFLAC path", + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "SAF folder", + "storageModeSaf": "Custom Folder (SAF)", "@storageModeSaf": { "description": "Storage mode option - use Android SAF picker" }, - "storageModeSafSubtitle": "Pick folder via Android Storage Access Framework", + "storageModeSafSubtitle": "Pick any folder, including SD card", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFilenameDescription": "Customize how your files are named.", + "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description text in filename format bottom sheet" }, @@ -3794,11 +3794,11 @@ "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Albums/ and Singles/ folders", + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is enabled" }, - "downloadSeparateSinglesDisabled": "All files in same structure", + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is disabled" }, @@ -3806,19 +3806,19 @@ "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Create playlist source folder", + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", "@downloadCreatePlaylistSourceFolder": { "description": "Setting title for adding a playlist folder prefix before the normal organization structure" }, - "downloadCreatePlaylistSourceFolderEnabled": "Playlist downloads use Playlist/ plus your normal folder structure.", + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist source folder prefix is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "Playlist downloads use the normal folder structure only.", + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist source folder prefix is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "By Playlist already places downloads inside a playlist folder.", + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when playlist folder prefix setting is redundant because folder organization is already by playlist" }, @@ -3826,27 +3826,27 @@ "@downloadSongLinkRegion": { "description": "Setting title for SongLink country region" }, - "downloadNetworkCompatibilityMode": "Network compatibility mode", + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", "@downloadNetworkCompatibilityMode": { "description": "Setting title for network compatibility toggle" }, - "downloadNetworkCompatibilityModeEnabled": "Enabled: try HTTP + accept invalid TLS certificates (unsafe)", + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is enabled" }, - "downloadNetworkCompatibilityModeDisabled": "Off: strict HTTPS certificate validation (recommended)", + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is disabled" }, - "downloadSelectServiceToEnable": "Select a built-in service to enable", + "downloadSelectServiceToEnable": "Select Tidal or Qobuz to enable this option", "@downloadSelectServiceToEnable": { "description": "Hint shown instead of Ask-quality subtitle when no built-in service selected" }, - "downloadSelectTidalQobuz": "Select Tidal or Qobuz above to configure quality", + "downloadSelectTidalQobuz": "Select Tidal or Qobuz to choose audio quality", "@downloadSelectTidalQobuz": { "description": "Info hint when non-Tidal/Qobuz service is selected" }, - "downloadEmbedLyricsDisabled": "Disabled while Embed Metadata is turned off", + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle for Embed Lyrics when Embed Metadata is disabled" }, @@ -3854,11 +3854,11 @@ "@downloadNeteaseIncludeTranslation": { "description": "Toggle title for including Netease translated lyrics" }, - "downloadNeteaseIncludeTranslationEnabled": "Append translated lyrics when available", + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is enabled" }, - "downloadNeteaseIncludeTranslationDisabled": "Use original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is disabled" }, @@ -3866,23 +3866,23 @@ "@downloadNeteaseIncludeRomanization": { "description": "Toggle title for including Netease romanized lyrics" }, - "downloadNeteaseIncludeRomanizationEnabled": "Append romanized lyrics when available", + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is enabled" }, - "downloadNeteaseIncludeRomanizationDisabled": "Disabled", + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is disabled" }, - "downloadAppleQqMultiPerson": "Apple/QQ Multi-Person Word-by-Word", + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", "@downloadAppleQqMultiPerson": { "description": "Toggle title for Apple/QQ multi-person word-by-word lyrics" }, - "downloadAppleQqMultiPersonEnabled": "Enable v1/v2 speaker and [bg:] tags", + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person word-by-word is enabled" }, - "downloadAppleQqMultiPersonDisabled": "Simplified word-by-word formatting", + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person word-by-word is disabled" }, @@ -3890,23 +3890,23 @@ "@downloadMusixmatchLanguage": { "description": "Setting title for Musixmatch language preference" }, - "downloadMusixmatchLanguageAuto": "Auto (original)", + "downloadMusixmatchLanguageAuto": "Auto (original language)", "@downloadMusixmatchLanguageAuto": { "description": "Option label when Musixmatch uses original language" }, - "downloadFilterContributing": "Filter contributing artists in Album Artist", + "downloadFilterContributing": "Filter Contributing Artists", "@downloadFilterContributing": { "description": "Toggle title for filtering contributing artists in Album Artist metadata" }, - "downloadFilterContributingEnabled": "Album Artist metadata uses primary artist only", + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is enabled" }, - "downloadFilterContributingDisabled": "Keep full Album Artist metadata value", + "downloadFilterContributingDisabled": "Full Album Artist string used", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is disabled" }, - "downloadProvidersNoneEnabled": "None enabled", + "downloadProvidersNoneEnabled": "No providers enabled", "@downloadProvidersNoneEnabled": { "description": "Subtitle for lyrics providers setting when no providers are enabled" }, @@ -3914,11 +3914,11 @@ "@downloadMusixmatchLanguageCode": { "description": "Label for the Musixmatch language code text field" }, - "downloadMusixmatchLanguageHint": "auto / en / es / ja", + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Hint text for the Musixmatch language code field" }, - "downloadMusixmatchLanguageDesc": "Set preferred language code (example: en, es, ja). Leave empty for auto.", + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in the Musixmatch language picker" }, @@ -3926,15 +3926,15 @@ "@downloadMusixmatchAuto": { "description": "Button to reset Musixmatch language to automatic" }, - "downloadNetworkAnySubtitle": "WiFi + Mobile Data", + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", "@downloadNetworkAnySubtitle": { "description": "Subtitle for 'Any' network mode option" }, - "downloadNetworkWifiOnlySubtitle": "Pause downloads on mobile data", + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for 'WiFi only' network mode option" }, - "downloadSongLinkRegionDesc": "Used as userCountry for SongLink API lookup.", + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", "@downloadSongLinkRegionDesc": { "description": "Description in the SongLink region picker" }, @@ -4200,7 +4200,7 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Re-analyzing audio...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, @@ -4382,7 +4382,7 @@ "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count} tracks downloaded successfully", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -4581,5 +4581,978 @@ "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" + }, + "homeEmptyTitle": "No search providers yet", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Install an extension to continue.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import CSV", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Search tracks...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Search for tracks", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "Starting...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BETA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } } } diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index a34f22f7..981bf8b7 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -1,6 +1,6 @@ { "@@locale": "ko", - "@@last_modified": "2026-01-16", + "@@last_modified": "2026-04-28", "appName": "SpotiFLAC Mobile", "@appName": { "description": "App name - DO NOT TRANSLATE" @@ -25,7 +25,7 @@ "@homeTitle": { "description": "Home screen title" }, - "homeSubtitle": "Paste a supported URL or search by name", + "homeSubtitle": "지원되는 URL을 붙여 넣거나, 이름을 검색", "@homeSubtitle": { "description": "Subtitle shown below search box" }, @@ -109,11 +109,11 @@ "@appearanceThemeSystem": { "description": "Follow system theme" }, - "appearanceThemeLight": "Light", + "appearanceThemeLight": "밝은", "@appearanceThemeLight": { "description": "Light theme" }, - "appearanceThemeDark": "Dark", + "appearanceThemeDark": "다크", "@appearanceThemeDark": { "description": "Dark theme" }, @@ -145,7 +145,7 @@ "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "음반 이름으로 검색할 때 사용되는 서비스", + "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, @@ -202,7 +202,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "FLAC 파일에 동기화된 가사를 삽입합니다", + "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -1091,7 +1091,7 @@ "@tooltipPlay": { "description": "Tooltip - play button" }, - "filenameFormat": "", + "filenameFormat": "Filename Format", "@filenameFormat": { "description": "Setting title - filename pattern" }, @@ -1441,11 +1441,11 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Service, quality, filename format", + "settingsDownloadSubtitle": "Service, quality, fallback", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, lyrics, cover art, updates", + "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", "@settingsOptionsSubtitle": { "description": "Options settings description" }, @@ -3134,7 +3134,7 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to MP3, Opus, ALAC, or FLAC", + "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", "@trackConvertFormatSubtitle": { "description": "Subtitle for convert format menu item" }, @@ -3584,15 +3584,15 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Artist folders use Album Artist when available", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when Album Artist is used for folder naming" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Artist folders use Track Artist only", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when Track Artist is used for folder naming" }, - "lyricsProvidersTitle": "Lyrics Providers", + "lyricsProvidersTitle": "Lyrics Provider Priority", "@lyricsProvidersTitle": { "description": "Title for the lyrics provider priority page" }, @@ -3674,11 +3674,11 @@ "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Donate", + "settingsDonate": "Support Development", "@settingsDonate": { "description": "Settings menu item - donate" }, - "settingsDonateSubtitle": "Support SpotiFLAC-Mobile development", + "settingsDonateSubtitle": "Buy the developer a coffee", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, @@ -3766,27 +3766,27 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose storage mode for downloaded files.", + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", "@downloadLocationSubtitle": { "description": "Subtitle text in Android download location bottom sheet" }, - "storageModeAppFolder": "App folder (non-SAF)", + "storageModeAppFolder": "App Folder (Recommended)", "@storageModeAppFolder": { "description": "Storage mode option - use legacy app folder" }, - "storageModeAppFolderSubtitle": "Use default Music/SpotiFLAC path", + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "SAF folder", + "storageModeSaf": "Custom Folder (SAF)", "@storageModeSaf": { "description": "Storage mode option - use Android SAF picker" }, - "storageModeSafSubtitle": "Pick folder via Android Storage Access Framework", + "storageModeSafSubtitle": "Pick any folder, including SD card", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFilenameDescription": "Customize how your files are named.", + "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description text in filename format bottom sheet" }, @@ -3794,11 +3794,11 @@ "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Albums/ and Singles/ folders", + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is enabled" }, - "downloadSeparateSinglesDisabled": "All files in same structure", + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is disabled" }, @@ -3806,19 +3806,19 @@ "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Create playlist source folder", + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", "@downloadCreatePlaylistSourceFolder": { "description": "Setting title for adding a playlist folder prefix before the normal organization structure" }, - "downloadCreatePlaylistSourceFolderEnabled": "Playlist downloads use Playlist/ plus your normal folder structure.", + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist source folder prefix is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "Playlist downloads use the normal folder structure only.", + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist source folder prefix is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "By Playlist already places downloads inside a playlist folder.", + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when playlist folder prefix setting is redundant because folder organization is already by playlist" }, @@ -3826,27 +3826,27 @@ "@downloadSongLinkRegion": { "description": "Setting title for SongLink country region" }, - "downloadNetworkCompatibilityMode": "Network compatibility mode", + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", "@downloadNetworkCompatibilityMode": { "description": "Setting title for network compatibility toggle" }, - "downloadNetworkCompatibilityModeEnabled": "Enabled: try HTTP + accept invalid TLS certificates (unsafe)", + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is enabled" }, - "downloadNetworkCompatibilityModeDisabled": "Off: strict HTTPS certificate validation (recommended)", + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is disabled" }, - "downloadSelectServiceToEnable": "Select a built-in service to enable", + "downloadSelectServiceToEnable": "Select Tidal or Qobuz to enable this option", "@downloadSelectServiceToEnable": { "description": "Hint shown instead of Ask-quality subtitle when no built-in service selected" }, - "downloadSelectTidalQobuz": "Select Tidal or Qobuz above to configure quality", + "downloadSelectTidalQobuz": "Select Tidal or Qobuz to choose audio quality", "@downloadSelectTidalQobuz": { "description": "Info hint when non-Tidal/Qobuz service is selected" }, - "downloadEmbedLyricsDisabled": "Disabled while Embed Metadata is turned off", + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle for Embed Lyrics when Embed Metadata is disabled" }, @@ -3854,11 +3854,11 @@ "@downloadNeteaseIncludeTranslation": { "description": "Toggle title for including Netease translated lyrics" }, - "downloadNeteaseIncludeTranslationEnabled": "Append translated lyrics when available", + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is enabled" }, - "downloadNeteaseIncludeTranslationDisabled": "Use original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is disabled" }, @@ -3866,23 +3866,23 @@ "@downloadNeteaseIncludeRomanization": { "description": "Toggle title for including Netease romanized lyrics" }, - "downloadNeteaseIncludeRomanizationEnabled": "Append romanized lyrics when available", + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is enabled" }, - "downloadNeteaseIncludeRomanizationDisabled": "Disabled", + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is disabled" }, - "downloadAppleQqMultiPerson": "Apple/QQ Multi-Person Word-by-Word", + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", "@downloadAppleQqMultiPerson": { "description": "Toggle title for Apple/QQ multi-person word-by-word lyrics" }, - "downloadAppleQqMultiPersonEnabled": "Enable v1/v2 speaker and [bg:] tags", + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person word-by-word is enabled" }, - "downloadAppleQqMultiPersonDisabled": "Simplified word-by-word formatting", + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person word-by-word is disabled" }, @@ -3890,23 +3890,23 @@ "@downloadMusixmatchLanguage": { "description": "Setting title for Musixmatch language preference" }, - "downloadMusixmatchLanguageAuto": "Auto (original)", + "downloadMusixmatchLanguageAuto": "Auto (original language)", "@downloadMusixmatchLanguageAuto": { "description": "Option label when Musixmatch uses original language" }, - "downloadFilterContributing": "Filter contributing artists in Album Artist", + "downloadFilterContributing": "Filter Contributing Artists", "@downloadFilterContributing": { "description": "Toggle title for filtering contributing artists in Album Artist metadata" }, - "downloadFilterContributingEnabled": "Album Artist metadata uses primary artist only", + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is enabled" }, - "downloadFilterContributingDisabled": "Keep full Album Artist metadata value", + "downloadFilterContributingDisabled": "Full Album Artist string used", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is disabled" }, - "downloadProvidersNoneEnabled": "None enabled", + "downloadProvidersNoneEnabled": "No providers enabled", "@downloadProvidersNoneEnabled": { "description": "Subtitle for lyrics providers setting when no providers are enabled" }, @@ -3914,11 +3914,11 @@ "@downloadMusixmatchLanguageCode": { "description": "Label for the Musixmatch language code text field" }, - "downloadMusixmatchLanguageHint": "auto / en / es / ja", + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Hint text for the Musixmatch language code field" }, - "downloadMusixmatchLanguageDesc": "Set preferred language code (example: en, es, ja). Leave empty for auto.", + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in the Musixmatch language picker" }, @@ -3926,15 +3926,15 @@ "@downloadMusixmatchAuto": { "description": "Button to reset Musixmatch language to automatic" }, - "downloadNetworkAnySubtitle": "WiFi + Mobile Data", + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", "@downloadNetworkAnySubtitle": { "description": "Subtitle for 'Any' network mode option" }, - "downloadNetworkWifiOnlySubtitle": "Pause downloads on mobile data", + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for 'WiFi only' network mode option" }, - "downloadSongLinkRegionDesc": "Used as userCountry for SongLink API lookup.", + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", "@downloadSongLinkRegionDesc": { "description": "Description in the SongLink region picker" }, @@ -4200,7 +4200,7 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Re-analyzing audio...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, @@ -4382,7 +4382,7 @@ "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count} tracks downloaded successfully", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -4581,5 +4581,978 @@ "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" + }, + "homeEmptyTitle": "No search providers yet", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Install an extension to continue.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import CSV", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Search tracks...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Search for tracks", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "Starting...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BETA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } } -} \ No newline at end of file +} diff --git a/lib/l10n/arb/app_nl.arb b/lib/l10n/arb/app_nl.arb index 9d6bbd6f..a7283d69 100644 --- a/lib/l10n/arb/app_nl.arb +++ b/lib/l10n/arb/app_nl.arb @@ -1,6 +1,6 @@ { "@@locale": "nl", - "@@last_modified": "2026-01-16", + "@@last_modified": "2026-04-28", "appName": "SpotiFLAC Mobile", "@appName": { "description": "App name - DO NOT TRANSLATE" @@ -145,7 +145,7 @@ "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Service used when searching by track name.", + "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, @@ -202,7 +202,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Embed synced lyrics into FLAC files", + "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -258,7 +258,7 @@ "@optionsConcurrentSequential": { "description": "Download one at a time" }, - "optionsConcurrentParallel": "", + "optionsConcurrentParallel": "{count} parallel downloads", "@optionsConcurrentParallel": { "description": "Multiple parallel downloads", "placeholders": { @@ -406,7 +406,7 @@ "@aboutContributors": { "description": "Section for contributors" }, - "aboutMobileDeveloper": "", + "aboutMobileDeveloper": "Mobile version developer", "@aboutMobileDeveloper": { "description": "Role description for mobile dev" }, @@ -1441,11 +1441,11 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Service, quality, filename format", + "settingsDownloadSubtitle": "Service, quality, fallback", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, lyrics, cover art, updates", + "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", "@settingsOptionsSubtitle": { "description": "Options settings description" }, @@ -3134,7 +3134,7 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to MP3, Opus, ALAC, or FLAC", + "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", "@trackConvertFormatSubtitle": { "description": "Subtitle for convert format menu item" }, @@ -3584,15 +3584,15 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Artist folders use Album Artist when available", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when Album Artist is used for folder naming" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Artist folders use Track Artist only", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when Track Artist is used for folder naming" }, - "lyricsProvidersTitle": "Lyrics Providers", + "lyricsProvidersTitle": "Lyrics Provider Priority", "@lyricsProvidersTitle": { "description": "Title for the lyrics provider priority page" }, @@ -3674,11 +3674,11 @@ "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Donate", + "settingsDonate": "Support Development", "@settingsDonate": { "description": "Settings menu item - donate" }, - "settingsDonateSubtitle": "Support SpotiFLAC-Mobile development", + "settingsDonateSubtitle": "Buy the developer a coffee", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, @@ -3766,27 +3766,27 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose storage mode for downloaded files.", + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", "@downloadLocationSubtitle": { "description": "Subtitle text in Android download location bottom sheet" }, - "storageModeAppFolder": "App folder (non-SAF)", + "storageModeAppFolder": "App Folder (Recommended)", "@storageModeAppFolder": { "description": "Storage mode option - use legacy app folder" }, - "storageModeAppFolderSubtitle": "Use default Music/SpotiFLAC path", + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "SAF folder", + "storageModeSaf": "Custom Folder (SAF)", "@storageModeSaf": { "description": "Storage mode option - use Android SAF picker" }, - "storageModeSafSubtitle": "Pick folder via Android Storage Access Framework", + "storageModeSafSubtitle": "Pick any folder, including SD card", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFilenameDescription": "Customize how your files are named.", + "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description text in filename format bottom sheet" }, @@ -3794,11 +3794,11 @@ "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Albums/ and Singles/ folders", + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is enabled" }, - "downloadSeparateSinglesDisabled": "All files in same structure", + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is disabled" }, @@ -3806,19 +3806,19 @@ "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Create playlist source folder", + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", "@downloadCreatePlaylistSourceFolder": { "description": "Setting title for adding a playlist folder prefix before the normal organization structure" }, - "downloadCreatePlaylistSourceFolderEnabled": "Playlist downloads use Playlist/ plus your normal folder structure.", + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist source folder prefix is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "Playlist downloads use the normal folder structure only.", + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist source folder prefix is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "By Playlist already places downloads inside a playlist folder.", + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when playlist folder prefix setting is redundant because folder organization is already by playlist" }, @@ -3826,27 +3826,27 @@ "@downloadSongLinkRegion": { "description": "Setting title for SongLink country region" }, - "downloadNetworkCompatibilityMode": "Network compatibility mode", + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", "@downloadNetworkCompatibilityMode": { "description": "Setting title for network compatibility toggle" }, - "downloadNetworkCompatibilityModeEnabled": "Enabled: try HTTP + accept invalid TLS certificates (unsafe)", + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is enabled" }, - "downloadNetworkCompatibilityModeDisabled": "Off: strict HTTPS certificate validation (recommended)", + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is disabled" }, - "downloadSelectServiceToEnable": "Select a built-in service to enable", + "downloadSelectServiceToEnable": "Select Tidal or Qobuz to enable this option", "@downloadSelectServiceToEnable": { "description": "Hint shown instead of Ask-quality subtitle when no built-in service selected" }, - "downloadSelectTidalQobuz": "Select Tidal or Qobuz above to configure quality", + "downloadSelectTidalQobuz": "Select Tidal or Qobuz to choose audio quality", "@downloadSelectTidalQobuz": { "description": "Info hint when non-Tidal/Qobuz service is selected" }, - "downloadEmbedLyricsDisabled": "Disabled while Embed Metadata is turned off", + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle for Embed Lyrics when Embed Metadata is disabled" }, @@ -3854,11 +3854,11 @@ "@downloadNeteaseIncludeTranslation": { "description": "Toggle title for including Netease translated lyrics" }, - "downloadNeteaseIncludeTranslationEnabled": "Append translated lyrics when available", + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is enabled" }, - "downloadNeteaseIncludeTranslationDisabled": "Use original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is disabled" }, @@ -3866,23 +3866,23 @@ "@downloadNeteaseIncludeRomanization": { "description": "Toggle title for including Netease romanized lyrics" }, - "downloadNeteaseIncludeRomanizationEnabled": "Append romanized lyrics when available", + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is enabled" }, - "downloadNeteaseIncludeRomanizationDisabled": "Disabled", + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is disabled" }, - "downloadAppleQqMultiPerson": "Apple/QQ Multi-Person Word-by-Word", + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", "@downloadAppleQqMultiPerson": { "description": "Toggle title for Apple/QQ multi-person word-by-word lyrics" }, - "downloadAppleQqMultiPersonEnabled": "Enable v1/v2 speaker and [bg:] tags", + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person word-by-word is enabled" }, - "downloadAppleQqMultiPersonDisabled": "Simplified word-by-word formatting", + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person word-by-word is disabled" }, @@ -3890,23 +3890,23 @@ "@downloadMusixmatchLanguage": { "description": "Setting title for Musixmatch language preference" }, - "downloadMusixmatchLanguageAuto": "Auto (original)", + "downloadMusixmatchLanguageAuto": "Auto (original language)", "@downloadMusixmatchLanguageAuto": { "description": "Option label when Musixmatch uses original language" }, - "downloadFilterContributing": "Filter contributing artists in Album Artist", + "downloadFilterContributing": "Filter Contributing Artists", "@downloadFilterContributing": { "description": "Toggle title for filtering contributing artists in Album Artist metadata" }, - "downloadFilterContributingEnabled": "Album Artist metadata uses primary artist only", + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is enabled" }, - "downloadFilterContributingDisabled": "Keep full Album Artist metadata value", + "downloadFilterContributingDisabled": "Full Album Artist string used", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is disabled" }, - "downloadProvidersNoneEnabled": "None enabled", + "downloadProvidersNoneEnabled": "No providers enabled", "@downloadProvidersNoneEnabled": { "description": "Subtitle for lyrics providers setting when no providers are enabled" }, @@ -3914,11 +3914,11 @@ "@downloadMusixmatchLanguageCode": { "description": "Label for the Musixmatch language code text field" }, - "downloadMusixmatchLanguageHint": "auto / en / es / ja", + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Hint text for the Musixmatch language code field" }, - "downloadMusixmatchLanguageDesc": "Set preferred language code (example: en, es, ja). Leave empty for auto.", + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in the Musixmatch language picker" }, @@ -3926,15 +3926,15 @@ "@downloadMusixmatchAuto": { "description": "Button to reset Musixmatch language to automatic" }, - "downloadNetworkAnySubtitle": "WiFi + Mobile Data", + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", "@downloadNetworkAnySubtitle": { "description": "Subtitle for 'Any' network mode option" }, - "downloadNetworkWifiOnlySubtitle": "Pause downloads on mobile data", + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for 'WiFi only' network mode option" }, - "downloadSongLinkRegionDesc": "Used as userCountry for SongLink API lookup.", + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", "@downloadSongLinkRegionDesc": { "description": "Description in the SongLink region picker" }, @@ -4200,7 +4200,7 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Re-analyzing audio...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, @@ -4382,7 +4382,7 @@ "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count} tracks downloaded successfully", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -4581,5 +4581,978 @@ "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" + }, + "homeEmptyTitle": "No search providers yet", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Install an extension to continue.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import CSV", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Search tracks...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Search for tracks", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "Starting...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BETA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } } -} \ No newline at end of file +} diff --git a/lib/l10n/arb/app_pt_PT.arb b/lib/l10n/arb/app_pt_PT.arb index 66389668..4e8a55a8 100644 --- a/lib/l10n/arb/app_pt_PT.arb +++ b/lib/l10n/arb/app_pt_PT.arb @@ -1,6 +1,6 @@ { "@@locale": "pt_PT", - "@@last_modified": "2026-01-16", + "@@last_modified": "2026-04-28", "appName": "SpotiFLAC Mobile", "@appName": { "description": "App name - DO NOT TRANSLATE" @@ -145,7 +145,7 @@ "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Serviço usado ao pesquisar por nome da faixa.", + "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, @@ -202,7 +202,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Incorporar letras sincronizadas aos arquivos FLAC", + "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -780,7 +780,7 @@ "@dialogDeleteSelectedTitle": { "description": "Dialog title - delete selected items" }, - "dialogDeleteSelectedMessage": "Apagar {count} {count, plural, =1{faixa} other{faixas}} do histórico?\n\nIsso também apagará os arquivos do armazenamento.", + "dialogDeleteSelectedMessage": "Apagar {count} {count, plural, one {}=1{faixa} other{faixas}} do histórico?\n\nIsso também apagará os arquivos do armazenamento.", "@dialogDeleteSelectedMessage": { "description": "Dialog message - delete selected tracks", "placeholders": { @@ -859,7 +859,7 @@ "@snackbarCredentialsCleared": { "description": "Snackbar - Spotify credentials removed" }, - "snackbarDeletedTracks": "{count} {count, plural, =1{faixa apagada} other{faixas apagadas}}", + "snackbarDeletedTracks": "{count} {count, plural, one {}=1{faixa apagada} other{faixas apagadas}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", "placeholders": { @@ -1441,11 +1441,11 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Serviço, qualidade, formato de nome de arquivo", + "settingsDownloadSubtitle": "Service, quality, fallback", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, letras, arte de capa, atualizações", + "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", "@settingsOptionsSubtitle": { "description": "Options settings description" }, @@ -1474,7 +1474,7 @@ } } }, - "tracksCount": "{count, plural, =1{1 faixa} other{{count} faixas}}", + "tracksCount": "{count, plural, one {}=1{1 faixa} other{{count} faixas}}", "@tracksCount": { "description": "Track count display", "placeholders": { @@ -2117,7 +2117,7 @@ "@downloadedAlbumDeleteSelected": { "description": "Button - delete selected tracks" }, - "downloadedAlbumDeleteMessage": "Excluir {count} {count, plural, =1{faixa} other{faixas}} deste álbum?\n\nIsso também excluirá os arquivos do armazenamento.", + "downloadedAlbumDeleteMessage": "Excluir {count} {count, plural, one {}=1{faixa} other{faixas}} deste álbum?\n\nIsso também excluirá os arquivos do armazenamento.", "@downloadedAlbumDeleteMessage": { "description": "Delete confirmation with count", "placeholders": { @@ -2143,7 +2143,7 @@ "@downloadedAlbumTapToSelect": { "description": "Selection hint" }, - "downloadedAlbumDeleteCount": "Apagar {count} {count, plural, =1{faixa} other{faixas}}", + "downloadedAlbumDeleteCount": "Apagar {count} {count, plural, one {}=1{faixa} other{faixas}}", "@downloadedAlbumDeleteCount": { "description": "Delete button text with count", "placeholders": { @@ -3134,7 +3134,7 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to MP3, Opus, ALAC, or FLAC", + "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", "@trackConvertFormatSubtitle": { "description": "Subtitle for convert format menu item" }, @@ -3584,15 +3584,15 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Artist folders use Album Artist when available", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when Album Artist is used for folder naming" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Artist folders use Track Artist only", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when Track Artist is used for folder naming" }, - "lyricsProvidersTitle": "Lyrics Providers", + "lyricsProvidersTitle": "Lyrics Provider Priority", "@lyricsProvidersTitle": { "description": "Title for the lyrics provider priority page" }, @@ -3674,11 +3674,11 @@ "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Donate", + "settingsDonate": "Support Development", "@settingsDonate": { "description": "Settings menu item - donate" }, - "settingsDonateSubtitle": "Support SpotiFLAC-Mobile development", + "settingsDonateSubtitle": "Buy the developer a coffee", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, @@ -3766,27 +3766,27 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose storage mode for downloaded files.", + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", "@downloadLocationSubtitle": { "description": "Subtitle text in Android download location bottom sheet" }, - "storageModeAppFolder": "App folder (non-SAF)", + "storageModeAppFolder": "App Folder (Recommended)", "@storageModeAppFolder": { "description": "Storage mode option - use legacy app folder" }, - "storageModeAppFolderSubtitle": "Use default Music/SpotiFLAC path", + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "SAF folder", + "storageModeSaf": "Custom Folder (SAF)", "@storageModeSaf": { "description": "Storage mode option - use Android SAF picker" }, - "storageModeSafSubtitle": "Pick folder via Android Storage Access Framework", + "storageModeSafSubtitle": "Pick any folder, including SD card", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFilenameDescription": "Customize how your files are named.", + "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description text in filename format bottom sheet" }, @@ -3794,11 +3794,11 @@ "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Albums/ and Singles/ folders", + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is enabled" }, - "downloadSeparateSinglesDisabled": "All files in same structure", + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is disabled" }, @@ -3806,19 +3806,19 @@ "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Create playlist source folder", + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", "@downloadCreatePlaylistSourceFolder": { "description": "Setting title for adding a playlist folder prefix before the normal organization structure" }, - "downloadCreatePlaylistSourceFolderEnabled": "Playlist downloads use Playlist/ plus your normal folder structure.", + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist source folder prefix is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "Playlist downloads use the normal folder structure only.", + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist source folder prefix is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "By Playlist already places downloads inside a playlist folder.", + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when playlist folder prefix setting is redundant because folder organization is already by playlist" }, @@ -3826,27 +3826,27 @@ "@downloadSongLinkRegion": { "description": "Setting title for SongLink country region" }, - "downloadNetworkCompatibilityMode": "Network compatibility mode", + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", "@downloadNetworkCompatibilityMode": { "description": "Setting title for network compatibility toggle" }, - "downloadNetworkCompatibilityModeEnabled": "Enabled: try HTTP + accept invalid TLS certificates (unsafe)", + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is enabled" }, - "downloadNetworkCompatibilityModeDisabled": "Off: strict HTTPS certificate validation (recommended)", + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is disabled" }, - "downloadSelectServiceToEnable": "Select a built-in service to enable", + "downloadSelectServiceToEnable": "Select Tidal or Qobuz to enable this option", "@downloadSelectServiceToEnable": { "description": "Hint shown instead of Ask-quality subtitle when no built-in service selected" }, - "downloadSelectTidalQobuz": "Select Tidal or Qobuz above to configure quality", + "downloadSelectTidalQobuz": "Select Tidal or Qobuz to choose audio quality", "@downloadSelectTidalQobuz": { "description": "Info hint when non-Tidal/Qobuz service is selected" }, - "downloadEmbedLyricsDisabled": "Disabled while Embed Metadata is turned off", + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle for Embed Lyrics when Embed Metadata is disabled" }, @@ -3854,11 +3854,11 @@ "@downloadNeteaseIncludeTranslation": { "description": "Toggle title for including Netease translated lyrics" }, - "downloadNeteaseIncludeTranslationEnabled": "Append translated lyrics when available", + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is enabled" }, - "downloadNeteaseIncludeTranslationDisabled": "Use original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is disabled" }, @@ -3866,23 +3866,23 @@ "@downloadNeteaseIncludeRomanization": { "description": "Toggle title for including Netease romanized lyrics" }, - "downloadNeteaseIncludeRomanizationEnabled": "Append romanized lyrics when available", + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is enabled" }, - "downloadNeteaseIncludeRomanizationDisabled": "Disabled", + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is disabled" }, - "downloadAppleQqMultiPerson": "Apple/QQ Multi-Person Word-by-Word", + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", "@downloadAppleQqMultiPerson": { "description": "Toggle title for Apple/QQ multi-person word-by-word lyrics" }, - "downloadAppleQqMultiPersonEnabled": "Enable v1/v2 speaker and [bg:] tags", + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person word-by-word is enabled" }, - "downloadAppleQqMultiPersonDisabled": "Simplified word-by-word formatting", + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person word-by-word is disabled" }, @@ -3890,23 +3890,23 @@ "@downloadMusixmatchLanguage": { "description": "Setting title for Musixmatch language preference" }, - "downloadMusixmatchLanguageAuto": "Auto (original)", + "downloadMusixmatchLanguageAuto": "Auto (original language)", "@downloadMusixmatchLanguageAuto": { "description": "Option label when Musixmatch uses original language" }, - "downloadFilterContributing": "Filter contributing artists in Album Artist", + "downloadFilterContributing": "Filter Contributing Artists", "@downloadFilterContributing": { "description": "Toggle title for filtering contributing artists in Album Artist metadata" }, - "downloadFilterContributingEnabled": "Album Artist metadata uses primary artist only", + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is enabled" }, - "downloadFilterContributingDisabled": "Keep full Album Artist metadata value", + "downloadFilterContributingDisabled": "Full Album Artist string used", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is disabled" }, - "downloadProvidersNoneEnabled": "None enabled", + "downloadProvidersNoneEnabled": "No providers enabled", "@downloadProvidersNoneEnabled": { "description": "Subtitle for lyrics providers setting when no providers are enabled" }, @@ -3914,11 +3914,11 @@ "@downloadMusixmatchLanguageCode": { "description": "Label for the Musixmatch language code text field" }, - "downloadMusixmatchLanguageHint": "auto / en / es / ja", + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Hint text for the Musixmatch language code field" }, - "downloadMusixmatchLanguageDesc": "Set preferred language code (example: en, es, ja). Leave empty for auto.", + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in the Musixmatch language picker" }, @@ -3926,15 +3926,15 @@ "@downloadMusixmatchAuto": { "description": "Button to reset Musixmatch language to automatic" }, - "downloadNetworkAnySubtitle": "WiFi + Mobile Data", + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", "@downloadNetworkAnySubtitle": { "description": "Subtitle for 'Any' network mode option" }, - "downloadNetworkWifiOnlySubtitle": "Pause downloads on mobile data", + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for 'WiFi only' network mode option" }, - "downloadSongLinkRegionDesc": "Used as userCountry for SongLink API lookup.", + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", "@downloadSongLinkRegionDesc": { "description": "Description in the SongLink region picker" }, @@ -4200,7 +4200,7 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Re-analyzing audio...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, @@ -4382,7 +4382,7 @@ "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count} tracks downloaded successfully", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -4581,5 +4581,978 @@ "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" + }, + "homeEmptyTitle": "No search providers yet", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Install an extension to continue.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import CSV", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Search tracks...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Search for tracks", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "Starting...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BETA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } } } diff --git a/lib/l10n/arb/app_ru.arb b/lib/l10n/arb/app_ru.arb index 4ee018bc..e3b5e564 100644 --- a/lib/l10n/arb/app_ru.arb +++ b/lib/l10n/arb/app_ru.arb @@ -1,7 +1,7 @@ { "@@locale": "ru", - "@@last_modified": "2026-01-16", - "appName": "SpotiFLAC Mobile", + "@@last_modified": "2026-04-28", + "appName": "Spotify", "@appName": { "description": "App name - DO NOT TRANSLATE" }, @@ -17,7 +17,7 @@ "@navSettings": { "description": "Bottom navigation - Settings tab" }, - "navStore": "Repo", + "navStore": "Репозиторий", "@navStore": { "description": "Bottom navigation - Extension store tab" }, @@ -25,7 +25,7 @@ "@homeTitle": { "description": "Home screen title" }, - "homeSubtitle": "Paste a supported URL or search by name", + "homeSubtitle": "Вставьте URL или ищите по названию", "@homeSubtitle": { "description": "Subtitle shown below search box" }, @@ -89,11 +89,11 @@ "@downloadFilenameFormat": { "description": "Setting for output filename pattern" }, - "downloadSingleFilenameFormat": "Single Filename Format", + "downloadSingleFilenameFormat": "Формат имени файла", "@downloadSingleFilenameFormat": { "description": "Setting for output filename pattern for singles/EPs" }, - "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", + "downloadSingleFilenameFormatDescription": "Формат имени файла для синглов и EP. Используются те же теги, что и для альбомов.", "@downloadSingleFilenameFormatDescription": { "description": "Subtitle description for single filename format setting" }, @@ -145,7 +145,7 @@ "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Сервис, используемый при поиске по названию трека.", + "optionsPrimaryProviderSubtitle": "Сервис для поиска по названию трека или альбома", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, @@ -158,7 +158,7 @@ } } }, - "optionsDefaultSearchTab": "Default Search Tab", + "optionsDefaultSearchTab": "Вкладка поиска по умолчанию", "@optionsDefaultSearchTab": { "description": "Title for the preferred default search tab setting" }, @@ -166,11 +166,11 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsDefaultSearchTabAlbums": "Albums", + "optionsDefaultSearchTabAlbums": "Альбомы", "@optionsDefaultSearchTabAlbums": { "description": "Default search tab option - Albums tab" }, - "optionsDefaultSearchTabTracks": "Tracks", + "optionsDefaultSearchTabTracks": "Треки", "@optionsDefaultSearchTabTracks": { "description": "Default search tab option - Tracks tab" }, @@ -202,7 +202,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Вписать синхронизированные тексты во FLAC файлы", + "optionsEmbedLyricsSubtitle": "Сохранять синхронизированный текст песни рядом с загруженным треком", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -271,7 +271,7 @@ "@optionsConcurrentWarning": { "description": "Warning about rate limits" }, - "optionsExtensionStore": "Extension Repo", + "optionsExtensionStore": "Репозиторий расширения", "@optionsExtensionStore": { "description": "Show/hide store tab" }, @@ -378,7 +378,7 @@ "@extensionsUninstall": { "description": "Uninstall extension button" }, - "storeTitle": "Extension Repo", + "storeTitle": "Репозиторий расширения", "@storeTitle": { "description": "Store screen title" }, @@ -719,7 +719,7 @@ "@dialogImport": { "description": "Dialog button - import data" }, - "dialogDownload": "Download", + "dialogDownload": "Скачать", "@dialogDownload": { "description": "Confirm button in Download All dialog" }, @@ -780,7 +780,7 @@ "@dialogDeleteSelectedTitle": { "description": "Dialog title - delete selected items" }, - "dialogDeleteSelectedMessage": "Удалить {count} {count, plural, one {трек} few {трека} many {треков} other{треков}} из истории?\n\nЭто также удалит файлы из хранилища.", + "dialogDeleteSelectedMessage": "Удалить {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}} из истории?\n\nЭто также удалит файлы из хранилища.", "@dialogDeleteSelectedMessage": { "description": "Dialog message - delete selected tracks", "placeholders": { @@ -859,7 +859,7 @@ "@snackbarCredentialsCleared": { "description": "Snackbar - Spotify credentials removed" }, - "snackbarDeletedTracks": "Удалено {count} {count, plural, one {трек} few {трека} many {треков} other{треков}}", + "snackbarDeletedTracks": "Удалено {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", "placeholders": { @@ -1047,43 +1047,43 @@ "@searchPlaylists": { "description": "Search result category - playlists" }, - "searchSortTitle": "Sort Results", + "searchSortTitle": "Упорядочить результаты", "@searchSortTitle": { "description": "Bottom sheet title for search sort options" }, - "searchSortDefault": "Default", + "searchSortDefault": "По умолчанию", "@searchSortDefault": { "description": "Sort option - default API order" }, - "searchSortTitleAZ": "Title (A-Z)", + "searchSortTitleAZ": "Название (А-Я)", "@searchSortTitleAZ": { "description": "Sort option - title ascending" }, - "searchSortTitleZA": "Title (Z-A)", + "searchSortTitleZA": "Название (Я-А)", "@searchSortTitleZA": { "description": "Sort option - title descending" }, - "searchSortArtistAZ": "Artist (A-Z)", + "searchSortArtistAZ": "Исполнитель (А-Я)", "@searchSortArtistAZ": { "description": "Sort option - artist ascending" }, - "searchSortArtistZA": "Artist (Z-A)", + "searchSortArtistZA": "Исполнитель (Я-А)", "@searchSortArtistZA": { "description": "Sort option - artist descending" }, - "searchSortDurationShort": "Duration (Shortest)", + "searchSortDurationShort": "Продолжительность (наименьшая)", "@searchSortDurationShort": { "description": "Sort option - shortest duration first" }, - "searchSortDurationLong": "Duration (Longest)", + "searchSortDurationLong": "Продолжительность (наибольшая)", "@searchSortDurationLong": { "description": "Sort option - longest duration first" }, - "searchSortDateOldest": "Release Date (Oldest)", + "searchSortDateOldest": "Дата релиза (старейшая)", "@searchSortDateOldest": { "description": "Sort option - oldest release first" }, - "searchSortDateNewest": "Release Date (Newest)", + "searchSortDateNewest": "Дата релиза (новейшая)", "@searchSortDateNewest": { "description": "Sort option - newest release first" }, @@ -1207,7 +1207,7 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Extension Fallback", + "providerPriorityFallbackExtensionsTitle": "Резервное расширение", "@providerPriorityFallbackExtensionsTitle": { "description": "Section title for choosing which download extensions can be used as fallback providers" }, @@ -1329,7 +1329,7 @@ "@credentialsClientIdHint": { "description": "Client ID placeholder" }, - "credentialsClientSecret": "Client Secret", + "credentialsClientSecret": "Секретный код клиента", "@credentialsClientSecret": { "description": "Client Secret field label - DO NOT TRANSLATE" }, @@ -1441,11 +1441,11 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Сервисы, качество, формат имени файла", + "settingsDownloadSubtitle": "Service, quality, fallback", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Резерв. сервер, тексты песен, обложки, обновления", + "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", "@settingsOptionsSubtitle": { "description": "Options settings description" }, @@ -1474,7 +1474,7 @@ } } }, - "tracksCount": "{count, plural, one {{count} трек} few {{count} трека} many {{count} треков} other {{count} треков}}", + "tracksCount": "{count, plural, one {{count} трек} few {{count} трека} many {{count} треков} =1 {1 трек} other {{count} треков}}", "@tracksCount": { "description": "Track count display", "placeholders": { @@ -1698,15 +1698,15 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "e.g. https://github.com/user/extensions-repo", + "storeRepoUrlHelper": "например, https://github.com/user/extensions-repo", "@storeRepoUrlHelper": { "description": "Helper text below the repository URL input field" }, - "storeAddRepoButton": "Add Repository", + "storeAddRepoButton": "Добавить репозиторий", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" }, - "storeChangeRepoTooltip": "Change repository", + "storeChangeRepoTooltip": "Изменить репозиторий", "@storeChangeRepoTooltip": { "description": "Tooltip for the change-repository icon button in the app bar" }, @@ -1714,7 +1714,7 @@ "@storeRepoDialogTitle": { "description": "Title of the change/remove repository dialog" }, - "storeRepoDialogCurrent": "Current repository:", + "storeRepoDialogCurrent": "Текущий репозиторий:", "@storeRepoDialogCurrent": { "description": "Label shown above the current repository URL in the dialog" }, @@ -1730,11 +1730,11 @@ "@storeEmptyNoExtensions": { "description": "Message when store has no extensions" }, - "storeEmptyNoResults": "No extensions found", + "storeEmptyNoResults": "Расширения не найдены", "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Default (Deezer)", + "extensionDefaultProvider": "По умолчанию (Deezer)", "@extensionDefaultProvider": { "description": "Default search provider option" }, @@ -1941,15 +1941,15 @@ "@qualityHiResFlacMaxSubtitle": { "description": "Technical spec for hi-res max" }, - "downloadLossy320": "Lossy 320kbps", + "downloadLossy320": "С потерями 320 кбит/с", "@downloadLossy320": { "description": "Quality option label for Tidal lossy 320kbps" }, - "downloadLossyFormat": "Lossy Format", + "downloadLossyFormat": "Формат с потерями", "@downloadLossyFormat": { "description": "Setting title to pick output format for Tidal lossy downloads" }, - "downloadLossy320Format": "Lossy 320kbps Format", + "downloadLossy320Format": "Формат с потерями 320 кбит/с", "@downloadLossy320Format": { "description": "Title of the Tidal lossy format picker bottom sheet" }, @@ -1957,15 +1957,15 @@ "@downloadLossy320FormatDesc": { "description": "Description in the Tidal lossy format picker" }, - "downloadLossyMp3": "MP3 320kbps", + "downloadLossyMp3": "MP3 320 кбит/с", "@downloadLossyMp3": { "description": "Tidal lossy format option - MP3 320kbps" }, - "downloadLossyMp3Subtitle": "Best compatibility, ~10MB per track", + "downloadLossyMp3Subtitle": "Наилучшая совместимость, ~10 Мб на трек", "@downloadLossyMp3Subtitle": { "description": "Subtitle for MP3 320kbps Tidal lossy option" }, - "downloadLossyOpus256": "Opus 256kbps", + "downloadLossyOpus256": "Opus 256 кбит/с", "@downloadLossyOpus256": { "description": "Tidal lossy format option - Opus 256kbps" }, @@ -1973,11 +1973,11 @@ "@downloadLossyOpus256Subtitle": { "description": "Subtitle for Opus 256kbps Tidal lossy option" }, - "downloadLossyOpus128": "Opus 128kbps", + "downloadLossyOpus128": "Opus 128 кбит/с", "@downloadLossyOpus128": { "description": "Tidal lossy format option - Opus 128kbps" }, - "downloadLossyOpus128Subtitle": "Smallest size, ~4MB per track", + "downloadLossyOpus128Subtitle": "Минимальный размер, ~4 Мб на трек", "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps Tidal lossy option" }, @@ -2117,7 +2117,7 @@ "@downloadedAlbumDeleteSelected": { "description": "Button - delete selected tracks" }, - "downloadedAlbumDeleteMessage": "Удалить {count} {count, plural, one {трек} few {трека} many {треков} other{треков}} из этого альбома?\n\nЭто также удалит файлы из хранилища.", + "downloadedAlbumDeleteMessage": "Удалить {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}} из этого альбома?\n\nЭто также удалит файлы из хранилища.", "@downloadedAlbumDeleteMessage": { "description": "Delete confirmation with count", "placeholders": { @@ -2143,7 +2143,7 @@ "@downloadedAlbumTapToSelect": { "description": "Selection hint" }, - "downloadedAlbumDeleteCount": "Удалить {count} {count, plural, one {трек} few {трека} many {треков} other{треков}}", + "downloadedAlbumDeleteCount": "Удалить {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}}", "@downloadedAlbumDeleteCount": { "description": "Delete button text with count", "placeholders": { @@ -2394,7 +2394,7 @@ "@libraryShowDuplicateIndicatorSubtitle": { "description": "Subtitle for duplicate indicator toggle" }, - "libraryAutoScan": "Auto Scan", + "libraryAutoScan": "Автосканирование", "@libraryAutoScan": { "description": "Setting for automatic library scanning" }, @@ -2406,15 +2406,15 @@ "@libraryAutoScanOff": { "description": "Auto scan disabled" }, - "libraryAutoScanOnOpen": "Every app open", + "libraryAutoScanOnOpen": "Каждое открытие приложения", "@libraryAutoScanOnOpen": { "description": "Auto scan when app opens" }, - "libraryAutoScanDaily": "Daily", + "libraryAutoScanDaily": "Ежедневно", "@libraryAutoScanDaily": { "description": "Auto scan once per day" }, - "libraryAutoScanWeekly": "Weekly", + "libraryAutoScanWeekly": "Еженедельно", "@libraryAutoScanWeekly": { "description": "Auto scan once per week" }, @@ -2466,7 +2466,7 @@ "@libraryAboutDescription": { "description": "Description of local library feature" }, - "libraryTracksUnit": "{count, plural, one {трек} few {трека} many {треков} other{треков}}", + "libraryTracksUnit": "{count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}}", "@libraryTracksUnit": { "description": "Unit label for tracks count (without the number itself)", "placeholders": { @@ -2501,7 +2501,7 @@ "@libraryScanning": { "description": "Status during scan" }, - "libraryScanFinalizing": "Finalizing library...", + "libraryScanFinalizing": "Завершение работы с библиотекой...", "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, @@ -2594,7 +2594,7 @@ "@libraryFilterQualityCD": { "description": "Filter option - CD quality audio" }, - "libraryFilterQualityLossy": "Lossy", + "libraryFilterQualityLossy": "С потерями", "@libraryFilterQualityLossy": { "description": "Filter option - lossy compressed audio" }, @@ -2602,7 +2602,7 @@ "@libraryFilterFormat": { "description": "Filter section - file format" }, - "libraryFilterMetadata": "Metadata", + "libraryFilterMetadata": "Метаданные", "@libraryFilterMetadata": { "description": "Filter section - metadata completeness" }, @@ -2610,15 +2610,15 @@ "@libraryFilterMetadataComplete": { "description": "Filter option - items with complete metadata" }, - "libraryFilterMetadataMissingAny": "Missing any metadata", + "libraryFilterMetadataMissingAny": "Не хватает метаданных", "@libraryFilterMetadataMissingAny": { "description": "Filter option - items missing any tracked metadata field" }, - "libraryFilterMetadataMissingYear": "Missing year", + "libraryFilterMetadataMissingYear": "Отсутствует год", "@libraryFilterMetadataMissingYear": { "description": "Filter option - items missing release year/date" }, - "libraryFilterMetadataMissingGenre": "Missing genre", + "libraryFilterMetadataMissingGenre": "Отсутствует жанр", "@libraryFilterMetadataMissingGenre": { "description": "Filter option - items missing genre" }, @@ -2638,19 +2638,19 @@ "@libraryFilterSortOldest": { "description": "Sort option - oldest first" }, - "libraryFilterSortAlbumAsc": "Album (A-Z)", + "libraryFilterSortAlbumAsc": "Альбом (А-Я)", "@libraryFilterSortAlbumAsc": { "description": "Sort option - album ascending" }, - "libraryFilterSortAlbumDesc": "Album (Z-A)", + "libraryFilterSortAlbumDesc": "Альбом (Я-А)", "@libraryFilterSortAlbumDesc": { "description": "Sort option - album descending" }, - "libraryFilterSortGenreAsc": "Genre (A-Z)", + "libraryFilterSortGenreAsc": "Жанр (А-Я)", "@libraryFilterSortGenreAsc": { "description": "Sort option - genre ascending" }, - "libraryFilterSortGenreDesc": "Genre (Z-A)", + "libraryFilterSortGenreDesc": "Жанр (Я-А)", "@libraryFilterSortGenreDesc": { "description": "Sort option - genre descending" }, @@ -2658,7 +2658,7 @@ "@timeJustNow": { "description": "Relative time - less than a minute ago" }, - "timeMinutesAgo": "{count, plural, one {{count} минуту} few {{count} минуты} many {{count} минут} other {{count} минут}} назад", + "timeMinutesAgo": "{count, plural, one {{count} минуту} few {{count} минуты} many {{count} минут} =1 {1 минуту} other {{count} минут}} назад", "@timeMinutesAgo": { "description": "Relative time - minutes ago", "placeholders": { @@ -2667,7 +2667,7 @@ } } }, - "timeHoursAgo": "{count, plural, one {{count} час} few {{count} часа} many {{count} часов} other {{count} часов}} назад", + "timeHoursAgo": "{count, plural, one {{count} час} few {{count} часа} many {{count} часов} =1 {1 час} other {{count} часов}} назад", "@timeHoursAgo": { "description": "Relative time - hours ago", "placeholders": { @@ -3006,35 +3006,35 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Fields to update", + "trackReEnrichFieldsTitle": "Поля для обновления", "@trackReEnrichFieldsTitle": { "description": "Section title for field selection in re-enrich dialog" }, - "trackReEnrichFieldCover": "Cover Art", + "trackReEnrichFieldCover": "Обложка", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" }, - "trackReEnrichFieldLyrics": "Lyrics", + "trackReEnrichFieldLyrics": "Текст песни", "@trackReEnrichFieldLyrics": { "description": "Checkbox label for lyrics field in re-enrich" }, - "trackReEnrichFieldBasicTags": "Album, Album Artist", + "trackReEnrichFieldBasicTags": "Альбом, Исполнитель альбома", "@trackReEnrichFieldBasicTags": { "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" }, - "trackReEnrichFieldTrackInfo": "Track & Disc Number", + "trackReEnrichFieldTrackInfo": "Номер трека и диска", "@trackReEnrichFieldTrackInfo": { "description": "Checkbox label for track info in re-enrich" }, - "trackReEnrichFieldReleaseInfo": "Date & ISRC", + "trackReEnrichFieldReleaseInfo": "Дата и ISRC", "@trackReEnrichFieldReleaseInfo": { "description": "Checkbox label for release info in re-enrich" }, - "trackReEnrichFieldExtra": "Genre, Label, Copyright", + "trackReEnrichFieldExtra": "Жанр, Название, Авторские права", "@trackReEnrichFieldExtra": { "description": "Checkbox label for extra metadata in re-enrich" }, - "trackReEnrichSelectAll": "Select All", + "trackReEnrichSelectAll": "Выбрать всё", "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, @@ -3080,7 +3080,7 @@ "@trackReEnrichFfmpegFailed": { "description": "Snackbar when FFmpeg embed fails for MP3/Opus" }, - "queueFlacAction": "Queue FLAC", + "queueFlacAction": "Очередь FLAC", "@queueFlacAction": { "description": "Action/button label for queueing FLAC redownloads for local tracks" }, @@ -3093,7 +3093,7 @@ } } }, - "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", + "queueFlacFindingProgress": "Поиск совпадений FLAC... ({current}/{total})", "@queueFlacFindingProgress": { "description": "Snackbar while resolving remote matches for local FLAC redownloads", "placeholders": { @@ -3134,7 +3134,7 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to MP3, Opus, ALAC, or FLAC", + "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", "@trackConvertFormatSubtitle": { "description": "Subtitle for convert format menu item" }, @@ -3181,7 +3181,7 @@ } } }, - "trackConvertLosslessHint": "Lossless conversion — no quality loss", + "trackConvertLosslessHint": "Конвертация без потери качества", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" }, @@ -3326,7 +3326,7 @@ "@collectionNoPlaylistsSubtitle": { "description": "Empty state subtitle when user has no playlists" }, - "collectionPlaylistTracks": "{count, plural, one {{count} трек} few {{count} трека} many {{count} треков} other {{count} треков}}", + "collectionPlaylistTracks": "{count, plural, one {{count} трек} few {{count} трека} many {{count} треков} =1 {1 трек} other {{count} треков}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", "placeholders": { @@ -3491,7 +3491,7 @@ "@collectionPlaylistRemoveCover": { "description": "Bottom sheet action to remove custom cover image from a playlist" }, - "selectionShareCount": "Отправить {count} {count, plural, one {трек} few {трека} many {треков} other{треков}}", + "selectionShareCount": "Отправить {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}}", "@selectionShareCount": { "description": "Share button text with count in selection mode", "placeholders": { @@ -3504,7 +3504,7 @@ "@selectionShareNoFiles": { "description": "Snackbar when no selected files exist on disk" }, - "selectionConvertCount": "Конвертировать {count} {count, plural, one {трек} few {трека} many {треков} other{треков}}", + "selectionConvertCount": "Конвертировать {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}}", "@selectionConvertCount": { "description": "Convert button text with count in selection mode", "placeholders": { @@ -3536,7 +3536,7 @@ } } }, - "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", + "selectionBatchConvertConfirmMessageLossless": "Конвертировать {count} {count, plural, =1{track} other{tracks}} в {format}? (Без потери качества)\n\nОригинальные файлы будут удалены после конвертации.", "@selectionBatchConvertConfirmMessageLossless": { "description": "Confirmation dialog message for lossless batch conversion", "placeholders": { @@ -3584,19 +3584,19 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Для папок исполнителей используется исполнитель альбома, если он указан", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Папка названная в честь тега Альбома Артиста", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when Album Artist is used for folder naming" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Папки исполнителя используют только трек исполнителя", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Папка названная в честь тега Трека Артиста", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when Track Artist is used for folder naming" }, - "lyricsProvidersTitle": "Lyrics Providers", + "lyricsProvidersTitle": "Приоритет к поставщику текста песни", "@lyricsProvidersTitle": { "description": "Title for the lyrics provider priority page" }, - "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", + "lyricsProvidersDescription": "Включайте, выключайте, переупорядочивайте источники текстов. Поставщики связаны сверху вниз пока проводится поиск текста.", "@lyricsProvidersDescription": { "description": "Description on the lyrics provider priority page" }, @@ -3604,7 +3604,7 @@ "@lyricsProvidersInfoText": { "description": "Info tip on lyrics provider priority page" }, - "lyricsProvidersEnabledSection": "Enabled ({count})", + "lyricsProvidersEnabledSection": "Включено ({count})", "@lyricsProvidersEnabledSection": { "description": "Section header for enabled providers", "placeholders": { @@ -3613,7 +3613,7 @@ } } }, - "lyricsProvidersDisabledSection": "Disabled ({count})", + "lyricsProvidersDisabledSection": "Выключено ({count})", "@lyricsProvidersDisabledSection": { "description": "Section header for disabled providers", "placeholders": { @@ -3630,7 +3630,7 @@ "@lyricsProvidersSaved": { "description": "Snackbar after saving lyrics provider priority" }, - "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", + "lyricsProvidersDiscardContent": "У вас есть несохранённые изменения, которые будут потеряны.", "@lyricsProvidersDiscardContent": { "description": "Body text of the discard-changes dialog on lyrics provider page" }, @@ -3638,7 +3638,7 @@ "@lyricsProviderLrclibDesc": { "description": "Description for LRCLIB provider" }, - "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", + "lyricsProviderNeteaseDesc": "NetEase Cloud Music (хорош для азиатских песен)", "@lyricsProviderNeteaseDesc": { "description": "Description for Netease provider" }, @@ -3650,11 +3650,11 @@ "@lyricsProviderAppleMusicDesc": { "description": "Description for Apple Music provider" }, - "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", + "lyricsProviderQqMusicDesc": "QQ Музыка (хорошо подходит для китайских песен, через прокси)", "@lyricsProviderQqMusicDesc": { "description": "Description for QQ Music provider" }, - "lyricsProviderExtensionDesc": "Extension provider", + "lyricsProviderExtensionDesc": "Поставщик расширений", "@lyricsProviderExtensionDesc": { "description": "Generic description for extension-based lyrics providers" }, @@ -3674,11 +3674,11 @@ "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Donate", + "settingsDonate": "Support Development", "@settingsDonate": { "description": "Settings menu item - donate" }, - "settingsDonateSubtitle": "Support SpotiFLAC-Mobile development", + "settingsDonateSubtitle": "Buy the developer a coffee", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, @@ -3686,7 +3686,7 @@ "@tooltipLoveAll": { "description": "Tooltip for the Love All button on album/playlist screens" }, - "tooltipAddToPlaylist": "Add to Playlist", + "tooltipAddToPlaylist": "Добавить в плейлист", "@tooltipAddToPlaylist": { "description": "Tooltip for the Add to Playlist button" }, @@ -3708,7 +3708,7 @@ } } }, - "dialogDownloadAllTitle": "Download All", + "dialogDownloadAllTitle": "Скачать всё", "@dialogDownloadAllTitle": { "description": "Dialog title for bulk download confirmation" }, @@ -3725,7 +3725,7 @@ "@homeSkipAlreadyDownloaded": { "description": "Checkbox label in import dialog to skip already-downloaded songs" }, - "homeGoToAlbum": "Go to Album", + "homeGoToAlbum": "Перейти к альбому", "@homeGoToAlbum": { "description": "Context menu item to navigate to the album page" }, @@ -3733,11 +3733,11 @@ "@homeAlbumInfoUnavailable": { "description": "Snackbar when album info cannot be loaded" }, - "snackbarLoadingCueSheet": "Loading CUE sheet...", + "snackbarLoadingCueSheet": "Загрузка CUE разметки...", "@snackbarLoadingCueSheet": { "description": "Snackbar while loading a CUE sheet file" }, - "snackbarMetadataSaved": "Metadata saved successfully", + "snackbarMetadataSaved": "Метаданные успешно сохранены", "@snackbarMetadataSaved": { "description": "Snackbar after successfully saving track metadata" }, @@ -3749,7 +3749,7 @@ "@snackbarFailedToWriteStorage": { "description": "Snackbar when writing metadata back to file fails" }, - "snackbarError": "Error: {error}", + "snackbarError": "Ошибка: {error}", "@snackbarError": { "description": "Generic error snackbar with error detail", "placeholders": { @@ -3766,39 +3766,39 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose storage mode for downloaded files.", + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", "@downloadLocationSubtitle": { "description": "Subtitle text in Android download location bottom sheet" }, - "storageModeAppFolder": "App folder (non-SAF)", + "storageModeAppFolder": "App Folder (Recommended)", "@storageModeAppFolder": { "description": "Storage mode option - use legacy app folder" }, - "storageModeAppFolderSubtitle": "Use default Music/SpotiFLAC path", + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "SAF folder", + "storageModeSaf": "Custom Folder (SAF)", "@storageModeSaf": { "description": "Storage mode option - use Android SAF picker" }, - "storageModeSafSubtitle": "Pick folder via Android Storage Access Framework", + "storageModeSafSubtitle": "Pick any folder, including SD card", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFilenameDescription": "Customize how your files are named.", + "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description text in filename format bottom sheet" }, - "downloadFilenameInsertTag": "Tap to insert tag:", + "downloadFilenameInsertTag": "Нажмите для вставки тега:", "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Albums/ and Singles/ folders", + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is enabled" }, - "downloadSeparateSinglesDisabled": "All files in same structure", + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is disabled" }, @@ -3806,59 +3806,59 @@ "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Create playlist source folder", + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", "@downloadCreatePlaylistSourceFolder": { "description": "Setting title for adding a playlist folder prefix before the normal organization structure" }, - "downloadCreatePlaylistSourceFolderEnabled": "Playlist downloads use Playlist/ plus your normal folder structure.", + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist source folder prefix is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "Playlist downloads use the normal folder structure only.", + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist source folder prefix is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "By Playlist already places downloads inside a playlist folder.", + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when playlist folder prefix setting is redundant because folder organization is already by playlist" }, - "downloadSongLinkRegion": "SongLink Region", + "downloadSongLinkRegion": "Регион SongLink", "@downloadSongLinkRegion": { "description": "Setting title for SongLink country region" }, - "downloadNetworkCompatibilityMode": "Network compatibility mode", + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", "@downloadNetworkCompatibilityMode": { "description": "Setting title for network compatibility toggle" }, - "downloadNetworkCompatibilityModeEnabled": "Enabled: try HTTP + accept invalid TLS certificates (unsafe)", + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is enabled" }, - "downloadNetworkCompatibilityModeDisabled": "Off: strict HTTPS certificate validation (recommended)", + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is disabled" }, - "downloadSelectServiceToEnable": "Select a built-in service to enable", + "downloadSelectServiceToEnable": "Select Tidal or Qobuz to enable this option", "@downloadSelectServiceToEnable": { "description": "Hint shown instead of Ask-quality subtitle when no built-in service selected" }, - "downloadSelectTidalQobuz": "Select Tidal or Qobuz above to configure quality", + "downloadSelectTidalQobuz": "Select Tidal or Qobuz to choose audio quality", "@downloadSelectTidalQobuz": { "description": "Info hint when non-Tidal/Qobuz service is selected" }, - "downloadEmbedLyricsDisabled": "Disabled while Embed Metadata is turned off", + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle for Embed Lyrics when Embed Metadata is disabled" }, - "downloadNeteaseIncludeTranslation": "Netease: Include Translation", + "downloadNeteaseIncludeTranslation": "Netease: включение перевода", "@downloadNeteaseIncludeTranslation": { "description": "Toggle title for including Netease translated lyrics" }, - "downloadNeteaseIncludeTranslationEnabled": "Append translated lyrics when available", + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is enabled" }, - "downloadNeteaseIncludeTranslationDisabled": "Use original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is disabled" }, @@ -3866,83 +3866,83 @@ "@downloadNeteaseIncludeRomanization": { "description": "Toggle title for including Netease romanized lyrics" }, - "downloadNeteaseIncludeRomanizationEnabled": "Append romanized lyrics when available", + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is enabled" }, - "downloadNeteaseIncludeRomanizationDisabled": "Disabled", + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is disabled" }, - "downloadAppleQqMultiPerson": "Apple/QQ Multi-Person Word-by-Word", + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", "@downloadAppleQqMultiPerson": { "description": "Toggle title for Apple/QQ multi-person word-by-word lyrics" }, - "downloadAppleQqMultiPersonEnabled": "Enable v1/v2 speaker and [bg:] tags", + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person word-by-word is enabled" }, - "downloadAppleQqMultiPersonDisabled": "Simplified word-by-word formatting", + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person word-by-word is disabled" }, - "downloadMusixmatchLanguage": "Musixmatch Language", + "downloadMusixmatchLanguage": "Язык Musixmatch", "@downloadMusixmatchLanguage": { "description": "Setting title for Musixmatch language preference" }, - "downloadMusixmatchLanguageAuto": "Auto (original)", + "downloadMusixmatchLanguageAuto": "Auto (original language)", "@downloadMusixmatchLanguageAuto": { "description": "Option label when Musixmatch uses original language" }, - "downloadFilterContributing": "Filter contributing artists in Album Artist", + "downloadFilterContributing": "Filter Contributing Artists", "@downloadFilterContributing": { "description": "Toggle title for filtering contributing artists in Album Artist metadata" }, - "downloadFilterContributingEnabled": "Album Artist metadata uses primary artist only", + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is enabled" }, - "downloadFilterContributingDisabled": "Keep full Album Artist metadata value", + "downloadFilterContributingDisabled": "Full Album Artist string used", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is disabled" }, - "downloadProvidersNoneEnabled": "None enabled", + "downloadProvidersNoneEnabled": "No providers enabled", "@downloadProvidersNoneEnabled": { "description": "Subtitle for lyrics providers setting when no providers are enabled" }, - "downloadMusixmatchLanguageCode": "Language code", + "downloadMusixmatchLanguageCode": "Код языка", "@downloadMusixmatchLanguageCode": { "description": "Label for the Musixmatch language code text field" }, - "downloadMusixmatchLanguageHint": "auto / en / es / ja", + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Hint text for the Musixmatch language code field" }, - "downloadMusixmatchLanguageDesc": "Set preferred language code (example: en, es, ja). Leave empty for auto.", + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in the Musixmatch language picker" }, - "downloadMusixmatchAuto": "Auto", + "downloadMusixmatchAuto": "Авто", "@downloadMusixmatchAuto": { "description": "Button to reset Musixmatch language to automatic" }, - "downloadNetworkAnySubtitle": "WiFi + Mobile Data", + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", "@downloadNetworkAnySubtitle": { "description": "Subtitle for 'Any' network mode option" }, - "downloadNetworkWifiOnlySubtitle": "Pause downloads on mobile data", + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for 'WiFi only' network mode option" }, - "downloadSongLinkRegionDesc": "Used as userCountry for SongLink API lookup.", + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", "@downloadSongLinkRegionDesc": { "description": "Description in the SongLink region picker" }, - "snackbarUnsupportedAudioFormat": "Unsupported audio format", + "snackbarUnsupportedAudioFormat": "Неподдерживаемый аудио формат", "@snackbarUnsupportedAudioFormat": { "description": "Snackbar when the audio format is not supported for the requested operation" }, - "cacheRefresh": "Refresh", + "cacheRefresh": "Обновить", "@cacheRefresh": { "description": "Tooltip for refresh button on cache management page" }, @@ -3992,11 +3992,11 @@ "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, - "editMetadataAutoFillFetch": "Fetch & Fill", + "editMetadataAutoFillFetch": "Получить и заполнить", "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" }, - "editMetadataAutoFillSearching": "Searching online...", + "editMetadataAutoFillSearching": "Поиск в сети...", "@editMetadataAutoFillSearching": { "description": "Snackbar shown while searching for online metadata" }, @@ -4017,35 +4017,35 @@ "@editMetadataAutoFillNoneSelected": { "description": "Snackbar when user taps Fetch without selecting any fields" }, - "editMetadataFieldTitle": "Title", + "editMetadataFieldTitle": "Название", "@editMetadataFieldTitle": { "description": "Chip label for title field in auto-fill selector" }, - "editMetadataFieldArtist": "Artist", + "editMetadataFieldArtist": "Исполнитель", "@editMetadataFieldArtist": { "description": "Chip label for artist field in auto-fill selector" }, - "editMetadataFieldAlbum": "Album", + "editMetadataFieldAlbum": "Альбом", "@editMetadataFieldAlbum": { "description": "Chip label for album field in auto-fill selector" }, - "editMetadataFieldAlbumArtist": "Album Artist", + "editMetadataFieldAlbumArtist": "Исполнитель альбома", "@editMetadataFieldAlbumArtist": { "description": "Chip label for album artist field in auto-fill selector" }, - "editMetadataFieldDate": "Date", + "editMetadataFieldDate": "Дата", "@editMetadataFieldDate": { "description": "Chip label for date field in auto-fill selector" }, - "editMetadataFieldTrackNum": "Track #", + "editMetadataFieldTrackNum": "Трек #", "@editMetadataFieldTrackNum": { "description": "Chip label for track number field in auto-fill selector" }, - "editMetadataFieldDiscNum": "Disc #", + "editMetadataFieldDiscNum": "Диск #", "@editMetadataFieldDiscNum": { "description": "Chip label for disc number field in auto-fill selector" }, - "editMetadataFieldGenre": "Genre", + "editMetadataFieldGenre": "Жанр", "@editMetadataFieldGenre": { "description": "Chip label for genre field in auto-fill selector" }, @@ -4053,27 +4053,27 @@ "@editMetadataFieldIsrc": { "description": "Chip label for ISRC field in auto-fill selector" }, - "editMetadataFieldLabel": "Label", + "editMetadataFieldLabel": "Заголовок", "@editMetadataFieldLabel": { "description": "Chip label for label field in auto-fill selector" }, - "editMetadataFieldCopyright": "Copyright", + "editMetadataFieldCopyright": "Авторские права", "@editMetadataFieldCopyright": { "description": "Chip label for copyright field in auto-fill selector" }, - "editMetadataFieldCover": "Cover Art", + "editMetadataFieldCover": "Обложка", "@editMetadataFieldCover": { "description": "Chip label for cover art field in auto-fill selector" }, - "editMetadataSelectAll": "All", + "editMetadataSelectAll": "Все", "@editMetadataSelectAll": { "description": "Button to select all fields for auto-fill" }, - "editMetadataSelectEmpty": "Empty only", + "editMetadataSelectEmpty": "Только пустые", "@editMetadataSelectEmpty": { "description": "Button to select only fields that are currently empty" }, - "queueDownloadingCount": "Downloading ({count})", + "queueDownloadingCount": "Скачивание ({count})", "@queueDownloadingCount": { "description": "Header for active downloads section with count", "placeholders": { @@ -4082,11 +4082,11 @@ } } }, - "queueDownloadedHeader": "Downloaded", + "queueDownloadedHeader": "Скачано", "@queueDownloadedHeader": { "description": "Header label for downloaded items section in library" }, - "queueFilteringIndicator": "Filtering...", + "queueFilteringIndicator": "Фильтрация...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" }, @@ -4124,15 +4124,15 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, - "queueEmptyHistory": "No download history", + "queueEmptyHistory": "Нет истории скачиваний", "@queueEmptyHistory": { "description": "Empty state title when download history is empty" }, - "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", + "queueEmptyHistorySubtitle": "Скачанные треки появятся здесь", "@queueEmptyHistorySubtitle": { "description": "Empty state subtitle for download history" }, - "selectionAllPlaylistsSelected": "All playlists selected", + "selectionAllPlaylistsSelected": "Выбраны все плейлисты", "@selectionAllPlaylistsSelected": { "description": "Shown when all playlists are selected in selection mode" }, @@ -4156,19 +4156,19 @@ "@audioAnalysisAnalyzing": { "description": "Loading text while analyzing audio" }, - "audioAnalysisSampleRate": "Sample Rate", + "audioAnalysisSampleRate": "Частота дискретизации", "@audioAnalysisSampleRate": { "description": "Sample rate metric label" }, - "audioAnalysisBitDepth": "Bit Depth", + "audioAnalysisBitDepth": "Разрядность", "@audioAnalysisBitDepth": { "description": "Bit depth metric label" }, - "audioAnalysisChannels": "Channels", + "audioAnalysisChannels": "Каналы", "@audioAnalysisChannels": { "description": "Channels metric label" }, - "audioAnalysisDuration": "Duration", + "audioAnalysisDuration": "Продолжительность", "@audioAnalysisDuration": { "description": "Duration metric label" }, @@ -4176,11 +4176,11 @@ "@audioAnalysisNyquist": { "description": "Nyquist frequency metric label" }, - "audioAnalysisFileSize": "Size", + "audioAnalysisFileSize": "Размер", "@audioAnalysisFileSize": { "description": "File size metric label" }, - "audioAnalysisDynamicRange": "Dynamic Range", + "audioAnalysisDynamicRange": "Динамический диапазон", "@audioAnalysisDynamicRange": { "description": "Dynamic range metric label" }, @@ -4192,7 +4192,7 @@ "@audioAnalysisRms": { "description": "RMS level metric label" }, - "audioAnalysisSamples": "Samples", + "audioAnalysisSamples": "Сэмплы", "@audioAnalysisSamples": { "description": "Total samples metric label" }, @@ -4200,11 +4200,11 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Re-analyzing audio...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Search with {providerName}", + "extensionsSearchWith": "Искать с помощью {providerName}", "@extensionsSearchWith": { "description": "Extensions page - subtitle for built-in search provider option", "placeholders": { @@ -4221,7 +4221,7 @@ "@extensionsHomeFeedDescription": { "description": "Extensions page - description for home feed provider picker" }, - "extensionsHomeFeedAuto": "Auto", + "extensionsHomeFeedAuto": "Авто", "@extensionsHomeFeedAuto": { "description": "Extensions page - home feed provider option: auto" }, @@ -4242,15 +4242,15 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", + "sortAlphaAsc": "А-Я", "@sortAlphaAsc": { "description": "Sort option - alphabetical ascending" }, - "sortAlphaDesc": "Z-A", + "sortAlphaDesc": "Я-А", "@sortAlphaDesc": { "description": "Sort option - alphabetical descending" }, - "cancelDownloadTitle": "Cancel download?", + "cancelDownloadTitle": "Отменить скачивание?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" }, @@ -4263,19 +4263,19 @@ } } }, - "cancelDownloadKeep": "Keep", + "cancelDownloadKeep": "Удерживать", "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, - "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", + "metadataSaveFailedFfmpeg": "Не удалось сохранить метаданные через FFmpeg", "@metadataSaveFailedFfmpeg": { "description": "Snackbar error when FFmpeg fails to write metadata" }, - "metadataSaveFailedStorage": "Failed to write metadata back to storage", + "metadataSaveFailedStorage": "Не удалось записать метаданные обратно в хранилище", "@metadataSaveFailedStorage": { "description": "Snackbar error when writing metadata file back to storage fails" }, - "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", + "snackbarFolderPickerFailed": "Не удалось открыть выбор папок: {error}", "@snackbarFolderPickerFailed": { "description": "Snackbar shown when folder picker fails to open", "placeholders": { @@ -4284,19 +4284,19 @@ } } }, - "errorLoadAlbum": "Failed to load album", + "errorLoadAlbum": "Не удалось загрузить альбом", "@errorLoadAlbum": { "description": "Error state shown when album fails to load" }, - "errorLoadPlaylist": "Failed to load playlist", + "errorLoadPlaylist": "Не удалось загрузить плейлист", "@errorLoadPlaylist": { "description": "Error state shown when playlist fails to load" }, - "errorLoadArtist": "Failed to load artist", + "errorLoadArtist": "Не удалось загрузить исполнителя", "@errorLoadArtist": { "description": "Error state shown when artist fails to load" }, - "notifChannelDownloadName": "Download Progress", + "notifChannelDownloadName": "Прогресс скачивания", "@notifChannelDownloadName": { "description": "Android notification channel name for download progress" }, @@ -4304,7 +4304,7 @@ "@notifChannelDownloadDesc": { "description": "Android notification channel description for download progress" }, - "notifChannelLibraryScanName": "Library Scan", + "notifChannelLibraryScanName": "Сканирование библиотеки", "@notifChannelLibraryScanName": { "description": "Android notification channel name for library scan" }, @@ -4330,11 +4330,11 @@ } } }, - "notifEmbeddingMetadata": "Embedding metadata...", + "notifEmbeddingMetadata": "Встраивание метаданных...", "@notifEmbeddingMetadata": { "description": "Notification body while embedding metadata into a downloaded track" }, - "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", + "notifAlreadyInLibraryCount": "Уже в библиотеке ({completed}/{total})", "@notifAlreadyInLibraryCount": { "description": "Notification title when track is already in library, with count", "placeholders": { @@ -4346,11 +4346,11 @@ } } }, - "notifAlreadyInLibrary": "Already in Library", + "notifAlreadyInLibrary": "Уже в библиотеке", "@notifAlreadyInLibrary": { "description": "Notification title when track is already in library" }, - "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", + "notifDownloadCompleteCount": "Загрузка завершена ({completed}/{total})", "@notifDownloadCompleteCount": { "description": "Notification title when download is complete, with count", "placeholders": { @@ -4362,11 +4362,11 @@ } } }, - "notifDownloadComplete": "Download Complete", + "notifDownloadComplete": "Скачивание завершено", "@notifDownloadComplete": { "description": "Notification title when a single download is complete" }, - "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", + "notifDownloadsFinished": "Загрузка завершена ({completed} завершено, {failed} не удалось)", "@notifDownloadsFinished": { "description": "Notification title when queue finishes with some failures", "placeholders": { @@ -4378,11 +4378,11 @@ } } }, - "notifAllDownloadsComplete": "All Downloads Complete", + "notifAllDownloadsComplete": "Все загрузки завершены", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count} tracks downloaded successfully", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -4391,7 +4391,7 @@ } } }, - "notifScanningLibrary": "Scanning local library", + "notifScanningLibrary": "Сканирование локальной библиотеки", "@notifScanningLibrary": { "description": "Notification title while scanning local library" }, @@ -4422,11 +4422,11 @@ } } }, - "notifLibraryScanComplete": "Library scan complete", + "notifLibraryScanComplete": "Сканирование библиотеки завершено", "@notifLibraryScanComplete": { "description": "Notification title when library scan finishes" }, - "notifLibraryScanCompleteBody": "{count} tracks indexed", + "notifLibraryScanCompleteBody": "{count} треков индексировано", "@notifLibraryScanCompleteBody": { "description": "Notification body for library scan complete - number of indexed tracks", "placeholders": { @@ -4435,7 +4435,7 @@ } } }, - "notifLibraryScanExcluded": "{count} excluded", + "notifLibraryScanExcluded": "{count} исключено", "@notifLibraryScanExcluded": { "description": "Library scan complete suffix - excluded track count", "placeholders": { @@ -4444,7 +4444,7 @@ } } }, - "notifLibraryScanErrors": "{count} errors", + "notifLibraryScanErrors": "{count} ошибок", "@notifLibraryScanErrors": { "description": "Library scan complete suffix - error count", "placeholders": { @@ -4453,15 +4453,15 @@ } } }, - "notifLibraryScanFailed": "Library scan failed", + "notifLibraryScanFailed": "Ошибка сканирования библиотеки", "@notifLibraryScanFailed": { "description": "Notification title when library scan fails" }, - "notifLibraryScanCancelled": "Library scan cancelled", + "notifLibraryScanCancelled": "Сканирование библиотеки отменено", "@notifLibraryScanCancelled": { "description": "Notification title when library scan is cancelled by the user" }, - "notifLibraryScanStopped": "Scan stopped before completion.", + "notifLibraryScanStopped": "Сканирование остановлено перед завершением.", "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, @@ -4474,7 +4474,7 @@ } } }, - "notifUpdateProgress": "{received} / {total} MB • {percentage}%", + "notifUpdateProgress": "{received} / {total} МБ • {percentage}%", "@notifUpdateProgress": { "description": "Notification body showing update download progress", "placeholders": { @@ -4489,7 +4489,7 @@ } } }, - "notifUpdateReady": "Update Ready", + "notifUpdateReady": "Обновление готово", "@notifUpdateReady": { "description": "Notification title when app update download is complete" }, @@ -4502,11 +4502,11 @@ } } }, - "notifUpdateFailed": "Update Failed", + "notifUpdateFailed": "Ошибка обновления", "@notifUpdateFailed": { "description": "Notification title when app update download fails" }, - "notifUpdateFailedBody": "Could not download update. Try again later.", + "notifUpdateFailedBody": "Не удалось скачать обновление. Попробуйте позже.", "@notifUpdateFailedBody": { "description": "Notification body when app update download fails" }, @@ -4581,5 +4581,978 @@ "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" + }, + "homeEmptyTitle": "No search providers yet", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Install an extension to continue.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import CSV", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Search tracks...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Search for tracks", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "Starting...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BETA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } } } diff --git a/lib/l10n/arb/app_tr.arb b/lib/l10n/arb/app_tr.arb index aa2abd7c..56115ddf 100644 --- a/lib/l10n/arb/app_tr.arb +++ b/lib/l10n/arb/app_tr.arb @@ -1,6 +1,6 @@ { "@@locale": "tr", - "@@last_modified": "2026-01-16", + "@@last_modified": "2026-04-28", "appName": "SpotiFLAC Mobile", "@appName": { "description": "App name - DO NOT TRANSLATE" @@ -137,7 +137,7 @@ "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Şarkı ismi aratılırken kullanılan kaynak.", + "optionsPrimaryProviderSubtitle": "Parça veya albüm adına göre arama yapmak için kullanılan hizmet", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, @@ -178,7 +178,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Senkronize şarkı sözlerini FLAC dosyalarına göm", + "optionsEmbedLyricsSubtitle": "İndirdiğiniz parçaların yanına senkronize edilmiş şarkı sözlerini kaydedin", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -267,7 +267,7 @@ "@optionsSpotifyCredentials": { "description": "Spotify API credentials setting" }, - "optionsSpotifyCredentialsConfigured": "Client ID: {clientId}...", + "optionsSpotifyCredentialsConfigured": "Müşteri Kimliği: {clientId}...", "@optionsSpotifyCredentialsConfigured": { "description": "Shows configured client ID preview", "placeholders": { @@ -378,7 +378,7 @@ "@aboutPCSource": { "description": "Link to PC GitHub repo" }, - "aboutKeepAndroidOpen": "Keep Android Open", + "aboutKeepAndroidOpen": "Android'i Açık Tutun", "@aboutKeepAndroidOpen": { "description": "Link to Keep Android Open campaign website" }, @@ -438,7 +438,7 @@ "@aboutSjdonadoDesc": { "description": "Credit description for sjdonado" }, - "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", + "aboutAppDescription": "Müzik meta verilerini arayın, uzantıları yönetin ve kütüphanenizi düzenleyin.", "@aboutAppDescription": { "description": "App description in header card" }, @@ -720,7 +720,7 @@ "@dialogDeleteSelectedTitle": { "description": "Dialog title - delete selected items" }, - "dialogDeleteSelectedMessage": "{count} {count, plural, =1{şarkıyı} other{şarkıyı}} geçmişten silmeye emin misiniz?\n\nBu işlem seçilenleri cihazınızdan da silecektir.", + "dialogDeleteSelectedMessage": "{count} {count, plural, one {}=1{şarkıyı} other{şarkıyı}} geçmişten silmeye emin misiniz?\n\nBu işlem seçilenleri cihazınızdan da silecektir.", "@dialogDeleteSelectedMessage": { "description": "Dialog message - delete selected tracks", "placeholders": { @@ -799,7 +799,7 @@ "@snackbarCredentialsCleared": { "description": "Snackbar - Spotify credentials removed" }, - "snackbarDeletedTracks": "{count} {count, plural, =1{şarkı} other{şarkı}} silindi", + "snackbarDeletedTracks": "{count} {count, plural, one {}=1{şarkı} other{şarkı}} silindi", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", "placeholders": { @@ -1249,7 +1249,7 @@ "@credentialsDescription": { "description": "Credentials dialog explanation" }, - "credentialsClientId": "Client ID", + "credentialsClientId": "Müşteri Kimliği", "@credentialsClientId": { "description": "Client ID field label - DO NOT TRANSLATE" }, @@ -1257,7 +1257,7 @@ "@credentialsClientIdHint": { "description": "Client ID placeholder" }, - "credentialsClientSecret": "Client Secret", + "credentialsClientSecret": "Müşteri Sırrı", "@credentialsClientSecret": { "description": "Client Secret field label - DO NOT TRANSLATE" }, @@ -1369,11 +1369,11 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Servis, kalite, dosya adı formatı", + "settingsDownloadSubtitle": "Hizmet, kalite, yedekleme", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Yedekleme, sözler, kapak resmi, güncellemeler", + "settingsOptionsSubtitle": "Yedek plan, meta veriler, şarkı sözleri, kapak resmi", "@settingsOptionsSubtitle": { "description": "Options settings description" }, @@ -1402,7 +1402,7 @@ } } }, - "tracksCount": "{count, plural, =1{1 parça} other{{count} parça}}", + "tracksCount": "{count, plural, one {}=1{1 parça} other{{count} parça}}", "@tracksCount": { "description": "Track count display", "placeholders": { @@ -1666,7 +1666,7 @@ "@extensionAuthor": { "description": "Extension detail - author" }, - "extensionId": "ID", + "extensionId": "Kimlik", "@extensionId": { "description": "Extension detail - unique ID" }, @@ -2029,7 +2029,7 @@ "@downloadedAlbumDeleteSelected": { "description": "Button - delete selected tracks" }, - "downloadedAlbumDeleteMessage": "Bu albümden {count} {count, plural, =1{parça} other{parça}} parça silinsin mi?\n\nBu işlem dosyaları depolama alanından da kalıcı olarak silecektir.", + "downloadedAlbumDeleteMessage": "Bu albümden {count} {count, plural, one {}=1{parça} other{parça}} parça silinsin mi?\n\nBu işlem dosyaları depolama alanından da kalıcı olarak silecektir.", "@downloadedAlbumDeleteMessage": { "description": "Delete confirmation with count", "placeholders": { @@ -2055,7 +2055,7 @@ "@downloadedAlbumTapToSelect": { "description": "Selection hint" }, - "downloadedAlbumDeleteCount": "{count} {count, plural, =1{parçayı} other{parçayı}} sil", + "downloadedAlbumDeleteCount": "{count} {count, plural, one {}=1{parçayı} other{parçayı}} sil", "@downloadedAlbumDeleteCount": { "description": "Delete button text with count", "placeholders": { @@ -2378,7 +2378,7 @@ "@libraryAboutDescription": { "description": "Description of local library feature" }, - "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", + "libraryTracksUnit": "{count, plural, =1{parça} other{parçalar}}", "@libraryTracksUnit": { "description": "Unit label for tracks count (without the number itself)", "placeholders": { @@ -2387,7 +2387,7 @@ } } }, - "libraryLastScanned": "Last scanned: {time}", + "libraryLastScanned": "Son tarama tarihi: {time}", "@libraryLastScanned": { "description": "Last scan time display", "placeholders": { @@ -2396,7 +2396,7 @@ } } }, - "libraryLastScannedNever": "Never", + "libraryLastScannedNever": "Asla", "@libraryLastScannedNever": { "description": "Shown when library has never been scanned" }, @@ -2404,7 +2404,7 @@ "@libraryScanning": { "description": "Status during scan" }, - "libraryScanProgress": "{progress}% of {total} files", + "libraryScanProgress": "{total} dosyanın {progress}%'si", "@libraryScanProgress": { "description": "Scan progress display", "placeholders": { @@ -2416,11 +2416,11 @@ } } }, - "libraryInLibrary": "In Library", + "libraryInLibrary": "Kütüphanede", "@libraryInLibrary": { "description": "Badge shown on tracks that exist in local library" }, - "libraryRemovedMissingFiles": "Removed {count} missing files from library", + "libraryRemovedMissingFiles": "Kütüphaneden {count} adet eksik dosya kaldırıldı", "@libraryRemovedMissingFiles": { "description": "Snackbar after cleanup", "placeholders": { @@ -2429,19 +2429,19 @@ } } }, - "libraryCleared": "Library cleared", + "libraryCleared": "Kütüphane temizlendi", "@libraryCleared": { "description": "Snackbar after clearing library" }, - "libraryStorageAccessRequired": "Storage Access Required", + "libraryStorageAccessRequired": "Depolama Alanına Erişim Gereklidir", "@libraryStorageAccessRequired": { "description": "Dialog title for storage permission" }, - "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", + "libraryStorageAccessMessage": "SpotiFLAC, müzik kitaplığınızı tarayabilmek için depolama alanına erişime ihtiyaç duyar. Lütfen ayarlar bölümünden izin verin.", "@libraryStorageAccessMessage": { "description": "Dialog message for storage permission" }, - "libraryFolderNotExist": "Selected folder does not exist", + "libraryFolderNotExist": "Seçilen klasör mevcut değil", "@libraryFolderNotExist": { "description": "Error when folder doesn't exist" }, @@ -2449,7 +2449,7 @@ "@librarySourceDownloaded": { "description": "Badge for tracks downloaded via SpotiFLAC" }, - "librarySourceLocal": "Local", + "librarySourceLocal": "Yerel", "@librarySourceLocal": { "description": "Badge for tracks from local library scan" }, @@ -2457,11 +2457,11 @@ "@libraryFilterAll": { "description": "Filter chip - show all library items" }, - "libraryFilterDownloaded": "Downloaded", + "libraryFilterDownloaded": "İndirildi", "@libraryFilterDownloaded": { "description": "Filter chip - show only downloaded items" }, - "libraryFilterLocal": "Local", + "libraryFilterLocal": "Yerel", "@libraryFilterLocal": { "description": "Filter chip - show only local library items" }, @@ -2493,7 +2493,7 @@ "@libraryFilterQualityCD": { "description": "Filter option - CD quality audio" }, - "libraryFilterQualityLossy": "Lossy", + "libraryFilterQualityLossy": "Kayıplı", "@libraryFilterQualityLossy": { "description": "Filter option - lossy compressed audio" }, @@ -2501,19 +2501,19 @@ "@libraryFilterFormat": { "description": "Filter section - file format" }, - "libraryFilterSort": "Sort", + "libraryFilterSort": "Sırala", "@libraryFilterSort": { "description": "Filter section - sort order" }, - "libraryFilterSortLatest": "Latest", + "libraryFilterSortLatest": "En sonuncu", "@libraryFilterSortLatest": { "description": "Sort option - newest first" }, - "libraryFilterSortOldest": "Oldest", + "libraryFilterSortOldest": "En eski", "@libraryFilterSortOldest": { "description": "Sort option - oldest first" }, - "timeJustNow": "Just now", + "timeJustNow": "Şu anda", "@timeJustNow": { "description": "Relative time - less than a minute ago" }, @@ -2535,7 +2535,7 @@ } } }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC!", + "tutorialWelcomeTitle": "SpotiFLAC'e hoş geldiniz!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, @@ -2627,31 +2627,31 @@ "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, - "tutorialSettingsTip3": "Customize app theme and appearance", + "tutorialSettingsTip3": "Uygulama temasını ve görünümünü özelleştirin", "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "tutorialReadyMessage": "Her şey hazır! En sevdiğiniz müzikleri hemen indirmeye başlayın.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, - "libraryForceFullScan": "Force Full Scan", + "libraryForceFullScan": "Tam Taramayı Zorla", "@libraryForceFullScan": { "description": "Button to force a complete rescan of library" }, - "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", + "libraryForceFullScanSubtitle": "Önbelleği yok sayarak tüm dosyaları yeniden tarayın", "@libraryForceFullScanSubtitle": { "description": "Subtitle for force full scan button" }, - "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", + "cleanupOrphanedDownloads": "Yetim kalmış indirmeleri temizle", "@cleanupOrphanedDownloads": { "description": "Button to remove history entries for deleted files" }, - "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", + "cleanupOrphanedDownloadsSubtitle": "Artık mevcut olmayan dosyalar için geçmiş kayıtlarını kaldırın", "@cleanupOrphanedDownloadsSubtitle": { "description": "Subtitle for orphaned cleanup button" }, - "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", + "cleanupOrphanedDownloadsResult": "Geçmişten {count} adet yetim kayıt kaldırıldı", "@cleanupOrphanedDownloadsResult": { "description": "Snackbar after orphan cleanup", "placeholders": { @@ -2660,19 +2660,19 @@ } } }, - "cleanupOrphanedDownloadsNone": "No orphaned entries found", + "cleanupOrphanedDownloadsNone": "Hiçbir yetim kayıt bulunamadı", "@cleanupOrphanedDownloadsNone": { "description": "Snackbar when no orphans found" }, - "cacheTitle": "Storage & Cache", + "cacheTitle": "Depolama & Önbellek", "@cacheTitle": { "description": "Cache management page title" }, - "cacheSummaryTitle": "Cache overview", + "cacheSummaryTitle": "Önbellek genel bakışı", "@cacheSummaryTitle": { "description": "Heading for cache summary card" }, - "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", + "cacheSummarySubtitle": "Önbelleği temizlemek, indirilen müzik dosyalarını silmeyecektir.", "@cacheSummarySubtitle": { "description": "Helper text for cache summary card" }, @@ -2685,55 +2685,55 @@ } } }, - "cacheSectionStorage": "Cached Data", + "cacheSectionStorage": "Önbelleğe alınmış veriler", "@cacheSectionStorage": { "description": "Section header for cache entries" }, - "cacheSectionMaintenance": "Maintenance", + "cacheSectionMaintenance": "Bakım", "@cacheSectionMaintenance": { "description": "Section header for cleanup actions" }, - "cacheAppDirectory": "App cache directory", + "cacheAppDirectory": "Uygulama önbellek dizini", "@cacheAppDirectory": { "description": "Cache item title for app cache directory" }, - "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", + "cacheAppDirectoryDesc": "HTTP yanıtları, WebView verileri ve diğer geçici uygulama verileri.", "@cacheAppDirectoryDesc": { "description": "Description of what app cache directory contains" }, - "cacheTempDirectory": "Temporary directory", + "cacheTempDirectory": "Geçici dizin", "@cacheTempDirectory": { "description": "Cache item title for temporary files directory" }, - "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", + "cacheTempDirectoryDesc": "İndirmelerden ve ses dönüştürme işlemlerinden kaynaklanan geçici dosyalar.", "@cacheTempDirectoryDesc": { "description": "Description of what temporary directory contains" }, - "cacheCoverImage": "Cover image cache", + "cacheCoverImage": "Kapak resmi önbelleği", "@cacheCoverImage": { "description": "Cache item title for persistent cover images" }, - "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", + "cacheCoverImageDesc": "Albüm ve şarkı kapak resimleri indirildi. Görüntülendikten sonra tekrar indirilecektir.", "@cacheCoverImageDesc": { "description": "Description of what cover image cache contains" }, - "cacheLibraryCover": "Library cover cache", + "cacheLibraryCover": "Kütüphane kapağı önbelleği", "@cacheLibraryCover": { "description": "Cache item title for local library cover art images" }, - "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", + "cacheLibraryCoverDesc": "Kapak resmi yerel müzik dosyalarından çıkarıldı. Bir sonraki taramada yeniden çıkarılacaktır.", "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, - "cacheExploreFeed": "Explore feed cache", + "cacheExploreFeed": "Besleme önbelleğini keşfedin", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" }, - "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", + "cacheExploreFeedDesc": "Sekme içeriğini keşfedin (yeni çıkanlar, trendler). Bir sonraki ziyaretinizde yenilenecektir.", "@cacheExploreFeedDesc": { "description": "Description of what explore feed cache contains" }, - "cacheTrackLookup": "Track lookup cache", + "cacheTrackLookup": "İzleme arama önbelleği", "@cacheTrackLookup": { "description": "Cache item title for track ID lookup cache" }, @@ -2961,7 +2961,7 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to MP3, Opus, ALAC, or FLAC", + "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", "@trackConvertFormatSubtitle": { "description": "Subtitle for convert format menu item" }, @@ -2977,11 +2977,11 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, - "trackConvertConfirmTitle": "Confirm Conversion", + "trackConvertConfirmTitle": "Dönüştürmeyi Onayla", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" }, - "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", + "trackConvertConfirmMessage": "{sourceFormat} formatından {targetFormat} formatına {bitrate} hızında dönüştürülsün mü?\n\nDönüştürme işleminden sonra orijinal dosya silinecektir.", "@trackConvertConfirmMessage": { "description": "Confirmation dialog message", "placeholders": { @@ -2996,7 +2996,7 @@ } } }, - "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", + "trackConvertConfirmMessageLossless": "{sourceFormat} formatından {targetFormat} formatına dönüştürmek ister misiniz? (Kayıpsız — kalite kaybı yok)\n\nDönüştürme işleminden sonra orijinal dosya silinecektir.", "@trackConvertConfirmMessageLossless": { "description": "Confirmation dialog message for lossless-to-lossless conversion", "placeholders": { @@ -3008,7 +3008,7 @@ } } }, - "trackConvertLosslessHint": "Lossless conversion — no quality loss", + "trackConvertLosslessHint": "Kayıpsız dönüştürme — kalite kaybı yok", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" }, @@ -3016,7 +3016,7 @@ "@trackConvertConverting": { "description": "Snackbar while converting" }, - "trackConvertSuccess": "Converted to {format} successfully", + "trackConvertSuccess": "{format} formatına başarıyla dönüştürüldü", "@trackConvertSuccess": { "description": "Snackbar after successful conversion", "placeholders": { @@ -3025,15 +3025,15 @@ } } }, - "trackConvertFailed": "Conversion failed", + "trackConvertFailed": "Dönüştürme başarısız oldu", "@trackConvertFailed": { "description": "Snackbar when conversion fails" }, - "cueSplitTitle": "Split CUE Sheet", + "cueSplitTitle": "Bölünmüş CUE Sayfası", "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Split CUE+FLAC into individual tracks", + "cueSplitSubtitle": "CUE+FLAC dosyalarını ayrı parçalara bölün", "@cueSplitSubtitle": { "description": "Subtitle for CUE split menu item" }, @@ -3055,7 +3055,7 @@ } } }, - "cueSplitTrackCount": "{count} tracks", + "cueSplitTrackCount": "{count} parça", "@cueSplitTrackCount": { "description": "Number of tracks in CUE sheet", "placeholders": { @@ -3064,11 +3064,11 @@ } } }, - "cueSplitConfirmTitle": "Split CUE Album", + "cueSplitConfirmTitle": "Bölünmüş CUE Albümü", "@cueSplitConfirmTitle": { "description": "CUE split confirmation dialog title" }, - "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", + "cueSplitConfirmMessage": "\"{album}\" albümünü {count} adet ayrı FLAC dosyasına bölmek ister misiniz?\n\nDosyalar aynı dizine kaydedilecektir.", "@cueSplitConfirmMessage": { "description": "CUE split confirmation dialog message", "placeholders": { @@ -3080,7 +3080,7 @@ } } }, - "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", + "cueSplitSplitting": "CUE sayfası bölünüyor... ({current}/{total})", "@cueSplitSplitting": { "description": "Snackbar while splitting CUE", "placeholders": { @@ -3092,7 +3092,7 @@ } } }, - "cueSplitSuccess": "Split into {count} tracks successfully", + "cueSplitSuccess": "{count} parçaya başarıyla bölündü", "@cueSplitSuccess": { "description": "Snackbar after successful CUE split", "placeholders": { @@ -3101,15 +3101,15 @@ } } }, - "cueSplitFailed": "CUE split failed", + "cueSplitFailed": "CUE bölme işlemi başarısız oldu", "@cueSplitFailed": { "description": "Snackbar when CUE split fails" }, - "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", + "cueSplitNoAudioFile": "Bu CUE sayfası için ses dosyası bulunamadı", "@cueSplitNoAudioFile": { "description": "Error when CUE audio file is missing" }, - "cueSplitButton": "Split into Tracks", + "cueSplitButton": "Parçalara Ayrılmış", "@cueSplitButton": { "description": "Button text to start CUE splitting" }, @@ -3121,19 +3121,19 @@ "@collectionFoldersTitle": { "description": "Library section title for custom folders" }, - "collectionWishlist": "Wishlist", + "collectionWishlist": "İstek listesi", "@collectionWishlist": { "description": "Custom folder for saved tracks to download later" }, - "collectionLoved": "Loved", + "collectionLoved": "Sevilen", "@collectionLoved": { "description": "Custom folder for favorite tracks" }, - "collectionPlaylists": "Playlists", + "collectionPlaylists": "Çalma listeleri", "@collectionPlaylists": { "description": "Custom user playlists folder" }, - "collectionPlaylist": "Playlist", + "collectionPlaylist": "Çalma listesi", "@collectionPlaylist": { "description": "Single playlist label" }, @@ -3141,19 +3141,19 @@ "@collectionAddToPlaylist": { "description": "Action to add a track to user playlist" }, - "collectionCreatePlaylist": "Create playlist", + "collectionCreatePlaylist": "Çalma listesi oluştur", "@collectionCreatePlaylist": { "description": "Action to create a new playlist" }, - "collectionNoPlaylistsYet": "No playlists yet", + "collectionNoPlaylistsYet": "Henüz çalma listesi yok", "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Create a playlist to start categorizing tracks", + "collectionNoPlaylistsSubtitle": "Parçaları kategorize etmeye başlamak için bir çalma listesi oluşturun", "@collectionNoPlaylistsSubtitle": { "description": "Empty state subtitle when user has no playlists" }, - "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", + "collectionPlaylistTracks": "{count, plural, =1{1 parça} other{{count} parça}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", "placeholders": { @@ -3162,7 +3162,7 @@ } } }, - "collectionAddedToPlaylist": "Added to \"{playlistName}\"", + "collectionAddedToPlaylist": "\"{playlistName}\"e eklendi", "@collectionAddedToPlaylist": { "description": "Snackbar after adding track to playlist", "placeholders": { @@ -3171,7 +3171,7 @@ } } }, - "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", + "collectionAlreadyInPlaylist": "Zaten \"{playlistName}\" içinde", "@collectionAlreadyInPlaylist": { "description": "Snackbar when track already exists in playlist", "placeholders": { @@ -3188,19 +3188,19 @@ "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" }, - "collectionPlaylistNameRequired": "Playlist name is required", + "collectionPlaylistNameRequired": "Çalma listesi adı zorunludur", "@collectionPlaylistNameRequired": { "description": "Validation error for empty playlist name" }, - "collectionRenamePlaylist": "Rename playlist", + "collectionRenamePlaylist": "Çalma listesini yeniden adlandır", "@collectionRenamePlaylist": { "description": "Action to rename playlist" }, - "collectionDeletePlaylist": "Delete playlist", + "collectionDeletePlaylist": "Çalma listesini sil", "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Delete \"{playlistName}\" and all tracks inside it?", + "collectionDeletePlaylistMessage": "\"{playlistName}\" ve içindeki tüm parçaları silmek mi istiyorsunuz?", "@collectionDeletePlaylistMessage": { "description": "Confirmation message for deleting playlist", "placeholders": { @@ -3213,31 +3213,31 @@ "@collectionPlaylistDeleted": { "description": "Snackbar after deleting playlist" }, - "collectionPlaylistRenamed": "Playlist renamed", + "collectionPlaylistRenamed": "Çalma listesinin adı değiştirildi", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" }, - "collectionWishlistEmptyTitle": "Wishlist is empty", + "collectionWishlistEmptyTitle": "İstek listesi boş", "@collectionWishlistEmptyTitle": { "description": "Wishlist empty state title" }, - "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", + "collectionWishlistEmptySubtitle": "Daha sonra indirmek istediğiniz parçaları kaydetmek için parçaların üzerine + işaretiyle dokunun", "@collectionWishlistEmptySubtitle": { "description": "Wishlist empty state subtitle" }, - "collectionLovedEmptyTitle": "Loved folder is empty", + "collectionLovedEmptyTitle": "Sevilenler klasörü boş", "@collectionLovedEmptyTitle": { "description": "Loved empty state title" }, - "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", + "collectionLovedEmptySubtitle": "Favorilerinizi kaydetmek için parçalara beğeni bırakın", "@collectionLovedEmptySubtitle": { "description": "Loved empty state subtitle" }, - "collectionPlaylistEmptyTitle": "Playlist is empty", + "collectionPlaylistEmptyTitle": "Çalma listesi boş", "@collectionPlaylistEmptyTitle": { "description": "Playlist empty state title" }, - "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", + "collectionPlaylistEmptySubtitle": "Buraya eklemek istediğiniz herhangi bir parçaya uzun süre basılı tutun +", "@collectionPlaylistEmptySubtitle": { "description": "Playlist empty state subtitle" }, @@ -3411,15 +3411,15 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Artist folders use Album Artist when available", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when Album Artist is used for folder naming" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Artist folders use Track Artist only", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when Track Artist is used for folder naming" }, - "lyricsProvidersTitle": "Lyrics Providers", + "lyricsProvidersTitle": "Lyrics Provider Priority", "@lyricsProvidersTitle": { "description": "Title for the lyrics provider priority page" }, @@ -3505,11 +3505,11 @@ "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Donate", + "settingsDonate": "Support Development", "@settingsDonate": { "description": "Settings menu item - donate" }, - "settingsDonateSubtitle": "Support SpotiFLAC-Mobile development", + "settingsDonateSubtitle": "Buy the developer a coffee", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, @@ -3517,11 +3517,11 @@ "@tooltipLoveAll": { "description": "Tooltip for the Love All button on album/playlist screens" }, - "tooltipAddToPlaylist": "Add to Playlist", + "tooltipAddToPlaylist": "Çalma listesine ekle", "@tooltipAddToPlaylist": { "description": "Tooltip for the Add to Playlist button" }, - "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", + "snackbarRemovedTracksFromLoved": "Sevilen albümünden {count} parça kaldırıldı", "@snackbarRemovedTracksFromLoved": { "description": "Snackbar after removing multiple tracks from Loved folder", "placeholders": { @@ -3530,7 +3530,7 @@ } } }, - "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", + "snackbarAddedTracksToLoved": "Sevilen'e {count} parça eklendi", "@snackbarAddedTracksToLoved": { "description": "Snackbar after adding multiple tracks to Loved folder", "placeholders": { @@ -3543,7 +3543,7 @@ "@dialogDownloadAllTitle": { "description": "Dialog title for bulk download confirmation" }, - "dialogDownloadAllMessage": "Download {count} tracks?", + "dialogDownloadAllMessage": "{count} parça indirilsin mi?", "@dialogDownloadAllMessage": { "description": "Body of the Download All confirmation dialog", "placeholders": { @@ -3552,7 +3552,7 @@ } } }, - "homeSkipAlreadyDownloaded": "Skip already downloaded songs", + "homeSkipAlreadyDownloaded": "Daha önce indirilmiş şarkıları atla", "@homeSkipAlreadyDownloaded": { "description": "Checkbox label in import dialog to skip already-downloaded songs" }, @@ -3560,23 +3560,23 @@ "@homeGoToAlbum": { "description": "Context menu item to navigate to the album page" }, - "homeAlbumInfoUnavailable": "Album info not available", + "homeAlbumInfoUnavailable": "Albüm bilgisi mevcut değil", "@homeAlbumInfoUnavailable": { "description": "Snackbar when album info cannot be loaded" }, - "snackbarLoadingCueSheet": "Loading CUE sheet...", + "snackbarLoadingCueSheet": "CUE sayfası yükleniyor...", "@snackbarLoadingCueSheet": { "description": "Snackbar while loading a CUE sheet file" }, - "snackbarMetadataSaved": "Metadata saved successfully", + "snackbarMetadataSaved": "Meta veriler başarıyla kaydedildi", "@snackbarMetadataSaved": { "description": "Snackbar after successfully saving track metadata" }, - "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", + "snackbarFailedToEmbedLyrics": "Şarkı sözleri eklenemedi", "@snackbarFailedToEmbedLyrics": { "description": "Snackbar when lyrics embedding fails" }, - "snackbarFailedToWriteStorage": "Failed to write back to storage", + "snackbarFailedToWriteStorage": "Depolama alanına geri yazma işlemi başarısız oldu", "@snackbarFailedToWriteStorage": { "description": "Snackbar when writing metadata back to file fails" }, @@ -3589,47 +3589,47 @@ } } }, - "snackbarNoActionDefined": "No action defined for this button", + "snackbarNoActionDefined": "Bu düğme için tanımlanmış bir işlem yok", "@snackbarNoActionDefined": { "description": "Snackbar when an extension button has no action configured" }, - "noTracksFoundForAlbum": "No tracks found for this album", + "noTracksFoundForAlbum": "Bu albüm için hiçbir parça bulunamadı", "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose storage mode for downloaded files.", + "downloadLocationSubtitle": "İndirdiğiniz parçaları nereye kaydedeceğinizi seçin", "@downloadLocationSubtitle": { "description": "Subtitle text in Android download location bottom sheet" }, - "storageModeAppFolder": "App folder (non-SAF)", + "storageModeAppFolder": "Uygulama Klasörü (Önerilir)", "@storageModeAppFolder": { "description": "Storage mode option - use legacy app folder" }, - "storageModeAppFolderSubtitle": "Use default Music/SpotiFLAC path", + "storageModeAppFolderSubtitle": "Varsayılan olarak Müzik/SpotiFLAC klasörüne kaydeder", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "SAF folder", + "storageModeSaf": "Özel Klasör (SAF)", "@storageModeSaf": { "description": "Storage mode option - use Android SAF picker" }, - "storageModeSafSubtitle": "Pick folder via Android Storage Access Framework", + "storageModeSafSubtitle": "SD kart dahil herhangi bir klasörü seçin", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFilenameDescription": "Customize how your files are named.", + "downloadFilenameDescription": "Yer tutucu olarak {artist}, {title}, {album}, {track}, {year}, {date}, {disc} ifadelerini kullanın.", "@downloadFilenameDescription": { "description": "Description text in filename format bottom sheet" }, - "downloadFilenameInsertTag": "Tap to insert tag:", + "downloadFilenameInsertTag": "Etiket eklemek için dokunun:", "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Albums/ and Singles/ folders", + "downloadSeparateSinglesEnabled": "Single şarkılar ve EP'ler ayrı bir klasöre kaydedildi", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is enabled" }, - "downloadSeparateSinglesDisabled": "All files in same structure", + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is disabled" }, @@ -3637,19 +3637,19 @@ "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Create playlist source folder", + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", "@downloadCreatePlaylistSourceFolder": { "description": "Setting title for adding a playlist folder prefix before the normal organization structure" }, - "downloadCreatePlaylistSourceFolderEnabled": "Playlist downloads use Playlist/ plus your normal folder structure.", + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist source folder prefix is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "Playlist downloads use the normal folder structure only.", + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist source folder prefix is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "By Playlist already places downloads inside a playlist folder.", + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when playlist folder prefix setting is redundant because folder organization is already by playlist" }, @@ -3657,27 +3657,27 @@ "@downloadSongLinkRegion": { "description": "Setting title for SongLink country region" }, - "downloadNetworkCompatibilityMode": "Network compatibility mode", + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", "@downloadNetworkCompatibilityMode": { "description": "Setting title for network compatibility toggle" }, - "downloadNetworkCompatibilityModeEnabled": "Enabled: try HTTP + accept invalid TLS certificates (unsafe)", + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is enabled" }, - "downloadNetworkCompatibilityModeDisabled": "Off: strict HTTPS certificate validation (recommended)", + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is disabled" }, - "downloadSelectServiceToEnable": "Select a built-in service to enable", + "downloadSelectServiceToEnable": "Select Tidal or Qobuz to enable this option", "@downloadSelectServiceToEnable": { "description": "Hint shown instead of Ask-quality subtitle when no built-in service selected" }, - "downloadSelectTidalQobuz": "Select Tidal or Qobuz above to configure quality", + "downloadSelectTidalQobuz": "Select Tidal or Qobuz to choose audio quality", "@downloadSelectTidalQobuz": { "description": "Info hint when non-Tidal/Qobuz service is selected" }, - "downloadEmbedLyricsDisabled": "Disabled while Embed Metadata is turned off", + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle for Embed Lyrics when Embed Metadata is disabled" }, @@ -3685,11 +3685,11 @@ "@downloadNeteaseIncludeTranslation": { "description": "Toggle title for including Netease translated lyrics" }, - "downloadNeteaseIncludeTranslationEnabled": "Append translated lyrics when available", + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is enabled" }, - "downloadNeteaseIncludeTranslationDisabled": "Use original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is disabled" }, @@ -3697,23 +3697,23 @@ "@downloadNeteaseIncludeRomanization": { "description": "Toggle title for including Netease romanized lyrics" }, - "downloadNeteaseIncludeRomanizationEnabled": "Append romanized lyrics when available", + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is enabled" }, - "downloadNeteaseIncludeRomanizationDisabled": "Disabled", + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is disabled" }, - "downloadAppleQqMultiPerson": "Apple/QQ Multi-Person Word-by-Word", + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", "@downloadAppleQqMultiPerson": { "description": "Toggle title for Apple/QQ multi-person word-by-word lyrics" }, - "downloadAppleQqMultiPersonEnabled": "Enable v1/v2 speaker and [bg:] tags", + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person word-by-word is enabled" }, - "downloadAppleQqMultiPersonDisabled": "Simplified word-by-word formatting", + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person word-by-word is disabled" }, @@ -3721,23 +3721,23 @@ "@downloadMusixmatchLanguage": { "description": "Setting title for Musixmatch language preference" }, - "downloadMusixmatchLanguageAuto": "Auto (original)", + "downloadMusixmatchLanguageAuto": "Auto (original language)", "@downloadMusixmatchLanguageAuto": { "description": "Option label when Musixmatch uses original language" }, - "downloadFilterContributing": "Filter contributing artists in Album Artist", + "downloadFilterContributing": "Filter Contributing Artists", "@downloadFilterContributing": { "description": "Toggle title for filtering contributing artists in Album Artist metadata" }, - "downloadFilterContributingEnabled": "Album Artist metadata uses primary artist only", + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is enabled" }, - "downloadFilterContributingDisabled": "Keep full Album Artist metadata value", + "downloadFilterContributingDisabled": "Full Album Artist string used", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is disabled" }, - "downloadProvidersNoneEnabled": "None enabled", + "downloadProvidersNoneEnabled": "No providers enabled", "@downloadProvidersNoneEnabled": { "description": "Subtitle for lyrics providers setting when no providers are enabled" }, @@ -3745,11 +3745,11 @@ "@downloadMusixmatchLanguageCode": { "description": "Label for the Musixmatch language code text field" }, - "downloadMusixmatchLanguageHint": "auto / en / es / ja", + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Hint text for the Musixmatch language code field" }, - "downloadMusixmatchLanguageDesc": "Set preferred language code (example: en, es, ja). Leave empty for auto.", + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in the Musixmatch language picker" }, @@ -3757,15 +3757,15 @@ "@downloadMusixmatchAuto": { "description": "Button to reset Musixmatch language to automatic" }, - "downloadNetworkAnySubtitle": "WiFi + Mobile Data", + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", "@downloadNetworkAnySubtitle": { "description": "Subtitle for 'Any' network mode option" }, - "downloadNetworkWifiOnlySubtitle": "Pause downloads on mobile data", + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for 'WiFi only' network mode option" }, - "downloadSongLinkRegionDesc": "Used as userCountry for SongLink API lookup.", + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", "@downloadSongLinkRegionDesc": { "description": "Description in the SongLink region picker" }, @@ -4031,7 +4031,7 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Re-analyzing audio...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, @@ -4043,11 +4043,11 @@ "@downloadSingleFilenameFormatDescription": { "description": "Subtitle description for single filename format setting" }, - "optionsDefaultSearchTab": "Default Search Tab", + "optionsDefaultSearchTab": "Varsayılan Arama Sekmesi", "@optionsDefaultSearchTab": { "description": "Title for the preferred default search tab setting" }, - "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "optionsDefaultSearchTabSubtitle": "Yeni arama sonuçları için hangi sekmenin önce açılacağını seçin.", "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, @@ -4099,7 +4099,7 @@ "@providerPriorityFallbackExtensionsTitle": { "description": "Section title for choosing which download extensions can be used as fallback providers" }, - "providerPriorityFallbackExtensionsDescription": "Otomatik yedekleme sırasında hangi yüklü indirme uzantılarının kullanılabileceğini seçin. Yerleşik sağlayıcılar hâlâ yukarıdaki öncelik sırasını takip eder.", + "providerPriorityFallbackExtensionsDescription": "Otomatik geri dönüş sırasında hangi yüklü indirme uzantılarının kullanılabileceğini seçin.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" }, @@ -4123,7 +4123,7 @@ "@extensionsFallbackSubtitle": { "description": "Subtitle for download fallback extensions menu" }, - "libraryFilesUnit": "{count, plural, =1{file} other{files}}", + "libraryFilesUnit": "{count, plural, =1{dosya} other{dosyalar}}", "@libraryFilesUnit": { "description": "Unit label for files count during library scanning", "placeholders": { @@ -4132,47 +4132,47 @@ } } }, - "libraryScanFinalizing": "Finalizing library...", + "libraryScanFinalizing": "Kütüphane sonlandırılıyor...", "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, - "libraryFilterMetadata": "Metadata", + "libraryFilterMetadata": "Meta veriler", "@libraryFilterMetadata": { "description": "Filter section - metadata completeness" }, - "libraryFilterMetadataComplete": "Complete metadata", + "libraryFilterMetadataComplete": "Tam meta veriler", "@libraryFilterMetadataComplete": { "description": "Filter option - items with complete metadata" }, - "libraryFilterMetadataMissingAny": "Missing any metadata", + "libraryFilterMetadataMissingAny": "Herhangi bir meta veri eksik", "@libraryFilterMetadataMissingAny": { "description": "Filter option - items missing any tracked metadata field" }, - "libraryFilterMetadataMissingYear": "Missing year", + "libraryFilterMetadataMissingYear": "Kayıp yıl", "@libraryFilterMetadataMissingYear": { "description": "Filter option - items missing release year/date" }, - "libraryFilterMetadataMissingGenre": "Missing genre", + "libraryFilterMetadataMissingGenre": "Eksik tür", "@libraryFilterMetadataMissingGenre": { "description": "Filter option - items missing genre" }, - "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", + "libraryFilterMetadataMissingAlbumArtist": "Kayıp albüm sanatçısı", "@libraryFilterMetadataMissingAlbumArtist": { "description": "Filter option - items missing album artist" }, - "libraryFilterSortAlbumAsc": "Album (A-Z)", + "libraryFilterSortAlbumAsc": "Albüm (A-Z)", "@libraryFilterSortAlbumAsc": { "description": "Sort option - album ascending" }, - "libraryFilterSortAlbumDesc": "Album (Z-A)", + "libraryFilterSortAlbumDesc": "Albüm (Z-A)", "@libraryFilterSortAlbumDesc": { "description": "Sort option - album descending" }, - "libraryFilterSortGenreAsc": "Genre (A-Z)", + "libraryFilterSortGenreAsc": "Tür (A-Z)", "@libraryFilterSortGenreAsc": { "description": "Sort option - genre ascending" }, - "libraryFilterSortGenreDesc": "Genre (Z-A)", + "libraryFilterSortGenreDesc": "Tür (Z-A)", "@libraryFilterSortGenreDesc": { "description": "Sort option - genre descending" }, @@ -4386,7 +4386,7 @@ "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count} tracks downloaded successfully", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -4585,5 +4585,978 @@ "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" + }, + "homeEmptyTitle": "Henüz arama sağlayıcısı yok", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Devam etmek için bir eklenti yükleyin.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "setupLanguageTitle": "Dil Seçin", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Uygulama için tercih ettiğiniz dili seçin. Bunu daha sonra Ayarlar'dan değiştirebilirsiniz.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "Sistem Varsayılanı", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "trackLyricsSource": "Kaynak: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "extensionsInstalledCount": "{count} uzantı başarıyla yüklendi", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Yüklenen uzantı sayısı: {installed} / {attempted}", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "En iyi mobil uyumluluk, M4A konteyner", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "collectionFavoriteArtists": "Favori Sanatçılar", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionArtistCount": "{count, plural, =1{1 sanatçı} other{{count} sanatçı}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionFavoriteArtistsEmptyTitle": "Henüz favori sanatçım yok", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Bir sanatçının sayfasındaki kalbe dokunarak onu burada tutmaya devam edin", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import CSV", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Search tracks...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Search for tracks", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "Starting...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BETA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } } } diff --git a/lib/l10n/arb/app_uk.arb b/lib/l10n/arb/app_uk.arb index 8e3266be..046ea09a 100644 --- a/lib/l10n/arb/app_uk.arb +++ b/lib/l10n/arb/app_uk.arb @@ -1,6 +1,6 @@ { "@@locale": "uk", - "@@last_modified": "2026-01-16", + "@@last_modified": "2026-04-28", "appName": "SpotiFLAC Mobile", "@appName": { "description": "App name - DO NOT TRANSLATE" @@ -145,7 +145,7 @@ "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Розширення будуть випробувані першими", + "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, @@ -158,11 +158,11 @@ } } }, - "optionsDefaultSearchTab": "Default Search Tab", + "optionsDefaultSearchTab": "Вкладка пошуку за замовчуванням", "@optionsDefaultSearchTab": { "description": "Title for the preferred default search tab setting" }, - "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "optionsDefaultSearchTabSubtitle": "Виберіть, яка вкладка відкриється першою для нових результатів пошуку.", "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, @@ -202,7 +202,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Вбудовувати синхронізовані тексти пісень у файли FLAC", + "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -1211,7 +1211,7 @@ "@providerPriorityFallbackExtensionsTitle": { "description": "Section title for choosing which download extensions can be used as fallback providers" }, - "providerPriorityFallbackExtensionsDescription": "Виберіть, які встановлені розширення завантаження можна використовувати під час автоматичного відновлення до попереднього режиму. Вбудовані постачальники все одно дотримуються порядку пріоритетності, зазначеного вище.", + "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" }, @@ -1441,11 +1441,11 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Сервіс, якість, формат назви файлу", + "settingsDownloadSubtitle": "Service, quality, fallback", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Резервний варіант, тексти пісень, обкладинка, оновлення", + "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", "@settingsOptionsSubtitle": { "description": "Options settings description" }, @@ -3134,7 +3134,7 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Конвертувати в MP3, Opus, ALAC або FLAC", + "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", "@trackConvertFormatSubtitle": { "description": "Subtitle for convert format menu item" }, @@ -3584,15 +3584,15 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Папки виконавців використовують \"Виконавець альбому\", коли це можливо", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when Album Artist is used for folder naming" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Папки виконавців використовують лише виконавця доріжки", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when Track Artist is used for folder naming" }, - "lyricsProvidersTitle": "Постачальники текстів пісень", + "lyricsProvidersTitle": "Lyrics Provider Priority", "@lyricsProvidersTitle": { "description": "Title for the lyrics provider priority page" }, @@ -3674,11 +3674,11 @@ "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Пожертвувати кошти", + "settingsDonate": "Support Development", "@settingsDonate": { "description": "Settings menu item - donate" }, - "settingsDonateSubtitle": "Підтримка розробки SpotiFLAC для мобільних пристроїв", + "settingsDonateSubtitle": "Buy the developer a coffee", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, @@ -3766,27 +3766,27 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Виберіть режим зберігання для завантажених файлів.", + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", "@downloadLocationSubtitle": { "description": "Subtitle text in Android download location bottom sheet" }, - "storageModeAppFolder": "Папка додатку (не SAF)", + "storageModeAppFolder": "App Folder (Recommended)", "@storageModeAppFolder": { "description": "Storage mode option - use legacy app folder" }, - "storageModeAppFolderSubtitle": "Використовувати шлях Music/SpotiFLAC за замовчуванням", + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "Папка SAF", + "storageModeSaf": "Custom Folder (SAF)", "@storageModeSaf": { "description": "Storage mode option - use Android SAF picker" }, - "storageModeSafSubtitle": "Вибрати папку через Android Storage Access Framework", + "storageModeSafSubtitle": "Pick any folder, including SD card", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFilenameDescription": "Налаштувати спосіб іменування ваших файлів.", + "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description text in filename format bottom sheet" }, @@ -3794,11 +3794,11 @@ "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Папки «Альбоми» та «Сингли»", + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is enabled" }, - "downloadSeparateSinglesDisabled": "Всі файли в одній структурі", + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is disabled" }, @@ -3806,19 +3806,19 @@ "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Створити папку джерела списку відтворення", + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", "@downloadCreatePlaylistSourceFolder": { "description": "Setting title for adding a playlist folder prefix before the normal organization structure" }, - "downloadCreatePlaylistSourceFolderEnabled": "Завантаження списків відтворення використовує Playlist/ плюс вашу звичайну структуру папок.", + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist source folder prefix is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "Завантаження списків відтворення використовують лише звичайну структуру папок.", + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist source folder prefix is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "За допомогою списку відтворення завантаження вже розміщуються в папці зі списком відтворення.", + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when playlist folder prefix setting is redundant because folder organization is already by playlist" }, @@ -3826,27 +3826,27 @@ "@downloadSongLinkRegion": { "description": "Setting title for SongLink country region" }, - "downloadNetworkCompatibilityMode": "Режим сумісності з мережею", + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", "@downloadNetworkCompatibilityMode": { "description": "Setting title for network compatibility toggle" }, - "downloadNetworkCompatibilityModeEnabled": "Увімкнено: спробувати HTTP + прийняти недійсні сертифікати TLS (небезпечно)", + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is enabled" }, - "downloadNetworkCompatibilityModeDisabled": "Вимкнено: сувора перевірка сертифіката HTTPS (рекомендовано)", + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is disabled" }, - "downloadSelectServiceToEnable": "Виберіть вбудовану службу, яку потрібно ввімкнути", + "downloadSelectServiceToEnable": "Select Tidal or Qobuz to enable this option", "@downloadSelectServiceToEnable": { "description": "Hint shown instead of Ask-quality subtitle when no built-in service selected" }, - "downloadSelectTidalQobuz": "Виберіть Tidal або Qobuz вище, щоб налаштувати якість", + "downloadSelectTidalQobuz": "Select Tidal or Qobuz to choose audio quality", "@downloadSelectTidalQobuz": { "description": "Info hint when non-Tidal/Qobuz service is selected" }, - "downloadEmbedLyricsDisabled": "Вимкнено, якщо вимкнено функцію «Вбудувати метадані»", + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle for Embed Lyrics when Embed Metadata is disabled" }, @@ -3854,11 +3854,11 @@ "@downloadNeteaseIncludeTranslation": { "description": "Toggle title for including Netease translated lyrics" }, - "downloadNeteaseIncludeTranslationEnabled": "Додати перекладені тексти пісень, коли вони доступні", + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is enabled" }, - "downloadNeteaseIncludeTranslationDisabled": "Використовувати лише оригінальні тексти пісень", + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is disabled" }, @@ -3866,23 +3866,23 @@ "@downloadNeteaseIncludeRomanization": { "description": "Toggle title for including Netease romanized lyrics" }, - "downloadNeteaseIncludeRomanizationEnabled": "Додати романізовані тексти пісень, коли це можливо", + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is enabled" }, - "downloadNeteaseIncludeRomanizationDisabled": "Вимкнути", + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is disabled" }, - "downloadAppleQqMultiPerson": "Apple/QQ Багатокористувацький переклад слово за словом", + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", "@downloadAppleQqMultiPerson": { "description": "Toggle title for Apple/QQ multi-person word-by-word lyrics" }, - "downloadAppleQqMultiPersonEnabled": "Увімкнути теги динаміка v1/v2 та [bg:]", + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person word-by-word is enabled" }, - "downloadAppleQqMultiPersonDisabled": "Спрощене послівне форматування", + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person word-by-word is disabled" }, @@ -3890,23 +3890,23 @@ "@downloadMusixmatchLanguage": { "description": "Setting title for Musixmatch language preference" }, - "downloadMusixmatchLanguageAuto": "Авто (оригінал)", + "downloadMusixmatchLanguageAuto": "Auto (original language)", "@downloadMusixmatchLanguageAuto": { "description": "Option label when Musixmatch uses original language" }, - "downloadFilterContributing": "Фільтрувати виконавців-учасників у розділі «Виконавець альбому»", + "downloadFilterContributing": "Filter Contributing Artists", "@downloadFilterContributing": { "description": "Toggle title for filtering contributing artists in Album Artist metadata" }, - "downloadFilterContributingEnabled": "Метадані виконавця альбому використовують лише основного виконавця", + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is enabled" }, - "downloadFilterContributingDisabled": "Зберегти повне значення метаданих виконавця альбому", + "downloadFilterContributingDisabled": "Full Album Artist string used", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is disabled" }, - "downloadProvidersNoneEnabled": "Не ввімкнено", + "downloadProvidersNoneEnabled": "No providers enabled", "@downloadProvidersNoneEnabled": { "description": "Subtitle for lyrics providers setting when no providers are enabled" }, @@ -3914,11 +3914,11 @@ "@downloadMusixmatchLanguageCode": { "description": "Label for the Musixmatch language code text field" }, - "downloadMusixmatchLanguageHint": "авто / en / es / ja", + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Hint text for the Musixmatch language code field" }, - "downloadMusixmatchLanguageDesc": "Встановити потрібний код мови (наприклад: en, es, ja). Залиште поле порожнім для автоматичного вибору.", + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in the Musixmatch language picker" }, @@ -3926,15 +3926,15 @@ "@downloadMusixmatchAuto": { "description": "Button to reset Musixmatch language to automatic" }, - "downloadNetworkAnySubtitle": "Wi-Fi + мобільний інтернет", + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", "@downloadNetworkAnySubtitle": { "description": "Subtitle for 'Any' network mode option" }, - "downloadNetworkWifiOnlySubtitle": "Призупинити завантаження через мобільний інтернет", + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for 'WiFi only' network mode option" }, - "downloadSongLinkRegionDesc": "Використовувати як userCountry для пошуку SongLink API.", + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", "@downloadSongLinkRegionDesc": { "description": "Description in the SongLink region picker" }, @@ -4200,7 +4200,7 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Re-analyzing audio...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, @@ -4382,7 +4382,7 @@ "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count} треки успішно завантажено", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -4465,7 +4465,7 @@ "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, - "notifDownloadingUpdate": "Завантаження SpotiFLAC Mobile v{version}", + "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", "@notifDownloadingUpdate": { "description": "Notification title while downloading an app update", "placeholders": { @@ -4493,7 +4493,7 @@ "@notifUpdateReady": { "description": "Notification title when app update download is complete" }, - "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} завантажений. Натисніть щоб установити.", + "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", "@notifUpdateReadyBody": { "description": "Notification body when app update is ready to install", "placeholders": { @@ -4581,5 +4581,978 @@ "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" + }, + "homeEmptyTitle": "No search providers yet", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Install an extension to continue.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import CSV", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Search tracks...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Search for tracks", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "Starting...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BETA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } } -} \ No newline at end of file +} diff --git a/lib/l10n/arb/app_zh_CN.arb b/lib/l10n/arb/app_zh_CN.arb index 6c7d15b8..979a4b6e 100644 --- a/lib/l10n/arb/app_zh_CN.arb +++ b/lib/l10n/arb/app_zh_CN.arb @@ -1,6 +1,6 @@ { "@@locale": "zh_CN", - "@@last_modified": "2026-01-16", + "@@last_modified": "2026-04-28", "appName": "SpotiFLAC Mobile", "@appName": { "description": "App name - DO NOT TRANSLATE" @@ -17,7 +17,7 @@ "@navSettings": { "description": "Bottom navigation - Settings tab" }, - "navStore": "Repo", + "navStore": "仓库", "@navStore": { "description": "Bottom navigation - Extension store tab" }, @@ -25,7 +25,7 @@ "@homeTitle": { "description": "Home screen title" }, - "homeSubtitle": "Paste a supported URL or search by name", + "homeSubtitle": "粘贴支持的 URL 或按名称搜索", "@homeSubtitle": { "description": "Subtitle shown below search box" }, @@ -89,11 +89,11 @@ "@downloadFilenameFormat": { "description": "Setting for output filename pattern" }, - "downloadSingleFilenameFormat": "Single Filename Format", + "downloadSingleFilenameFormat": "单曲文件名格式", "@downloadSingleFilenameFormat": { "description": "Setting for output filename pattern for singles/EPs" }, - "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", + "downloadSingleFilenameFormatDescription": "单曲和EP的文件名格式。使用与专辑格式相同的标签。", "@downloadSingleFilenameFormatDescription": { "description": "Subtitle description for single filename format setting" }, @@ -145,7 +145,7 @@ "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "按歌曲名称搜索时使用的服务。", + "optionsPrimaryProviderSubtitle": "用于按曲目或专辑名称搜索的服务", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, @@ -158,11 +158,11 @@ } } }, - "optionsDefaultSearchTab": "Default Search Tab", + "optionsDefaultSearchTab": "默认搜索栏", "@optionsDefaultSearchTab": { "description": "Title for the preferred default search tab setting" }, - "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "optionsDefaultSearchTabSubtitle": "选择新搜索结果首先打开的标签页。", "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, @@ -202,7 +202,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "嵌入已同步歌词到 FLAC 文件", + "optionsEmbedLyricsSubtitle": "将同步的歌词与你下载的音轨一起保存", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -218,15 +218,15 @@ "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" }, - "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", + "optionsReplayGainSubtitleOn": "扫描响度并嵌入 ReplayGain 标签(EBU R128)", "@optionsReplayGainSubtitleOn": { "description": "Subtitle when ReplayGain is enabled" }, - "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", + "optionsReplayGainSubtitleOff": "已禁用:不添加响度标准化标签", "@optionsReplayGainSubtitleOff": { "description": "Subtitle when ReplayGain is disabled" }, - "optionsArtistTagMode": "Artist Tag Mode", + "optionsArtistTagMode": "艺术家标签模式", "@optionsArtistTagMode": { "description": "Setting title for how artist metadata is written into files" }, @@ -1441,11 +1441,11 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Service, quality, filename format", + "settingsDownloadSubtitle": "Service, quality, fallback", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, lyrics, cover art, updates", + "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", "@settingsOptionsSubtitle": { "description": "Options settings description" }, @@ -3134,7 +3134,7 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to MP3, Opus, ALAC, or FLAC", + "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", "@trackConvertFormatSubtitle": { "description": "Subtitle for convert format menu item" }, @@ -3584,15 +3584,15 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Artist folders use Album Artist when available", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when Album Artist is used for folder naming" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Artist folders use Track Artist only", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when Track Artist is used for folder naming" }, - "lyricsProvidersTitle": "Lyrics Providers", + "lyricsProvidersTitle": "Lyrics Provider Priority", "@lyricsProvidersTitle": { "description": "Title for the lyrics provider priority page" }, @@ -3674,11 +3674,11 @@ "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Donate", + "settingsDonate": "Support Development", "@settingsDonate": { "description": "Settings menu item - donate" }, - "settingsDonateSubtitle": "Support SpotiFLAC-Mobile development", + "settingsDonateSubtitle": "Buy the developer a coffee", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, @@ -3766,27 +3766,27 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose storage mode for downloaded files.", + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", "@downloadLocationSubtitle": { "description": "Subtitle text in Android download location bottom sheet" }, - "storageModeAppFolder": "App folder (non-SAF)", + "storageModeAppFolder": "App Folder (Recommended)", "@storageModeAppFolder": { "description": "Storage mode option - use legacy app folder" }, - "storageModeAppFolderSubtitle": "Use default Music/SpotiFLAC path", + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "SAF folder", + "storageModeSaf": "Custom Folder (SAF)", "@storageModeSaf": { "description": "Storage mode option - use Android SAF picker" }, - "storageModeSafSubtitle": "Pick folder via Android Storage Access Framework", + "storageModeSafSubtitle": "Pick any folder, including SD card", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFilenameDescription": "Customize how your files are named.", + "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description text in filename format bottom sheet" }, @@ -3794,11 +3794,11 @@ "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Albums/ and Singles/ folders", + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is enabled" }, - "downloadSeparateSinglesDisabled": "All files in same structure", + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is disabled" }, @@ -3806,19 +3806,19 @@ "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Create playlist source folder", + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", "@downloadCreatePlaylistSourceFolder": { "description": "Setting title for adding a playlist folder prefix before the normal organization structure" }, - "downloadCreatePlaylistSourceFolderEnabled": "Playlist downloads use Playlist/ plus your normal folder structure.", + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist source folder prefix is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "Playlist downloads use the normal folder structure only.", + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist source folder prefix is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "By Playlist already places downloads inside a playlist folder.", + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when playlist folder prefix setting is redundant because folder organization is already by playlist" }, @@ -3826,27 +3826,27 @@ "@downloadSongLinkRegion": { "description": "Setting title for SongLink country region" }, - "downloadNetworkCompatibilityMode": "Network compatibility mode", + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", "@downloadNetworkCompatibilityMode": { "description": "Setting title for network compatibility toggle" }, - "downloadNetworkCompatibilityModeEnabled": "Enabled: try HTTP + accept invalid TLS certificates (unsafe)", + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is enabled" }, - "downloadNetworkCompatibilityModeDisabled": "Off: strict HTTPS certificate validation (recommended)", + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is disabled" }, - "downloadSelectServiceToEnable": "Select a built-in service to enable", + "downloadSelectServiceToEnable": "Select Tidal or Qobuz to enable this option", "@downloadSelectServiceToEnable": { "description": "Hint shown instead of Ask-quality subtitle when no built-in service selected" }, - "downloadSelectTidalQobuz": "Select Tidal or Qobuz above to configure quality", + "downloadSelectTidalQobuz": "Select Tidal or Qobuz to choose audio quality", "@downloadSelectTidalQobuz": { "description": "Info hint when non-Tidal/Qobuz service is selected" }, - "downloadEmbedLyricsDisabled": "Disabled while Embed Metadata is turned off", + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle for Embed Lyrics when Embed Metadata is disabled" }, @@ -3854,11 +3854,11 @@ "@downloadNeteaseIncludeTranslation": { "description": "Toggle title for including Netease translated lyrics" }, - "downloadNeteaseIncludeTranslationEnabled": "Append translated lyrics when available", + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is enabled" }, - "downloadNeteaseIncludeTranslationDisabled": "Use original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is disabled" }, @@ -3866,23 +3866,23 @@ "@downloadNeteaseIncludeRomanization": { "description": "Toggle title for including Netease romanized lyrics" }, - "downloadNeteaseIncludeRomanizationEnabled": "Append romanized lyrics when available", + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is enabled" }, - "downloadNeteaseIncludeRomanizationDisabled": "Disabled", + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is disabled" }, - "downloadAppleQqMultiPerson": "Apple/QQ Multi-Person Word-by-Word", + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", "@downloadAppleQqMultiPerson": { "description": "Toggle title for Apple/QQ multi-person word-by-word lyrics" }, - "downloadAppleQqMultiPersonEnabled": "Enable v1/v2 speaker and [bg:] tags", + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person word-by-word is enabled" }, - "downloadAppleQqMultiPersonDisabled": "Simplified word-by-word formatting", + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person word-by-word is disabled" }, @@ -3890,23 +3890,23 @@ "@downloadMusixmatchLanguage": { "description": "Setting title for Musixmatch language preference" }, - "downloadMusixmatchLanguageAuto": "Auto (original)", + "downloadMusixmatchLanguageAuto": "Auto (original language)", "@downloadMusixmatchLanguageAuto": { "description": "Option label when Musixmatch uses original language" }, - "downloadFilterContributing": "Filter contributing artists in Album Artist", + "downloadFilterContributing": "Filter Contributing Artists", "@downloadFilterContributing": { "description": "Toggle title for filtering contributing artists in Album Artist metadata" }, - "downloadFilterContributingEnabled": "Album Artist metadata uses primary artist only", + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is enabled" }, - "downloadFilterContributingDisabled": "Keep full Album Artist metadata value", + "downloadFilterContributingDisabled": "Full Album Artist string used", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is disabled" }, - "downloadProvidersNoneEnabled": "None enabled", + "downloadProvidersNoneEnabled": "No providers enabled", "@downloadProvidersNoneEnabled": { "description": "Subtitle for lyrics providers setting when no providers are enabled" }, @@ -3914,11 +3914,11 @@ "@downloadMusixmatchLanguageCode": { "description": "Label for the Musixmatch language code text field" }, - "downloadMusixmatchLanguageHint": "auto / en / es / ja", + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Hint text for the Musixmatch language code field" }, - "downloadMusixmatchLanguageDesc": "Set preferred language code (example: en, es, ja). Leave empty for auto.", + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in the Musixmatch language picker" }, @@ -3926,15 +3926,15 @@ "@downloadMusixmatchAuto": { "description": "Button to reset Musixmatch language to automatic" }, - "downloadNetworkAnySubtitle": "WiFi + Mobile Data", + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", "@downloadNetworkAnySubtitle": { "description": "Subtitle for 'Any' network mode option" }, - "downloadNetworkWifiOnlySubtitle": "Pause downloads on mobile data", + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for 'WiFi only' network mode option" }, - "downloadSongLinkRegionDesc": "Used as userCountry for SongLink API lookup.", + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", "@downloadSongLinkRegionDesc": { "description": "Description in the SongLink region picker" }, @@ -4200,7 +4200,7 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Re-analyzing audio...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, @@ -4382,7 +4382,7 @@ "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count} tracks downloaded successfully", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -4581,5 +4581,978 @@ "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" + }, + "homeEmptyTitle": "暂无搜索提供商", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "安装一个拓展以继续。", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import CSV", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Search tracks...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Search for tracks", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "Starting...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BETA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } } } diff --git a/lib/l10n/arb/app_zh_TW.arb b/lib/l10n/arb/app_zh_TW.arb index b2fc74b9..0b5eeb5c 100644 --- a/lib/l10n/arb/app_zh_TW.arb +++ b/lib/l10n/arb/app_zh_TW.arb @@ -1,6 +1,6 @@ { "@@locale": "zh_TW", - "@@last_modified": "2026-01-16", + "@@last_modified": "2026-04-28", "appName": "SpotiFLAC Mobile", "@appName": { "description": "App name - DO NOT TRANSLATE" @@ -145,7 +145,7 @@ "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Service used when searching by track name.", + "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, @@ -202,7 +202,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Embed synced lyrics into FLAC files", + "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -1441,11 +1441,11 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Service, quality, filename format", + "settingsDownloadSubtitle": "Service, quality, fallback", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, lyrics, cover art, updates", + "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", "@settingsOptionsSubtitle": { "description": "Options settings description" }, @@ -3134,7 +3134,7 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to MP3, Opus, ALAC, or FLAC", + "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", "@trackConvertFormatSubtitle": { "description": "Subtitle for convert format menu item" }, @@ -3584,15 +3584,15 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Artist folders use Album Artist when available", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when Album Artist is used for folder naming" }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Artist folders use Track Artist only", + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "@downloadUseAlbumArtistForFoldersTrackSubtitle": { "description": "Subtitle when Track Artist is used for folder naming" }, - "lyricsProvidersTitle": "Lyrics Providers", + "lyricsProvidersTitle": "Lyrics Provider Priority", "@lyricsProvidersTitle": { "description": "Title for the lyrics provider priority page" }, @@ -3674,11 +3674,11 @@ "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "Donate", + "settingsDonate": "Support Development", "@settingsDonate": { "description": "Settings menu item - donate" }, - "settingsDonateSubtitle": "Support SpotiFLAC-Mobile development", + "settingsDonateSubtitle": "Buy the developer a coffee", "@settingsDonateSubtitle": { "description": "Subtitle for donate menu item" }, @@ -3766,27 +3766,27 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "Choose storage mode for downloaded files.", + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", "@downloadLocationSubtitle": { "description": "Subtitle text in Android download location bottom sheet" }, - "storageModeAppFolder": "App folder (non-SAF)", + "storageModeAppFolder": "App Folder (Recommended)", "@storageModeAppFolder": { "description": "Storage mode option - use legacy app folder" }, - "storageModeAppFolderSubtitle": "Use default Music/SpotiFLAC path", + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "SAF folder", + "storageModeSaf": "Custom Folder (SAF)", "@storageModeSaf": { "description": "Storage mode option - use Android SAF picker" }, - "storageModeSafSubtitle": "Pick folder via Android Storage Access Framework", + "storageModeSafSubtitle": "Pick any folder, including SD card", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFilenameDescription": "Customize how your files are named.", + "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description text in filename format bottom sheet" }, @@ -3794,11 +3794,11 @@ "@downloadFilenameInsertTag": { "description": "Label above filename tag chips" }, - "downloadSeparateSinglesEnabled": "Albums/ and Singles/ folders", + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", "@downloadSeparateSinglesEnabled": { "description": "Subtitle when separate singles folder is enabled" }, - "downloadSeparateSinglesDisabled": "All files in same structure", + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", "@downloadSeparateSinglesDisabled": { "description": "Subtitle when separate singles folder is disabled" }, @@ -3806,19 +3806,19 @@ "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Create playlist source folder", + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", "@downloadCreatePlaylistSourceFolder": { "description": "Setting title for adding a playlist folder prefix before the normal organization structure" }, - "downloadCreatePlaylistSourceFolderEnabled": "Playlist downloads use Playlist/ plus your normal folder structure.", + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist source folder prefix is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "Playlist downloads use the normal folder structure only.", + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist source folder prefix is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "By Playlist already places downloads inside a playlist folder.", + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when playlist folder prefix setting is redundant because folder organization is already by playlist" }, @@ -3826,27 +3826,27 @@ "@downloadSongLinkRegion": { "description": "Setting title for SongLink country region" }, - "downloadNetworkCompatibilityMode": "Network compatibility mode", + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", "@downloadNetworkCompatibilityMode": { "description": "Setting title for network compatibility toggle" }, - "downloadNetworkCompatibilityModeEnabled": "Enabled: try HTTP + accept invalid TLS certificates (unsafe)", + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is enabled" }, - "downloadNetworkCompatibilityModeDisabled": "Off: strict HTTPS certificate validation (recommended)", + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is disabled" }, - "downloadSelectServiceToEnable": "Select a built-in service to enable", + "downloadSelectServiceToEnable": "Select Tidal or Qobuz to enable this option", "@downloadSelectServiceToEnable": { "description": "Hint shown instead of Ask-quality subtitle when no built-in service selected" }, - "downloadSelectTidalQobuz": "Select Tidal or Qobuz above to configure quality", + "downloadSelectTidalQobuz": "Select Tidal or Qobuz to choose audio quality", "@downloadSelectTidalQobuz": { "description": "Info hint when non-Tidal/Qobuz service is selected" }, - "downloadEmbedLyricsDisabled": "Disabled while Embed Metadata is turned off", + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle for Embed Lyrics when Embed Metadata is disabled" }, @@ -3854,11 +3854,11 @@ "@downloadNeteaseIncludeTranslation": { "description": "Toggle title for including Netease translated lyrics" }, - "downloadNeteaseIncludeTranslationEnabled": "Append translated lyrics when available", + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is enabled" }, - "downloadNeteaseIncludeTranslationDisabled": "Use original lyrics only", + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is disabled" }, @@ -3866,23 +3866,23 @@ "@downloadNeteaseIncludeRomanization": { "description": "Toggle title for including Netease romanized lyrics" }, - "downloadNeteaseIncludeRomanizationEnabled": "Append romanized lyrics when available", + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is enabled" }, - "downloadNeteaseIncludeRomanizationDisabled": "Disabled", + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is disabled" }, - "downloadAppleQqMultiPerson": "Apple/QQ Multi-Person Word-by-Word", + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", "@downloadAppleQqMultiPerson": { "description": "Toggle title for Apple/QQ multi-person word-by-word lyrics" }, - "downloadAppleQqMultiPersonEnabled": "Enable v1/v2 speaker and [bg:] tags", + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person word-by-word is enabled" }, - "downloadAppleQqMultiPersonDisabled": "Simplified word-by-word formatting", + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person word-by-word is disabled" }, @@ -3890,23 +3890,23 @@ "@downloadMusixmatchLanguage": { "description": "Setting title for Musixmatch language preference" }, - "downloadMusixmatchLanguageAuto": "Auto (original)", + "downloadMusixmatchLanguageAuto": "Auto (original language)", "@downloadMusixmatchLanguageAuto": { "description": "Option label when Musixmatch uses original language" }, - "downloadFilterContributing": "Filter contributing artists in Album Artist", + "downloadFilterContributing": "Filter Contributing Artists", "@downloadFilterContributing": { "description": "Toggle title for filtering contributing artists in Album Artist metadata" }, - "downloadFilterContributingEnabled": "Album Artist metadata uses primary artist only", + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is enabled" }, - "downloadFilterContributingDisabled": "Keep full Album Artist metadata value", + "downloadFilterContributingDisabled": "Full Album Artist string used", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is disabled" }, - "downloadProvidersNoneEnabled": "None enabled", + "downloadProvidersNoneEnabled": "No providers enabled", "@downloadProvidersNoneEnabled": { "description": "Subtitle for lyrics providers setting when no providers are enabled" }, @@ -3914,11 +3914,11 @@ "@downloadMusixmatchLanguageCode": { "description": "Label for the Musixmatch language code text field" }, - "downloadMusixmatchLanguageHint": "auto / en / es / ja", + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Hint text for the Musixmatch language code field" }, - "downloadMusixmatchLanguageDesc": "Set preferred language code (example: en, es, ja). Leave empty for auto.", + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", "@downloadMusixmatchLanguageDesc": { "description": "Description in the Musixmatch language picker" }, @@ -3926,15 +3926,15 @@ "@downloadMusixmatchAuto": { "description": "Button to reset Musixmatch language to automatic" }, - "downloadNetworkAnySubtitle": "WiFi + Mobile Data", + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", "@downloadNetworkAnySubtitle": { "description": "Subtitle for 'Any' network mode option" }, - "downloadNetworkWifiOnlySubtitle": "Pause downloads on mobile data", + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", "@downloadNetworkWifiOnlySubtitle": { "description": "Subtitle for 'WiFi only' network mode option" }, - "downloadSongLinkRegionDesc": "Used as userCountry for SongLink API lookup.", + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", "@downloadSongLinkRegionDesc": { "description": "Description in the SongLink region picker" }, @@ -4200,7 +4200,7 @@ "@audioAnalysisRescan": { "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" }, - "audioAnalysisRescanning": "Re-analyzing audio...", + "audioAnalysisRescanning": "Re-analyzing audio...", "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, @@ -4382,7 +4382,7 @@ "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" }, - "notifTracksDownloadedSuccess": "{count} tracks downloaded successfully", + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", "@notifTracksDownloadedSuccess": { "description": "Notification body for queue complete - how many tracks were downloaded", "placeholders": { @@ -4581,5 +4581,978 @@ "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" + }, + "homeEmptyTitle": "No search providers yet", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Install an extension to continue.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Tidal lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps Tidal lossy option" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import CSV", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "searchTracksHint": "Search tracks...", + "@searchTracksHint": { + "description": "Placeholder for the search screen input" + }, + "searchTracksEmptyPrompt": "Search for tracks", + "@searchTracksEmptyPrompt": { + "description": "Empty-state prompt on the search screen" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", + "@optionsMaxQualityCoverSubtitleDisabled": { + "description": "Subtitle for max quality cover when metadata embedding is disabled" + }, + "downloadFilenameHintExample": "{artist} - {title}", + "@downloadFilenameHintExample": { + "description": "Example placeholder for the download filename format input" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "Starting...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "BETA", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", + "@errorCouldNotKeepFolderAccess": { + "description": "Error when persistent folder access cannot be saved" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } } }