mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-07-31 08:17:22 +02:00
The Dart queue loop was already built around an activeDownloads map and per-item progress tracking but was gated to one download at a time. Add a concurrentDownloads setting (1-3, default 1) exposed in Download Settings > Performance, and let the scheduler keep up to that many items in flight. The experimental Android native worker is still strictly sequential, so it is skipped in favor of the Dart queue while concurrency is enabled.
4799 lines
119 KiB
Dart
4799 lines
119 KiB
Dart
// ignore: unused_import
|
|
import 'package:intl/intl.dart' as intl;
|
|
import 'app_localizations.dart';
|
|
|
|
// ignore_for_file: type=lint
|
|
|
|
/// The translations for Korean (`ko`).
|
|
class AppLocalizationsKo extends AppLocalizations {
|
|
AppLocalizationsKo([String locale = 'ko']) : super(locale);
|
|
|
|
@override
|
|
String get appName => 'SpotiFLAC Mobile';
|
|
|
|
@override
|
|
String get navHome => '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 => '지원되는 URL을 붙여 넣거나, 이름을 검색';
|
|
|
|
@override
|
|
String get homeEmptyTitle => 'No search providers yet';
|
|
|
|
@override
|
|
String get homeEmptySubtitle => 'Install an extension to continue.';
|
|
|
|
@override
|
|
String get homeSupports => '지원 항목: 트랙, 앨범, 플레이리스트, 아티스트 URLs';
|
|
|
|
@override
|
|
String get homeRecent => '최근 기록';
|
|
|
|
@override
|
|
String get historyFilterAll => 'All';
|
|
|
|
@override
|
|
String get historyFilterAlbums => 'Albums';
|
|
|
|
@override
|
|
String get historyFilterSingles => 'Singles';
|
|
|
|
@override
|
|
String get historySearchHint => '검색 기록...';
|
|
|
|
@override
|
|
String get settingsTitle => 'Settings';
|
|
|
|
@override
|
|
String get settingsDownload => '다운로드';
|
|
|
|
@override
|
|
String get settingsAppearance => '외관';
|
|
|
|
@override
|
|
String get settingsOptions => '옵션';
|
|
|
|
@override
|
|
String get settingsExtensions => '확장 기능';
|
|
|
|
@override
|
|
String get settingsAbout => '정보';
|
|
|
|
@override
|
|
String get downloadTitle => '다운로드';
|
|
|
|
@override
|
|
String get downloadAskQualitySubtitle => '다운로드를 할 때마다 품질을 선택하도록 합니다';
|
|
|
|
@override
|
|
String get downloadFilenameFormat => '파일 이름 형식';
|
|
|
|
@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 => '폴더 분류 형식';
|
|
|
|
@override
|
|
String get appearanceTitle => '외관';
|
|
|
|
@override
|
|
String get appearanceThemeSystem => 'System';
|
|
|
|
@override
|
|
String get appearanceThemeLight => '밝은';
|
|
|
|
@override
|
|
String get appearanceThemeDark => '다크';
|
|
|
|
@override
|
|
String get appearanceDynamicColor => 'Dynamic Color';
|
|
|
|
@override
|
|
String get appearanceDynamicColorSubtitle => '배경 화면을 참고하여 강조 색상이 지정됩니다';
|
|
|
|
@override
|
|
String get appearanceHistoryView => '기록 정렬 방식';
|
|
|
|
@override
|
|
String get appearanceHistoryViewList => 'List';
|
|
|
|
@override
|
|
String get appearanceHistoryViewGrid => 'Grid';
|
|
|
|
@override
|
|
String get optionsTitle => '옵션';
|
|
|
|
@override
|
|
String get optionsPrimaryProvider => '기본 제공자';
|
|
|
|
@override
|
|
String get optionsPrimaryProviderSubtitle =>
|
|
'Service used for searching by track or album name';
|
|
|
|
@override
|
|
String optionsUsingExtension(String extensionName) {
|
|
return '확장 기능을 사용: $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 =>
|
|
'Choose the default search provider to switch back from an extension';
|
|
|
|
@override
|
|
String get optionsAutoFallback => '자동 재시도';
|
|
|
|
@override
|
|
String get optionsAutoFallbackSubtitle => '다운로드가 실패한 경우, 다른 서비스로 재시도';
|
|
|
|
@override
|
|
String get optionsUseExtensionProviders => '확장 기능 사용';
|
|
|
|
@override
|
|
String get optionsUseExtensionProvidersOn =>
|
|
'Extension providers are enabled';
|
|
|
|
@override
|
|
String get optionsUseExtensionProvidersOff =>
|
|
'Extension providers are required';
|
|
|
|
@override
|
|
String get optionsEmbedLyrics => '가사 삽입';
|
|
|
|
@override
|
|
String get optionsEmbedLyricsSubtitle =>
|
|
'Save synced lyrics alongside your downloaded tracks';
|
|
|
|
@override
|
|
String get optionsMaxQualityCover => '고품질 커버 이미지';
|
|
|
|
@override
|
|
String get optionsMaxQualityCoverSubtitle => '최고 품질의 커버 이미지를 다운로드';
|
|
|
|
@override
|
|
String get optionsReplayGain => 'ReplayGain';
|
|
|
|
@override
|
|
String get optionsReplayGainSubtitleOn =>
|
|
'Scan loudness and embed ReplayGain tags (EBU R128)';
|
|
|
|
@override
|
|
String get optionsReplayGainSubtitleOff =>
|
|
'Disabled: no loudness normalization tags';
|
|
|
|
@override
|
|
String get trackReplayGain => 'Rescan ReplayGain';
|
|
|
|
@override
|
|
String get trackReplayGainSubtitle =>
|
|
'Analyze loudness and write ReplayGain tags';
|
|
|
|
@override
|
|
String get trackReplayGainScanning => 'Analyzing loudness...';
|
|
|
|
@override
|
|
String get trackReplayGainSuccess => 'ReplayGain tags added';
|
|
|
|
@override
|
|
String get trackReplayGainFailed => 'Failed to add ReplayGain tags';
|
|
|
|
@override
|
|
String selectionReplayGainCount(int count) {
|
|
return 'ReplayGain ($count)';
|
|
}
|
|
|
|
@override
|
|
String get replayGainBatchConfirmTitle => 'Add ReplayGain';
|
|
|
|
@override
|
|
String replayGainBatchConfirmMessage(int count) {
|
|
return 'Analyze loudness and write ReplayGain tags to $count track(s)?';
|
|
}
|
|
|
|
@override
|
|
String get replayGainBatchAnalyzing => 'Analyzing ReplayGain...';
|
|
|
|
@override
|
|
String replayGainBatchSuccess(int success, int total) {
|
|
return 'ReplayGain added to $success of $total tracks';
|
|
}
|
|
|
|
@override
|
|
String get optionsArtistTagMode => 'Artist Tag Mode';
|
|
|
|
@override
|
|
String get optionsArtistTagModeDescription =>
|
|
'Choose how multiple artists are written into embedded tags.';
|
|
|
|
@override
|
|
String get optionsArtistTagModeJoined => 'Single joined value';
|
|
|
|
@override
|
|
String get optionsArtistTagModeJoinedSubtitle =>
|
|
'Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.';
|
|
|
|
@override
|
|
String get optionsArtistTagModeSplitVorbis => 'Split tags for FLAC/Opus';
|
|
|
|
@override
|
|
String get optionsArtistTagModeSplitVorbisSubtitle =>
|
|
'Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.';
|
|
|
|
@override
|
|
String get optionsExtensionStore => 'Extension Repo';
|
|
|
|
@override
|
|
String get optionsExtensionStoreSubtitle => 'Show Repo tab in navigation';
|
|
|
|
@override
|
|
String get optionsCheckUpdates => '업데이트 확인';
|
|
|
|
@override
|
|
String get optionsCheckUpdatesSubtitle => '새로운 버전이 출시되면 알림';
|
|
|
|
@override
|
|
String get optionsUpdateChannel => '업데이트 채널';
|
|
|
|
@override
|
|
String get optionsUpdateChannelStable => '안정적인 버전만 수령';
|
|
|
|
@override
|
|
String get optionsUpdateChannelPreview => '미리보기 버전을 수령';
|
|
|
|
@override
|
|
String get optionsUpdateChannelWarning => '미리보기 버전은 불안정할 수 있습니다';
|
|
|
|
@override
|
|
String get optionsClearHistory => '다운로드 기록 삭제';
|
|
|
|
@override
|
|
String get optionsClearHistorySubtitle => '기록에서 모든 다운로드 음반을 제거합니다';
|
|
|
|
@override
|
|
String get optionsDetailedLogging => '상세 로깅';
|
|
|
|
@override
|
|
String get optionsDetailedLoggingOn => '상세한 로그가 기록되고 있습니다';
|
|
|
|
@override
|
|
String get optionsDetailedLoggingOff => '버그 신고를 위한 기능입니다';
|
|
|
|
@override
|
|
String get optionsSpotifyCredentials => 'Spotify 자격 증명';
|
|
|
|
@override
|
|
String optionsSpotifyCredentialsConfigured(String clientId) {
|
|
return 'Client ID: $clientId...';
|
|
}
|
|
|
|
@override
|
|
String get optionsSpotifyCredentialsRequired => '탭하여 설정';
|
|
|
|
@override
|
|
String get optionsSpotifyWarning =>
|
|
'Spotify는 사용자 고유의 API 자격 증명을 요구합니다. developer.spotify.com에서 무료로 발급받으세요';
|
|
|
|
@override
|
|
String get optionsSpotifyDeprecationWarning =>
|
|
'Spotify API 변경으로 인해 Spotify 검색 기능은 2026년 3월 3일부터 더 이상 지원되지 않습니다. Deezer로 전환해 주세요';
|
|
|
|
@override
|
|
String get extensionsTitle => '확장 기능';
|
|
|
|
@override
|
|
String get extensionsDisabled => '비활성화';
|
|
|
|
@override
|
|
String extensionsVersion(String version) {
|
|
return 'Version $version';
|
|
}
|
|
|
|
@override
|
|
String extensionsAuthor(String author) {
|
|
return 'by $author';
|
|
}
|
|
|
|
@override
|
|
String get extensionsUninstall => '삭제';
|
|
|
|
@override
|
|
String get storeTitle => 'Extension Repo';
|
|
|
|
@override
|
|
String get storeSearch => '확장 기능 검색';
|
|
|
|
@override
|
|
String get storeInstall => '설치';
|
|
|
|
@override
|
|
String get storeInstalled => '설치됨';
|
|
|
|
@override
|
|
String get storeUpdate => '업데이트';
|
|
|
|
@override
|
|
String get aboutTitle => '정보';
|
|
|
|
@override
|
|
String get aboutContributors => '기여자';
|
|
|
|
@override
|
|
String get aboutMobileDeveloper => '모바일 버전 개발자';
|
|
|
|
@override
|
|
String get aboutOriginalCreator => '오리지널 SpotiFLAC 제작자';
|
|
|
|
@override
|
|
String get aboutLogoArtist => '아름다운 로고를 만들어주신 재능 있는 아티스트!';
|
|
|
|
@override
|
|
String get aboutTranslators => '번역가들';
|
|
|
|
@override
|
|
String get aboutSpecialThanks => '특별 감사';
|
|
|
|
@override
|
|
String get aboutLinks => '바로가기';
|
|
|
|
@override
|
|
String get aboutMobileSource => 'Mobile source code';
|
|
|
|
@override
|
|
String get aboutPCSource => 'PC 소스 코드';
|
|
|
|
@override
|
|
String get aboutKeepAndroidOpen => 'Keep Android Open';
|
|
|
|
@override
|
|
String get aboutReportIssue => '문제 신고';
|
|
|
|
@override
|
|
String get aboutReportIssueSubtitle => '발생하는 모든 문제를 신고하여 주세요.';
|
|
|
|
@override
|
|
String get aboutFeatureRequest => '기능 요청';
|
|
|
|
@override
|
|
String get aboutFeatureRequestSubtitle => '앱의 새로운 기능을 제안하여 주세요.';
|
|
|
|
@override
|
|
String get aboutTelegramChannel => 'Telegram Channel';
|
|
|
|
@override
|
|
String get aboutTelegramChannelSubtitle => '공지 및 업데이트 안내';
|
|
|
|
@override
|
|
String get aboutTelegramChat => 'Telegram Community';
|
|
|
|
@override
|
|
String get aboutTelegramChatSubtitle => '다른 이용자와 소통';
|
|
|
|
@override
|
|
String get aboutSocial => '소셜';
|
|
|
|
@override
|
|
String get aboutApp => 'App';
|
|
|
|
@override
|
|
String get aboutVersion => 'Version';
|
|
|
|
@override
|
|
String get aboutBinimumDesc =>
|
|
'The creator of QQDL & HiFi API. This project helped shape lossless download support.';
|
|
|
|
@override
|
|
String get aboutSachinsenalDesc =>
|
|
'The original HiFi project creator. A foundation for lossless-source integration.';
|
|
|
|
@override
|
|
String get aboutSjdonadoDesc =>
|
|
'I Don\'t Have Spotify(IDHS) 개발자입니다. 위급 상황 발생 시 해결해 주는 대체 링크 해결 도구를 만들었습니다!';
|
|
|
|
@override
|
|
String get aboutAppDescription =>
|
|
'Search music metadata, manage extensions, and organize your library.';
|
|
|
|
@override
|
|
String get artistAlbums => '앨범';
|
|
|
|
@override
|
|
String get artistSingles => '싱글 및 EP';
|
|
|
|
@override
|
|
String get artistCompilations => '편집';
|
|
|
|
@override
|
|
String get artistPopular => '인기순';
|
|
|
|
@override
|
|
String artistMonthlyListeners(String count) {
|
|
return '월간 청취자: $count';
|
|
}
|
|
|
|
@override
|
|
String get trackMetadataService => '제공업체';
|
|
|
|
@override
|
|
String get trackMetadataPlay => '재생';
|
|
|
|
@override
|
|
String get trackMetadataShare => '공유';
|
|
|
|
@override
|
|
String get trackMetadataDelete => '삭제';
|
|
|
|
@override
|
|
String get setupGrantPermission => '권한을 제공해 주세요.';
|
|
|
|
@override
|
|
String get setupSkip => '다음에 할래요';
|
|
|
|
@override
|
|
String get setupStorageAccessRequired => '스토리지 접근 권한 필요';
|
|
|
|
@override
|
|
String get setupStorageAccessMessageAndroid11 =>
|
|
'Android 11 이상 버전에서는 선택한 다운로드 폴더에 파일을 저장하려면 \"모든 파일 접근\" 권한이 필요합니다.';
|
|
|
|
@override
|
|
String get setupOpenSettings => '설정으로 이동';
|
|
|
|
@override
|
|
String get setupPermissionDeniedMessage =>
|
|
'권한이 거부되었습니다. 계속하려면 모든 권한을 허용해 주세요.';
|
|
|
|
@override
|
|
String setupPermissionRequired(String permissionType) {
|
|
return '$permissionType 권한 필요';
|
|
}
|
|
|
|
@override
|
|
String setupPermissionRequiredMessage(String permissionType) {
|
|
return '최상의 사용 경험을 위해 $permissionType 권한이 필요합니다. 설정에서 나중에 변경할 수 있습니다.';
|
|
}
|
|
|
|
@override
|
|
String get setupUseDefaultFolder => '기본 폴더를 사용하시겠습니까?';
|
|
|
|
@override
|
|
String get setupNoFolderSelected => '선택된 폴더가 없습니다. 기본 음악 폴더를 사용하시겠습니까?';
|
|
|
|
@override
|
|
String get setupUseDefault => '기본값 사용';
|
|
|
|
@override
|
|
String get setupDownloadLocationTitle => '다운로드 경로';
|
|
|
|
@override
|
|
String get setupDownloadLocationIosMessage =>
|
|
'iOS에서는 다운로드한 파일이 앱의 문서 폴더에 저장됩니다. 파일 앱을 통해 해당 파일에 접근할 수 있습니다.';
|
|
|
|
@override
|
|
String get setupAppDocumentsFolder => '앱 문서 폴더';
|
|
|
|
@override
|
|
String get setupAppDocumentsFolderSubtitle => '권장 사항 - 파일 앱을 통해 접근 가능';
|
|
|
|
@override
|
|
String get setupChooseFromFiles => '파일 탐색기에서 선택';
|
|
|
|
@override
|
|
String get setupChooseFromFilesSubtitle => 'iCloud 또는 다른 위치를 선택하세요';
|
|
|
|
@override
|
|
String get setupIosEmptyFolderWarning =>
|
|
'iOS 제한 사항: 빈 폴더는 선택할 수 없습니다. 파일이 하나 이상 있는 폴더를 선택하세요.';
|
|
|
|
@override
|
|
String get setupIcloudNotSupported =>
|
|
'iCloud Drive는 지원되지 않습니다. 앱의 문서 폴더를 사용해 주세요.';
|
|
|
|
@override
|
|
String get setupDownloadInFlac => 'Spotify 음악을 FLAC 형식으로 다운로드하세요.';
|
|
|
|
@override
|
|
String get setupStorageGranted => '저장소 접근 권한이 부여되었습니다!';
|
|
|
|
@override
|
|
String get setupStorageRequired => '저장소 접근 권한이 필요합니다.';
|
|
|
|
@override
|
|
String get setupStorageDescription =>
|
|
'SpotiFLAC은 다운로드한 음악 파일을 저장하기 위해 저장소 접근 권한이 필요합니다.';
|
|
|
|
@override
|
|
String get setupNotificationGranted => '알림 권한이 부여되었습니다!';
|
|
|
|
@override
|
|
String get setupNotificationEnable => '알림 활성화';
|
|
|
|
@override
|
|
String get setupFolderChoose => '다운로드 폴더를 선택하세요';
|
|
|
|
@override
|
|
String get setupFolderDescription => '다운로드한 음악 파일이 저장될 폴더를 선택하세요.';
|
|
|
|
@override
|
|
String get setupSelectFolder => '폴더 선택';
|
|
|
|
@override
|
|
String get setupEnableNotifications => '알림 활성화';
|
|
|
|
@override
|
|
String get setupNotificationBackgroundDescription =>
|
|
'알림으로 다운로드 진행 상황을 확인하세요. 앱이 백그라운드에서 실행 중일 때 다운로드 상태와 완료 여부를 확인할 수 있습니다.';
|
|
|
|
@override
|
|
String get setupSkipForNow => '다음에 할래요.';
|
|
|
|
@override
|
|
String get setupNext => '다음';
|
|
|
|
@override
|
|
String get setupGetStarted => '시작하기';
|
|
|
|
@override
|
|
String get setupAllowAccessToManageFiles =>
|
|
'다음 화면에서 \"모든 파일 관리 권한 허용\"을 활성화해 주세요.';
|
|
|
|
@override
|
|
String get setupLanguageTitle => '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 => '취소';
|
|
|
|
@override
|
|
String get dialogSave => '저장';
|
|
|
|
@override
|
|
String get dialogDelete => '삭제';
|
|
|
|
@override
|
|
String get dialogRetry => '재시도';
|
|
|
|
@override
|
|
String get dialogClear => '지우기';
|
|
|
|
@override
|
|
String get dialogDone => '완료';
|
|
|
|
@override
|
|
String get dialogImport => '불러오기';
|
|
|
|
@override
|
|
String get dialogDownload => 'Download';
|
|
|
|
@override
|
|
String get previewPlay => 'Play preview';
|
|
|
|
@override
|
|
String get previewStop => 'Stop preview';
|
|
|
|
@override
|
|
String get previewUnavailable => 'Preview unavailable';
|
|
|
|
@override
|
|
String get dialogDiscard => '취소';
|
|
|
|
@override
|
|
String get dialogRemove => '제거';
|
|
|
|
@override
|
|
String get dialogUninstall => '삭제';
|
|
|
|
@override
|
|
String get dialogDiscardChanges => '변경사항 취소';
|
|
|
|
@override
|
|
String get dialogUnsavedChanges => '저장되지 않은 변경 사항이 있습니다. 삭제하시겠습니까?';
|
|
|
|
@override
|
|
String get dialogClearAll => '모두 제거:';
|
|
|
|
@override
|
|
String get dialogRemoveExtension => '확장 프로그램 제거';
|
|
|
|
@override
|
|
String get dialogRemoveExtensionMessage =>
|
|
'이 확장 프로그램을 정말로 제거하시겠습니까? 이 작업은 되돌릴 수 없습니다.';
|
|
|
|
@override
|
|
String get dialogUninstallExtension => '확장 프로그램을 제거하시겠습니까?';
|
|
|
|
@override
|
|
String dialogUninstallExtensionMessage(String extensionName) {
|
|
return '$extensionName을 정말로 삭제하시겠습니까?';
|
|
}
|
|
|
|
@override
|
|
String get dialogClearHistoryTitle => '기록 삭제';
|
|
|
|
@override
|
|
String get dialogClearHistoryMessage =>
|
|
'다운로드 기록을 모두 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.';
|
|
|
|
@override
|
|
String get dialogDeleteSelectedTitle => '선택한 항목 삭제';
|
|
|
|
@override
|
|
String dialogDeleteSelectedMessage(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return '기록에서 $count $_temp0를 삭제하시겠습니까?';
|
|
}
|
|
|
|
@override
|
|
String get dialogImportPlaylistTitle => '재생 목록 가져오기';
|
|
|
|
@override
|
|
String dialogImportPlaylistMessage(int count) {
|
|
return 'CSV 파일에서 $count개의 트랙을 찾았습니다. 다운로드 대기열에 추가하시겠습니까?';
|
|
}
|
|
|
|
@override
|
|
String csvImportTracks(int count) {
|
|
return 'CSV 파일의 트랙: $count';
|
|
}
|
|
|
|
@override
|
|
String snackbarAddedToQueue(String trackName) {
|
|
return '\"$trackName\"(을)를 대기열에 추가했습니다.';
|
|
}
|
|
|
|
@override
|
|
String snackbarAddedTracksToQueue(int count) {
|
|
return '대기열에 $count개의 트랙을 추가했습니다.';
|
|
}
|
|
|
|
@override
|
|
String snackbarAlreadyDownloaded(String trackName) {
|
|
return '\"$trackName\"(은)는 이미 다운로드되었습니다.';
|
|
}
|
|
|
|
@override
|
|
String snackbarAlreadyInLibrary(String trackName) {
|
|
return '라이브러리에 \"$trackName\"(은)는 이미 존재합니다.';
|
|
}
|
|
|
|
@override
|
|
String get snackbarHistoryCleared => '기록 삭제됨';
|
|
|
|
@override
|
|
String get snackbarCredentialsSaved => '자격 증명이 저장되었습니다.';
|
|
|
|
@override
|
|
String get snackbarCredentialsCleared => '자격 증명이 제거되었습니다.';
|
|
|
|
@override
|
|
String snackbarDeletedTracks(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return '$count$_temp0 제거됨';
|
|
}
|
|
|
|
@override
|
|
String snackbarCannotOpenFile(String error) {
|
|
return '파일을 열 수 없습니다: $error';
|
|
}
|
|
|
|
@override
|
|
String get snackbarFillAllFields => '모든 항목을 입력해 주세요.';
|
|
|
|
@override
|
|
String get snackbarViewQueue => 'View Queue';
|
|
|
|
@override
|
|
String snackbarUrlCopied(String platform) {
|
|
return '$platform 링크가 클립보드에 저장됨';
|
|
}
|
|
|
|
@override
|
|
String get snackbarFileNotFound => '파일을 찾을 수 없음';
|
|
|
|
@override
|
|
String get snackbarSelectExtFile => '.spotiflac-ext 확장자 파일을 선택';
|
|
|
|
@override
|
|
String get snackbarProviderPrioritySaved => '제공자 우선순위 저장됨';
|
|
|
|
@override
|
|
String get snackbarMetadataProviderSaved => '메타데이터 제공자 우선순위 저장됨';
|
|
|
|
@override
|
|
String snackbarExtensionInstalled(String extensionName) {
|
|
return '$extensionName(이)가 설치됨';
|
|
}
|
|
|
|
@override
|
|
String snackbarExtensionUpdated(String extensionName) {
|
|
return '$extensionName(이)가 설치됨.';
|
|
}
|
|
|
|
@override
|
|
String get snackbarFailedToInstall => '확장 프로그램 설치 실패';
|
|
|
|
@override
|
|
String get snackbarFailedToUpdate => '확장 프로그램 업데이트 실패';
|
|
|
|
@override
|
|
String get errorRateLimited => 'Rate Limited';
|
|
|
|
@override
|
|
String get errorRateLimitedMessage => '요청이 너무 많습니다. 잠시 후 다시 검색해 주세요.';
|
|
|
|
@override
|
|
String get errorNoTracksFound => '트랙을 찾을 수 없습니다';
|
|
|
|
@override
|
|
String get searchEmptyResultSubtitle => 'Try another keyword';
|
|
|
|
@override
|
|
String get errorUrlNotRecognized => 'Link not recognized';
|
|
|
|
@override
|
|
String get errorUrlNotRecognizedMessage =>
|
|
'This link is not supported. Make sure the URL is correct and a compatible extension is installed.';
|
|
|
|
@override
|
|
String get errorUrlFetchFailed =>
|
|
'Failed to load content from this link. Please try again.';
|
|
|
|
@override
|
|
String errorMissingExtensionSource(String item) {
|
|
return '확장 소스가 누락되어, $item(을)를 로드할 수 없습니다';
|
|
}
|
|
|
|
@override
|
|
String get actionPause => '멈추기';
|
|
|
|
@override
|
|
String get actionResume => '재시작';
|
|
|
|
@override
|
|
String get actionCancel => '취소';
|
|
|
|
@override
|
|
String get actionSelectAll => '모두 선택';
|
|
|
|
@override
|
|
String get actionDeselect => '선택 해제';
|
|
|
|
@override
|
|
String get actionRemoveCredentials => '자격 증명 제거';
|
|
|
|
@override
|
|
String get actionSaveCredentials => '자격 증명 저장';
|
|
|
|
@override
|
|
String selectionSelected(int count) {
|
|
return '$count개 선택됨';
|
|
}
|
|
|
|
@override
|
|
String get selectionAllSelected => '모든 트랙 선택됨';
|
|
|
|
@override
|
|
String get selectionSelectToDelete => '삭제할 트랙을 선택';
|
|
|
|
@override
|
|
String progressFetchingMetadata(int current, int total) {
|
|
return '메타데이터 가져오는 중... $current/$total';
|
|
}
|
|
|
|
@override
|
|
String get progressReadingCsv => 'CSV 파일을 읽는 중...';
|
|
|
|
@override
|
|
String get searchSongs => '곡들';
|
|
|
|
@override
|
|
String get searchArtists => '아티스트들';
|
|
|
|
@override
|
|
String get searchAlbums => '앨범들';
|
|
|
|
@override
|
|
String get searchPlaylists => '재생목록들';
|
|
|
|
@override
|
|
String get searchSortTitle => '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 => '재생';
|
|
|
|
@override
|
|
String get filenameFormat => 'Filename Format';
|
|
|
|
@override
|
|
String get filenameShowAdvancedTags => '고급 태그 표시';
|
|
|
|
@override
|
|
String get filenameShowAdvancedTagsDescription =>
|
|
'트랙 패딩 및 날짜 패턴에 대한 서식 있는 태그를 활성화합니다.';
|
|
|
|
@override
|
|
String get folderOrganizationNone => '정리하지 않음';
|
|
|
|
@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 => 'Legacy';
|
|
|
|
@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 => '로그 제거';
|
|
|
|
@override
|
|
String get logClearLogsTitle => '로그 제거';
|
|
|
|
@override
|
|
String get logClearLogsMessage => '모든 로그를 삭제하시겠습니까?';
|
|
|
|
@override
|
|
String get logFilterBySeverity => '심각성에 따라 로그 분류';
|
|
|
|
@override
|
|
String get logNoLogsYet => '어떠한 로그도 없음';
|
|
|
|
@override
|
|
String get logNoLogsYetSubtitle => '앱을 사용하는 동안 로그가 여기에 표시됩니다.';
|
|
|
|
@override
|
|
String logEntriesFiltered(int count) {
|
|
return '($count filtered)개 항목 필터링';
|
|
}
|
|
|
|
@override
|
|
String logEntries(int count) {
|
|
return '항목 수: ($count)';
|
|
}
|
|
|
|
@override
|
|
String get credentialsTitle => 'Spotify 자격 증명';
|
|
|
|
@override
|
|
String get credentialsDescription =>
|
|
'Spotify 애플리케이션 할당량을 사용하려면 클라이언트 ID와 비밀키를 입력하세요.';
|
|
|
|
@override
|
|
String get credentialsClientId => 'Client ID';
|
|
|
|
@override
|
|
String get credentialsClientIdHint => 'Client ID를 붙여넣으세요';
|
|
|
|
@override
|
|
String get credentialsClientSecret => '비밀키';
|
|
|
|
@override
|
|
String get credentialsClientSecretHint => '비밀키를 붙여넣으세요';
|
|
|
|
@override
|
|
String get channelStable => '안정';
|
|
|
|
@override
|
|
String get channelPreview => '베타';
|
|
|
|
@override
|
|
String get sectionSearchSource => '검색 소스';
|
|
|
|
@override
|
|
String get sectionDownload => '다운로드';
|
|
|
|
@override
|
|
String get sectionPerformance => '성능';
|
|
|
|
@override
|
|
String get sectionApp => '앱';
|
|
|
|
@override
|
|
String get sectionData => '데이터';
|
|
|
|
@override
|
|
String get sectionDebug => 'Debug';
|
|
|
|
@override
|
|
String get sectionService => '서비스';
|
|
|
|
@override
|
|
String get sectionAudioQuality => '오디오 품질';
|
|
|
|
@override
|
|
String get sectionFileSettings => '파일 설정';
|
|
|
|
@override
|
|
String get sectionLyrics => '가사';
|
|
|
|
@override
|
|
String get lyricsMode => '가사 설정';
|
|
|
|
@override
|
|
String get lyricsModeDescription => '다운로드한 파일에 가사를 저장하는 방법을 선택하세요.';
|
|
|
|
@override
|
|
String get lyricsModeEmbed => '파일에 포함';
|
|
|
|
@override
|
|
String get lyricsModeEmbedSubtitle => 'FLAC 메타데이터 내에 저장됩니다.';
|
|
|
|
@override
|
|
String get lyricsModeExternal => '외부 .lrc 파일';
|
|
|
|
@override
|
|
String get lyricsModeExternalSubtitle => '삼성 뮤직과 같은 플레이어용 별도 .lrc 파일';
|
|
|
|
@override
|
|
String get lyricsModeBoth => '둘 다';
|
|
|
|
@override
|
|
String get lyricsModeBothSubtitle => '.lrc 파일을 삽입하고 저장합니다.';
|
|
|
|
@override
|
|
String get sectionColor => '색상';
|
|
|
|
@override
|
|
String get sectionTheme => '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 Search';
|
|
|
|
@override
|
|
String get extensionDefaultProviderSubtitle =>
|
|
'Use the default metadata 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 320kbps lossy downloads. The original stream will be converted to your selected format when needed.';
|
|
|
|
@override
|
|
String get downloadLossyMp3 => 'MP3 320kbps';
|
|
|
|
@override
|
|
String get downloadLossyMp3Subtitle => 'Best compatibility, ~10MB per track';
|
|
|
|
@override
|
|
String get downloadLossyAac => 'AAC/M4A 320kbps';
|
|
|
|
@override
|
|
String get downloadLossyAacSubtitle =>
|
|
'Best mobile compatibility, M4A container';
|
|
|
|
@override
|
|
String get downloadLossyOpus256 => 'Opus 256kbps';
|
|
|
|
@override
|
|
String get downloadLossyOpus256Subtitle =>
|
|
'Best quality Opus, ~8MB per track';
|
|
|
|
@override
|
|
String get downloadLossyOpus128 => 'Opus 128kbps';
|
|
|
|
@override
|
|
String get downloadLossyOpus128Subtitle => 'Smallest size, ~4MB per track';
|
|
|
|
@override
|
|
String get 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 albumFolderStructureDescription =>
|
|
'Choose how album folders are structured';
|
|
|
|
@override
|
|
String get downloadUseAlbumArtistForFolders => 'Use Album Artist for folders';
|
|
|
|
@override
|
|
String get downloadUsePrimaryArtistOnly => 'Primary artist only for folders';
|
|
|
|
@override
|
|
String get downloadUsePrimaryArtistOnlyEnabled =>
|
|
'Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)';
|
|
|
|
@override
|
|
String get downloadUsePrimaryArtistOnlyDisabled =>
|
|
'Full artist string used for folder name';
|
|
|
|
@override
|
|
String get downloadSelectQuality => 'Select Quality';
|
|
|
|
@override
|
|
String get downloadFrom => 'Download From';
|
|
|
|
@override
|
|
String get appearanceAmoledDark => 'AMOLED Dark';
|
|
|
|
@override
|
|
String get appearanceAmoledDarkSubtitle => 'Pure black background';
|
|
|
|
@override
|
|
String get queueClearAll => 'Clear All';
|
|
|
|
@override
|
|
String get queueClearAllMessage =>
|
|
'Are you sure you want to clear all downloads?';
|
|
|
|
@override
|
|
String get settingsAutoExportFailed => 'Auto-export failed downloads';
|
|
|
|
@override
|
|
String get settingsAutoExportFailedSubtitle =>
|
|
'Save failed downloads to TXT file automatically';
|
|
|
|
@override
|
|
String get settingsDownloadNetwork => 'Download Network';
|
|
|
|
@override
|
|
String get settingsDownloadNetworkAny => 'WiFi + Mobile Data';
|
|
|
|
@override
|
|
String get settingsDownloadNetworkWifiOnly => 'WiFi Only';
|
|
|
|
@override
|
|
String get settingsDownloadNetworkSubtitle =>
|
|
'Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.';
|
|
|
|
@override
|
|
String get settingsConcurrentDownloads => 'Concurrent downloads';
|
|
|
|
@override
|
|
String get settingsConcurrentDownloadsSubtitle =>
|
|
'Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.';
|
|
|
|
@override
|
|
String get concurrentDownloadsOne => '1 track at a time';
|
|
|
|
@override
|
|
String concurrentDownloadsCount(int count) {
|
|
return 'Up to $count tracks at once';
|
|
}
|
|
|
|
@override
|
|
String get albumFolderArtistAlbum => 'Artist / Album';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumSubtitle => 'Albums/Artist Name/Album Name/';
|
|
|
|
@override
|
|
String get albumFolderArtistYearAlbum => 'Artist / [Year] Album';
|
|
|
|
@override
|
|
String get albumFolderArtistYearAlbumSubtitle =>
|
|
'Albums/Artist Name/[2005] Album Name/';
|
|
|
|
@override
|
|
String get albumFolderAlbumOnly => 'Album Only';
|
|
|
|
@override
|
|
String get albumFolderAlbumOnlySubtitle => 'Albums/Album Name/';
|
|
|
|
@override
|
|
String get albumFolderYearAlbum => '[Year] Album';
|
|
|
|
@override
|
|
String get albumFolderYearAlbumSubtitle => 'Albums/[2005] Album Name/';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumSingles => 'Artist / Album + Singles';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumSinglesSubtitle =>
|
|
'Artist/Album/ and Artist/Singles/';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumFlatSubtitle =>
|
|
'Artist/Album/ and Artist/song.flac';
|
|
|
|
@override
|
|
String get downloadedAlbumDeleteSelected => 'Delete Selected';
|
|
|
|
@override
|
|
String downloadedAlbumDeleteMessage(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Delete $count $_temp0 from this album?\n\nThis will also delete the files from storage.';
|
|
}
|
|
|
|
@override
|
|
String downloadedAlbumSelectedCount(int count) {
|
|
return '$count selected';
|
|
}
|
|
|
|
@override
|
|
String get 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 installed download extensions';
|
|
|
|
@override
|
|
String get tutorialWelcomeTip3 =>
|
|
'Automatic metadata, cover art, and lyrics embedding';
|
|
|
|
@override
|
|
String get tutorialSearchTitle => 'Finding Music';
|
|
|
|
@override
|
|
String get tutorialSearchDesc =>
|
|
'There are two easy ways to find music you want to download.';
|
|
|
|
@override
|
|
String get tutorialDownloadTitle => 'Downloading Music';
|
|
|
|
@override
|
|
String get tutorialDownloadDesc =>
|
|
'Downloading music is simple and fast. Here\'s how it works.';
|
|
|
|
@override
|
|
String get tutorialLibraryTitle => 'Your Library';
|
|
|
|
@override
|
|
String get tutorialLibraryDesc =>
|
|
'All your downloaded music is organized in the Library tab.';
|
|
|
|
@override
|
|
String get tutorialLibraryTip1 =>
|
|
'View download progress and queue in the Library tab';
|
|
|
|
@override
|
|
String get tutorialLibraryTip2 =>
|
|
'Tap any track to play it with your music player';
|
|
|
|
@override
|
|
String get tutorialLibraryTip3 =>
|
|
'Switch between list and grid view for better browsing';
|
|
|
|
@override
|
|
String get tutorialExtensionsTitle => 'Extensions';
|
|
|
|
@override
|
|
String get tutorialExtensionsDesc =>
|
|
'Extend the app\'s capabilities with community extensions.';
|
|
|
|
@override
|
|
String get tutorialExtensionsTip1 =>
|
|
'Browse the Repo tab to discover useful extensions';
|
|
|
|
@override
|
|
String get tutorialExtensionsTip2 =>
|
|
'Add new download providers or search sources';
|
|
|
|
@override
|
|
String get tutorialExtensionsTip3 =>
|
|
'Get lyrics, enhanced metadata, and more features';
|
|
|
|
@override
|
|
String get tutorialSettingsTitle => 'Customize Your Experience';
|
|
|
|
@override
|
|
String get tutorialSettingsDesc =>
|
|
'Personalize the app in Settings to match your preferences.';
|
|
|
|
@override
|
|
String get tutorialSettingsTip1 =>
|
|
'Change download location and folder organization';
|
|
|
|
@override
|
|
String get tutorialSettingsTip2 =>
|
|
'Set default audio quality and format preferences';
|
|
|
|
@override
|
|
String get tutorialSettingsTip3 => 'Customize app theme and appearance';
|
|
|
|
@override
|
|
String get tutorialReadyMessage =>
|
|
'You\'re all set! Start downloading your favorite music now.';
|
|
|
|
@override
|
|
String get libraryForceFullScan => 'Force Full Scan';
|
|
|
|
@override
|
|
String get libraryForceFullScanSubtitle => 'Rescan all files, ignoring cache';
|
|
|
|
@override
|
|
String get cleanupOrphanedDownloads => 'Cleanup Orphaned Downloads';
|
|
|
|
@override
|
|
String get cleanupOrphanedDownloadsSubtitle =>
|
|
'Remove history entries for files that no longer exist';
|
|
|
|
@override
|
|
String cleanupOrphanedDownloadsResult(int count) {
|
|
return 'Removed $count orphaned entries from history';
|
|
}
|
|
|
|
@override
|
|
String get cleanupOrphanedDownloadsNone => 'No orphaned entries found';
|
|
|
|
@override
|
|
String get cacheTitle => 'Storage & Cache';
|
|
|
|
@override
|
|
String get cacheSummaryTitle => 'Cache overview';
|
|
|
|
@override
|
|
String get cacheSummarySubtitle =>
|
|
'Clearing cache will not remove downloaded music files.';
|
|
|
|
@override
|
|
String cacheEstimatedTotal(String size) {
|
|
return 'Estimated cache usage: $size';
|
|
}
|
|
|
|
@override
|
|
String get cacheSectionStorage => 'Cached Data';
|
|
|
|
@override
|
|
String get cacheSectionMaintenance => 'Maintenance';
|
|
|
|
@override
|
|
String get cacheAppDirectory => 'App cache directory';
|
|
|
|
@override
|
|
String get cacheAppDirectoryDesc =>
|
|
'HTTP responses, WebView data, and other temporary app data.';
|
|
|
|
@override
|
|
String get cacheTempDirectory => 'Temporary directory';
|
|
|
|
@override
|
|
String get cacheTempDirectoryDesc =>
|
|
'Temporary files from downloads and audio conversion.';
|
|
|
|
@override
|
|
String get cacheCoverImage => 'Cover image cache';
|
|
|
|
@override
|
|
String get cacheCoverImageDesc =>
|
|
'Downloaded album and track cover art. Will re-download when viewed.';
|
|
|
|
@override
|
|
String get cacheLibraryCover => 'Library cover cache';
|
|
|
|
@override
|
|
String get cacheLibraryCoverDesc =>
|
|
'Cover art extracted from local music files. Will re-extract on next scan.';
|
|
|
|
@override
|
|
String get cacheExploreFeed => 'Explore feed cache';
|
|
|
|
@override
|
|
String get cacheExploreFeedDesc =>
|
|
'Explore tab content (new releases, trending). Will refresh on next visit.';
|
|
|
|
@override
|
|
String get cacheTrackLookup => 'Track lookup cache';
|
|
|
|
@override
|
|
String get cacheTrackLookupDesc =>
|
|
'Spotify/Deezer track ID lookups. Clearing may slow next few searches.';
|
|
|
|
@override
|
|
String get cacheCleanupUnusedDesc =>
|
|
'Remove orphaned download history and library entries for missing files.';
|
|
|
|
@override
|
|
String get cacheNoData => 'No cached data';
|
|
|
|
@override
|
|
String cacheSizeWithFiles(String size, int count) {
|
|
return '$size in $count files';
|
|
}
|
|
|
|
@override
|
|
String cacheSizeOnly(String size) {
|
|
return '$size';
|
|
}
|
|
|
|
@override
|
|
String cacheEntries(int count) {
|
|
return '$count entries';
|
|
}
|
|
|
|
@override
|
|
String cacheClearSuccess(String target) {
|
|
return 'Cleared: $target';
|
|
}
|
|
|
|
@override
|
|
String get cacheClearConfirmTitle => 'Clear cache?';
|
|
|
|
@override
|
|
String cacheClearConfirmMessage(String target) {
|
|
return 'This will clear cached data for $target. Downloaded music files will not be deleted.';
|
|
}
|
|
|
|
@override
|
|
String get cacheClearAllConfirmTitle => 'Clear all cache?';
|
|
|
|
@override
|
|
String get cacheClearAllConfirmMessage =>
|
|
'This will clear all cache categories on this page. Downloaded music files will not be deleted.';
|
|
|
|
@override
|
|
String get cacheClearAll => 'Clear all cache';
|
|
|
|
@override
|
|
String get cacheCleanupUnused => 'Cleanup unused data';
|
|
|
|
@override
|
|
String get cacheCleanupUnusedSubtitle =>
|
|
'Remove orphaned download history and missing library entries';
|
|
|
|
@override
|
|
String cacheCleanupResult(int downloadCount, int libraryCount) {
|
|
return 'Cleanup completed: $downloadCount orphaned downloads, $libraryCount missing library entries';
|
|
}
|
|
|
|
@override
|
|
String get cacheRefreshStats => 'Refresh stats';
|
|
|
|
@override
|
|
String get trackSaveCoverArt => 'Save Cover Art';
|
|
|
|
@override
|
|
String get 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 run before built-in lyrics providers. At least one provider must remain enabled.';
|
|
|
|
@override
|
|
String lyricsProvidersEnabledSection(int count) {
|
|
return 'Enabled ($count)';
|
|
}
|
|
|
|
@override
|
|
String lyricsProvidersDisabledSection(int count) {
|
|
return 'Disabled ($count)';
|
|
}
|
|
|
|
@override
|
|
String get lyricsProvidersAtLeastOne =>
|
|
'At least one provider must remain enabled';
|
|
|
|
@override
|
|
String get lyricsProvidersSaved => 'Lyrics provider priority saved';
|
|
|
|
@override
|
|
String get lyricsProvidersDiscardContent =>
|
|
'You have unsaved changes that will be lost.';
|
|
|
|
@override
|
|
String get lyricsProviderLrclibDesc => 'Open-source synced lyrics database';
|
|
|
|
@override
|
|
String get lyricsProviderNeteaseDesc =>
|
|
'NetEase Cloud Music (good for Asian songs)';
|
|
|
|
@override
|
|
String get lyricsProviderMusixmatchDesc =>
|
|
'Largest lyrics database (multi-language)';
|
|
|
|
@override
|
|
String get lyricsProviderAppleMusicDesc =>
|
|
'Word-by-word synced lyrics (via proxy)';
|
|
|
|
@override
|
|
String get lyricsProviderQqMusicDesc =>
|
|
'QQ Music (good for Chinese songs, via proxy)';
|
|
|
|
@override
|
|
String get lyricsProviderLyricsPlusDesc =>
|
|
'Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)';
|
|
|
|
@override
|
|
String get lyricsProviderExtensionDesc => 'Extension provider';
|
|
|
|
@override
|
|
String get safMigrationTitle => 'Storage Update Required';
|
|
|
|
@override
|
|
String get safMigrationMessage1 =>
|
|
'SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.';
|
|
|
|
@override
|
|
String get safMigrationMessage2 =>
|
|
'Please select your download folder again to switch to the new storage system.';
|
|
|
|
@override
|
|
String get safMigrationSuccess => 'Download folder updated to SAF mode';
|
|
|
|
@override
|
|
String get settingsDonate => 'Support Development';
|
|
|
|
@override
|
|
String get settingsDonateSubtitle => 'Buy the developer a coffee';
|
|
|
|
@override
|
|
String get settingsBackup => 'Backup & Restore';
|
|
|
|
@override
|
|
String get settingsBackupSubtitle =>
|
|
'Move your library, history and settings to a new device';
|
|
|
|
@override
|
|
String get backupTitle => 'Backup & Restore';
|
|
|
|
@override
|
|
String get backupExportSectionTitle => 'Create backup';
|
|
|
|
@override
|
|
String get backupExportSectionDescription =>
|
|
'Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.';
|
|
|
|
@override
|
|
String get backupExportButton => 'Create backup file';
|
|
|
|
@override
|
|
String get backupImportSectionTitle => 'Restore backup';
|
|
|
|
@override
|
|
String get backupImportSectionDescription =>
|
|
'Pick a backup file to restore your data. This replaces the current settings, history and library on this device.';
|
|
|
|
@override
|
|
String get backupImportButton => 'Choose backup file';
|
|
|
|
@override
|
|
String get backupCreating => 'Creating backup...';
|
|
|
|
@override
|
|
String get backupCreated => 'Backup created';
|
|
|
|
@override
|
|
String get backupCreateFailed => 'Failed to create backup';
|
|
|
|
@override
|
|
String get backupEmpty => 'There is nothing to back up yet';
|
|
|
|
@override
|
|
String get backupRestoreConfirmTitle => 'Restore this backup?';
|
|
|
|
@override
|
|
String get backupRestoreConfirmMessage =>
|
|
'This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.';
|
|
|
|
@override
|
|
String get backupRestoreConfirmButton => 'Restore';
|
|
|
|
@override
|
|
String get backupRestoring => 'Restoring backup...';
|
|
|
|
@override
|
|
String get backupRestored => 'Backup restored successfully';
|
|
|
|
@override
|
|
String get backupRestoreFailed => 'Failed to restore backup';
|
|
|
|
@override
|
|
String get backupInvalidFile => 'This file is not a valid SpotiFLAC backup';
|
|
|
|
@override
|
|
String get backupRestoreRestartHint =>
|
|
'Restart the app to make sure every change is applied.';
|
|
|
|
@override
|
|
String get backupContentsTitle => 'Backup contents';
|
|
|
|
@override
|
|
String get backupContentsSettings => 'App settings';
|
|
|
|
@override
|
|
String backupContentsHistory(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'items',
|
|
one: 'item',
|
|
);
|
|
return '$count history $_temp0';
|
|
}
|
|
|
|
@override
|
|
String backupContentsLiked(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return '$count liked $_temp0';
|
|
}
|
|
|
|
@override
|
|
String backupContentsWishlist(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return '$count wishlist $_temp0';
|
|
}
|
|
|
|
@override
|
|
String backupContentsPlaylists(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count playlists',
|
|
one: '1 playlist',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String backupContentsArtists(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count favorite artists',
|
|
one: '1 favorite artist',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String backupContentsExtensions(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count extensions',
|
|
one: '1 extension',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get backupIncludeSecrets => 'Include extension credentials';
|
|
|
|
@override
|
|
String get backupIncludeSecretsDescription =>
|
|
'Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.';
|
|
|
|
@override
|
|
String backupExtensionsRestoreFailed(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'extensions',
|
|
one: 'extension',
|
|
);
|
|
return '$count $_temp0 could not be reinstalled. Install them manually from the store.';
|
|
}
|
|
|
|
@override
|
|
String get tooltipLoveAll => 'Love All';
|
|
|
|
@override
|
|
String get tooltipAddToPlaylist => 'Add to Playlist';
|
|
|
|
@override
|
|
String snackbarRemovedTracksFromLoved(int count) {
|
|
return 'Removed $count tracks from Loved';
|
|
}
|
|
|
|
@override
|
|
String snackbarAddedTracksToLoved(int count) {
|
|
return 'Added $count tracks to Loved';
|
|
}
|
|
|
|
@override
|
|
String get dialogDownloadAllTitle => 'Download All';
|
|
|
|
@override
|
|
String dialogDownloadAllMessage(int count) {
|
|
return 'Download $count tracks?';
|
|
}
|
|
|
|
@override
|
|
String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs';
|
|
|
|
@override
|
|
String get homeGoToAlbum => 'Go to Album';
|
|
|
|
@override
|
|
String get homeAlbumInfoUnavailable => 'Album info not available';
|
|
|
|
@override
|
|
String get snackbarLoadingCueSheet => 'Loading CUE sheet...';
|
|
|
|
@override
|
|
String get snackbarMetadataSaved => 'Metadata saved successfully';
|
|
|
|
@override
|
|
String get snackbarFailedToEmbedLyrics => 'Failed to embed lyrics';
|
|
|
|
@override
|
|
String get snackbarFailedToWriteStorage => 'Failed to write back to storage';
|
|
|
|
@override
|
|
String snackbarError(String error) {
|
|
return 'Error: $error';
|
|
}
|
|
|
|
@override
|
|
String get snackbarNoActionDefined => 'No action defined for this button';
|
|
|
|
@override
|
|
String get noTracksFoundForAlbum => 'No tracks found for this album';
|
|
|
|
@override
|
|
String get downloadLocationSubtitle =>
|
|
'Choose where to save your downloaded tracks';
|
|
|
|
@override
|
|
String get storageModeAppFolder => 'App Folder (Recommended)';
|
|
|
|
@override
|
|
String get storageModeAppFolderSubtitle =>
|
|
'Saves to Music/SpotiFLAC by default';
|
|
|
|
@override
|
|
String get storageModeSaf => 'Custom Folder (SAF)';
|
|
|
|
@override
|
|
String get storageModeSafSubtitle => 'Pick any folder, including SD card';
|
|
|
|
@override
|
|
String get downloadFolderAccessLostTitle => 'Download folder access lost';
|
|
|
|
@override
|
|
String get downloadFolderAccessLostSubtitle =>
|
|
'Downloads will fail until you re-select the folder';
|
|
|
|
@override
|
|
String get downloadFolderReselect => 'Re-select folder';
|
|
|
|
@override
|
|
String get downloadErrorSafPermissionLost =>
|
|
'SAF permission invalid or revoked. Please reconfigure download location in Settings.';
|
|
|
|
@override
|
|
String get downloadErrorFolderAccessLost =>
|
|
'Download folder access lost. Please re-select your download folder in Settings.';
|
|
|
|
@override
|
|
String downloadFilenameDescription(
|
|
Object album,
|
|
Object artist,
|
|
Object date,
|
|
Object disc,
|
|
Object title,
|
|
Object track,
|
|
Object year,
|
|
) {
|
|
return 'Use $artist, $title, $album, $track, $year, $date, $disc as placeholders.';
|
|
}
|
|
|
|
@override
|
|
String get downloadFilenameInsertTag => 'Tap to insert tag:';
|
|
|
|
@override
|
|
String get downloadSeparateSinglesEnabled =>
|
|
'Singles and EPs saved in a separate folder';
|
|
|
|
@override
|
|
String get downloadSeparateSinglesDisabled =>
|
|
'Singles and albums saved in the same folder';
|
|
|
|
@override
|
|
String get downloadArtistNameFilters => 'Artist Name Filters';
|
|
|
|
@override
|
|
String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder';
|
|
|
|
@override
|
|
String get downloadCreatePlaylistSourceFolderEnabled =>
|
|
'A subfolder is created for each playlist';
|
|
|
|
@override
|
|
String get downloadCreatePlaylistSourceFolderDisabled =>
|
|
'All tracks saved directly to download folder';
|
|
|
|
@override
|
|
String get downloadCreatePlaylistSourceFolderRedundant =>
|
|
'Handled by folder organization setting';
|
|
|
|
@override
|
|
String get downloadSongLinkRegion => 'SongLink Region';
|
|
|
|
@override
|
|
String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode';
|
|
|
|
@override
|
|
String get downloadNetworkCompatibilityModeEnabled =>
|
|
'Using legacy TLS settings for older networks';
|
|
|
|
@override
|
|
String get downloadNetworkCompatibilityModeDisabled =>
|
|
'Using standard network settings';
|
|
|
|
@override
|
|
String get downloadAllowLocalNetwork => 'Allow Local Network Access';
|
|
|
|
@override
|
|
String get downloadAllowLocalNetworkEnabled =>
|
|
'Requests to local/private addresses are allowed (for local proxy or custom DNS)';
|
|
|
|
@override
|
|
String get downloadAllowLocalNetworkDisabled =>
|
|
'Local/private addresses are blocked for security';
|
|
|
|
@override
|
|
String get downloadSelectServiceToEnable =>
|
|
'Select a provider with quality options to enable this option';
|
|
|
|
@override
|
|
String get downloadSelectTidalQobuz =>
|
|
'Select a provider with quality options 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 notifVerificationRequiredTitle => 'Verification required';
|
|
|
|
@override
|
|
String get notifVerificationRequiredBody =>
|
|
'Open the app to complete verification and resume downloads';
|
|
|
|
@override
|
|
String get notifAllDownloadsComplete => 'All Downloads Complete';
|
|
|
|
@override
|
|
String notifTracksDownloadedSuccess(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count tracks downloaded successfully',
|
|
one: '1 track downloaded successfully',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String notifDownloadsFinishedBody(int completed, int failed) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
completed,
|
|
locale: localeName,
|
|
other: '$completed tracks downloaded',
|
|
one: '1 track downloaded',
|
|
);
|
|
String _temp1 = intl.Intl.pluralLogic(
|
|
failed,
|
|
locale: localeName,
|
|
other: '$failed failed',
|
|
one: '1 failed',
|
|
);
|
|
return '$_temp0, $_temp1';
|
|
}
|
|
|
|
@override
|
|
String get notifDownloadsCanceledTitle => 'Downloads canceled';
|
|
|
|
@override
|
|
String notifDownloadsCanceledBody(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count downloads canceled by user',
|
|
one: '1 download canceled by user',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get notifScanningLibrary => 'Scanning local library';
|
|
|
|
@override
|
|
String notifLibraryScanProgressWithTotal(
|
|
int scanned,
|
|
int total,
|
|
int percentage,
|
|
) {
|
|
return '$scanned/$total files • $percentage%';
|
|
}
|
|
|
|
@override
|
|
String notifLibraryScanProgressNoTotal(int scanned, int percentage) {
|
|
return '$scanned files scanned • $percentage%';
|
|
}
|
|
|
|
@override
|
|
String get notifLibraryScanComplete => 'Library scan complete';
|
|
|
|
@override
|
|
String notifLibraryScanCompleteBody(int count) {
|
|
return '$count tracks indexed';
|
|
}
|
|
|
|
@override
|
|
String notifLibraryScanExcluded(int count) {
|
|
return '$count excluded';
|
|
}
|
|
|
|
@override
|
|
String notifLibraryScanErrors(int count) {
|
|
return '$count errors';
|
|
}
|
|
|
|
@override
|
|
String get notifLibraryScanFailed => 'Library scan failed';
|
|
|
|
@override
|
|
String get notifLibraryScanCancelled => 'Library scan cancelled';
|
|
|
|
@override
|
|
String get notifLibraryScanStopped => 'Scan stopped before completion.';
|
|
|
|
@override
|
|
String notifDownloadingUpdate(String version) {
|
|
return 'Downloading SpotiFLAC Mobile v$version';
|
|
}
|
|
|
|
@override
|
|
String notifUpdateProgress(String received, String total, int percentage) {
|
|
return '$received / $total MB • $percentage%';
|
|
}
|
|
|
|
@override
|
|
String get notifUpdateReady => 'Update Ready';
|
|
|
|
@override
|
|
String notifUpdateReadyBody(String version) {
|
|
return 'SpotiFLAC Mobile v$version downloaded. Tap to install.';
|
|
}
|
|
|
|
@override
|
|
String get notifUpdateFailed => 'Update Failed';
|
|
|
|
@override
|
|
String get notifUpdateFailedBody =>
|
|
'Could not download update. Try again later.';
|
|
|
|
@override
|
|
String get searchTracks => 'Tracks';
|
|
|
|
@override
|
|
String get homeSearchHintDefault => 'Paste supported URL or search...';
|
|
|
|
@override
|
|
String homeSearchHintProvider(String providerName) {
|
|
return 'Search with $providerName...';
|
|
}
|
|
|
|
@override
|
|
String get homeImportCsvTooltip => 'Import CSV';
|
|
|
|
@override
|
|
String get homeChangeSearchProviderTooltip => 'Change search provider';
|
|
|
|
@override
|
|
String get actionPaste => 'Paste';
|
|
|
|
@override
|
|
String get 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';
|
|
}
|
|
|
|
@override
|
|
String get libraryPlayback => 'Playback';
|
|
|
|
@override
|
|
String get libraryExternalPlayer => 'External player';
|
|
|
|
@override
|
|
String get libraryExternalPlayerSubtitle =>
|
|
'Recommended for listening, best quality, gapless playback, EQ, and wider format support';
|
|
|
|
@override
|
|
String get libraryBuiltInPreviewPlayer => 'Built-in preview player';
|
|
|
|
@override
|
|
String get libraryBuiltInPreviewPlayerSubtitle =>
|
|
'Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening';
|
|
|
|
@override
|
|
String get libraryBuiltInPlayerInfo =>
|
|
'The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.';
|
|
|
|
@override
|
|
String get nowPlayingTitle => 'Now Playing';
|
|
|
|
@override
|
|
String get nowPlayingNothingPlaying => 'Nothing is playing';
|
|
|
|
@override
|
|
String get nowPlayingMinimize => 'Minimize';
|
|
|
|
@override
|
|
String get nowPlayingUpNext => 'Up next';
|
|
|
|
@override
|
|
String get nowPlayingDetails => 'Details';
|
|
|
|
@override
|
|
String get nowPlayingOpenInExternalPlayer => 'Open in external player';
|
|
|
|
@override
|
|
String get nowPlayingTabPlayer => 'Player';
|
|
|
|
@override
|
|
String get nowPlayingTabLyrics => 'Lyrics';
|
|
|
|
@override
|
|
String get nowPlayingNoLyrics => 'No lyrics in this file';
|
|
|
|
@override
|
|
String get nowPlayingLibraryEmpty => 'Your library is empty';
|
|
|
|
@override
|
|
String nowPlayingShuffleLibraryFailed(String error) {
|
|
return 'Could not shuffle library: $error';
|
|
}
|
|
|
|
@override
|
|
String get nowPlayingShuffleOn => 'Shuffle on';
|
|
|
|
@override
|
|
String get nowPlayingPlayInOrder => 'Play in order';
|
|
|
|
@override
|
|
String get nowPlayingShuffleLibrary => 'Shuffle library';
|
|
|
|
@override
|
|
String get nowPlayingQueueEmpty => 'Queue is empty';
|
|
|
|
@override
|
|
String get nowPlayingNoMetadata => 'No metadata available';
|
|
|
|
@override
|
|
String get announcementUnableToOpenLink =>
|
|
'Unable to open link. Please try again.';
|
|
|
|
@override
|
|
String trackConvertLosslessOutputWithCap(String quality) {
|
|
return 'Lossless output with $quality cap';
|
|
}
|
|
|
|
@override
|
|
String trackConvertConfirmMessageLosslessCapped(
|
|
String sourceFormat,
|
|
String targetFormat,
|
|
String quality,
|
|
) {
|
|
return 'Convert from $sourceFormat to $targetFormat ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.';
|
|
}
|
|
|
|
@override
|
|
String selectionBatchConvertConfirmMessageLosslessCapped(
|
|
int count,
|
|
String format,
|
|
String quality,
|
|
) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Convert $count $_temp0 to $format ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.';
|
|
}
|
|
|
|
@override
|
|
String trackConvertActionLabelLossless(
|
|
String sourceFormat,
|
|
String targetFormat,
|
|
String quality,
|
|
) {
|
|
return '$sourceFormat → $targetFormat ($quality)';
|
|
}
|
|
|
|
@override
|
|
String trackConvertActionLabelLossy(
|
|
String sourceFormat,
|
|
String targetFormat,
|
|
String bitrate,
|
|
) {
|
|
return '$sourceFormat → $targetFormat @ $bitrate';
|
|
}
|
|
|
|
@override
|
|
String get aboutPaxsenixSubtitle =>
|
|
'Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius';
|
|
|
|
@override
|
|
String get snackbarPlayingNext => 'Playing next';
|
|
|
|
@override
|
|
String get snackbarAddedToQueueGeneric => 'Added to queue';
|
|
|
|
@override
|
|
String selectionDeletePlaylistsCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'playlists',
|
|
one: 'playlist',
|
|
);
|
|
return 'Delete $count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String get actionShuffle => 'Shuffle';
|
|
|
|
@override
|
|
String get downloadPrimaryArtistOnlyOn => 'Primary only: On';
|
|
|
|
@override
|
|
String get downloadPrimaryArtistOnlyOff => 'Primary only: Off';
|
|
|
|
@override
|
|
String get downloadAlbumArtistMetadataPrimaryOnly =>
|
|
'Album Artist metadata: Primary only';
|
|
|
|
@override
|
|
String get downloadAlbumArtistMetadataFull => 'Album Artist metadata: Full';
|
|
|
|
@override
|
|
String get trackConvertOriginal => 'Original';
|
|
|
|
@override
|
|
String get trackConvertOriginalQuality => 'Original quality';
|
|
|
|
@override
|
|
String get trackConvertLosslessSuffix => 'Lossless';
|
|
|
|
@override
|
|
String get trackConvertDithering => 'Dithering';
|
|
|
|
@override
|
|
String get trackConvertResampler => 'Resampler';
|
|
|
|
@override
|
|
String get trackConvertDitherNone => 'None';
|
|
|
|
@override
|
|
String get trackConvertDitherTriangular => 'TPDF';
|
|
|
|
@override
|
|
String get trackConvertDitherTriangularHp => 'Triangular HP';
|
|
|
|
@override
|
|
String get trackConvertResamplerSwr => 'SWR';
|
|
|
|
@override
|
|
String get trackConvertResamplerSoxr => 'SoXr';
|
|
|
|
@override
|
|
String get updateSeeReleaseNotes => 'See release notes for details.';
|
|
|
|
@override
|
|
String get unknownTitle => 'Unknown title';
|
|
|
|
@override
|
|
String get trackPlayNext => 'Play next';
|
|
|
|
@override
|
|
String get trackAddToQueue => 'Add to queue';
|
|
|
|
@override
|
|
String snackbarExtensionInstalledEnable(String extensionName) {
|
|
return '$extensionName installed. Enable it in Settings > Extensions';
|
|
}
|
|
|
|
@override
|
|
String snackbarExtensionUpdatedVersion(String extensionName, String version) {
|
|
return '$extensionName updated to v$version';
|
|
}
|
|
|
|
@override
|
|
String snackbarFailedToInstallNamed(String extensionName) {
|
|
return 'Failed to install $extensionName';
|
|
}
|
|
|
|
@override
|
|
String snackbarFailedToUpdateNamed(String extensionName) {
|
|
return 'Failed to update $extensionName';
|
|
}
|
|
|
|
@override
|
|
String get releaseTypeEp => 'EP';
|
|
|
|
@override
|
|
String get releaseTypeSingle => 'Single';
|
|
|
|
@override
|
|
String get trackCoverOnline => 'Online cover';
|
|
|
|
@override
|
|
String get regionCountryUS => 'United States';
|
|
|
|
@override
|
|
String get regionCountryGB => 'United Kingdom';
|
|
|
|
@override
|
|
String get regionCountryFR => 'France';
|
|
|
|
@override
|
|
String get regionCountryDE => 'Germany';
|
|
|
|
@override
|
|
String get regionCountryJP => 'Japan';
|
|
|
|
@override
|
|
String get regionCountryKR => 'South Korea';
|
|
|
|
@override
|
|
String get regionCountryIN => 'India';
|
|
|
|
@override
|
|
String get regionCountryID => 'Indonesia';
|
|
|
|
@override
|
|
String get regionCountryBR => 'Brazil';
|
|
|
|
@override
|
|
String get regionCountryMX => 'Mexico';
|
|
|
|
@override
|
|
String get regionCountryAU => 'Australia';
|
|
|
|
@override
|
|
String get regionCountryCA => 'Canada';
|
|
|
|
@override
|
|
String get regionCountryXK => 'Kosovo';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserTitle => 'Verification browser';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserSubtitleExternal =>
|
|
'Open challenges in the default browser first';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserSubtitleInApp =>
|
|
'Open challenges in the in-app browser first';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserExternal => 'External';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserInApp => 'In-app';
|
|
|
|
@override
|
|
String get extensionVerificationHelpTitleManual =>
|
|
'Open verification manually';
|
|
|
|
@override
|
|
String get extensionVerificationHelpTitleWaiting =>
|
|
'Verification still waiting';
|
|
|
|
@override
|
|
String get extensionVerificationHelpMessageManual =>
|
|
'SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.';
|
|
|
|
@override
|
|
String get extensionVerificationHelpMessageWaiting =>
|
|
'If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.';
|
|
|
|
@override
|
|
String get extensionVerificationClose => 'Close';
|
|
|
|
@override
|
|
String get extensionVerificationCopyLink => 'Copy link';
|
|
|
|
@override
|
|
String get extensionVerificationLinkCopied => 'Verification link copied';
|
|
|
|
@override
|
|
String get extensionVerificationOpenBrowser => 'Open browser';
|
|
}
|