diff --git a/crowdin.yml b/crowdin.yml index 4590bc21..09852a2c 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -6,7 +6,7 @@ files: # Keys MUST be the project's Crowdin language ids; values are the # %locale% suffix used in app_%locale%.arb (underscores so Flutter # gen-l10n parses them — hyphenated filenames break gen-l10n). - # Locales below the 70% translation threshold (ar, hi, ko, nl, + # Locales below the 70% translation threshold (ar, hi, nl, # zh-CN, zh-TW) are unmapped so `crowdin pull` doesn't recreate # their arb files; re-add a mapping line when one qualifies. de: de @@ -14,6 +14,7 @@ files: fr: fr id: id ja: ja + ko: ko pt-PT: pt_PT ru: ru tr: tr diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 762f86c9..8d73eb5e 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -11,6 +11,7 @@ import 'app_localizations_es.dart'; import 'app_localizations_fr.dart'; import 'app_localizations_id.dart'; import 'app_localizations_ja.dart'; +import 'app_localizations_ko.dart'; import 'app_localizations_pt.dart'; import 'app_localizations_ru.dart'; import 'app_localizations_tr.dart'; @@ -109,6 +110,7 @@ abstract class AppLocalizations { Locale('fr'), Locale('id'), Locale('ja'), + Locale('ko'), Locale('pt'), Locale('pt', 'PT'), Locale('ru'), @@ -1256,6 +1258,18 @@ abstract class AppLocalizations { /// **'Export failed'** String get collectionExportM3uFailed; + /// Track option and sheet title listing streaming platforms where the track can be opened + /// + /// In en, this message translates to: + /// **'Open on...'** + String get trackOpenOn; + + /// Shown in the Open on sheet when song.link returns no links + /// + /// In en, this message translates to: + /// **'No platform links found for this track.'** + String get trackOpenOnNoLinks; + /// Snackbar - track added to download queue /// /// In en, this message translates to: @@ -7682,6 +7696,7 @@ class _AppLocalizationsDelegate 'fr', 'id', 'ja', + 'ko', 'pt', 'ru', 'tr', @@ -7727,6 +7742,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) { return AppLocalizationsId(); case 'ja': return AppLocalizationsJa(); + case 'ko': + return AppLocalizationsKo(); case 'pt': return AppLocalizationsPt(); case 'ru': diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 99dfd810..39d52292 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -563,10 +563,10 @@ class AppLocalizationsDe extends AppLocalizations { String get dialogDownload => 'Herunterladen'; @override - String get previewPlay => 'Play preview'; + String get previewPlay => 'Vorschau abspielen'; @override - String get previewStop => 'Stop preview'; + String get previewStop => 'Vorschau stoppen'; @override String get previewUnavailable => 'Preview unavailable'; @@ -653,6 +653,12 @@ class AppLocalizationsDe extends AppLocalizations { @override String get collectionExportM3uFailed => 'Export failed'; + @override + String get trackOpenOn => 'Open on...'; + + @override + String get trackOpenOnNoLinks => 'No platform links found for this track.'; + @override String snackbarAddedToQueue(String trackName) { return '\"$trackName\" hinzugefügt'; @@ -966,7 +972,7 @@ class AppLocalizationsDe extends AppLocalizations { 'Deezer hat keine Limits und wird als primäre empfohlen. Spotify kann nach vielen Anfragen begrenzen.'; @override - String get logTitle => 'Logs'; + String get logTitle => 'Protokolle'; @override String get logCopied => 'Logs in Zwischenablage kopiert'; @@ -2912,7 +2918,7 @@ class AppLocalizationsDe extends AppLocalizations { String get backupContentsTitle => 'Backup contents'; @override - String get backupContentsSettings => 'App settings'; + String get backupContentsSettings => 'Appeinstellungen'; @override String backupContentsHistory(int count) { @@ -3455,7 +3461,7 @@ class AppLocalizationsDe extends AppLocalizations { String get audioAnalysisAnalyzing => 'Audio wird analysiert...'; @override - String get audioAnalysisSampleRate => 'Sample Rate'; + String get audioAnalysisSampleRate => 'Abtastrate'; @override String get audioAnalysisCodec => 'Codec'; @@ -4361,7 +4367,7 @@ class AppLocalizationsDe extends AppLocalizations { String get artistReleases => 'Releases'; @override - String get editMetadataSelectNone => 'None'; + String get editMetadataSelectNone => 'Keine'; @override String queueRetryAllFailed(int count) { @@ -4424,7 +4430,7 @@ class AppLocalizationsDe extends AppLocalizations { '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'; + String get nowPlayingTitle => 'Jetzt läuft'; @override String get nowPlayingNothingPlaying => 'Nothing is playing'; @@ -4529,7 +4535,7 @@ class AppLocalizationsDe extends AppLocalizations { 'Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius'; @override - String get snackbarPlayingNext => 'Playing next'; + String get snackbarPlayingNext => 'Als nächstes'; @override String get snackbarAddedToQueueGeneric => 'Added to queue'; @@ -4577,7 +4583,7 @@ class AppLocalizationsDe extends AppLocalizations { String get trackConvertResampler => 'Resampler'; @override - String get trackConvertDitherNone => 'None'; + String get trackConvertDitherNone => 'Keine'; @override String get trackConvertDitherTriangular => 'TPDF'; @@ -4648,10 +4654,10 @@ class AppLocalizationsDe extends AppLocalizations { String get regionCountryJP => 'Japan'; @override - String get regionCountryKR => 'South Korea'; + String get regionCountryKR => 'Südkorea'; @override - String get regionCountryIN => 'India'; + String get regionCountryIN => 'Indien'; @override String get regionCountryID => 'Indonesia'; @@ -4705,7 +4711,7 @@ class AppLocalizationsDe extends AppLocalizations { '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'; + String get extensionVerificationClose => 'Schließen'; @override String get extensionVerificationCopyLink => 'Copy link'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 731129fa..802d40b5 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -645,6 +645,12 @@ class AppLocalizationsEn extends AppLocalizations { @override String get collectionExportM3uFailed => 'Export failed'; + @override + String get trackOpenOn => 'Open on...'; + + @override + String get trackOpenOnNoLinks => 'No platform links found for this track.'; + @override String snackbarAddedToQueue(String trackName) { return 'Added \"$trackName\" to queue'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index d9d69308..0f8c4959 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -645,6 +645,12 @@ class AppLocalizationsEs extends AppLocalizations { @override String get collectionExportM3uFailed => 'Export failed'; + @override + String get trackOpenOn => 'Open on...'; + + @override + String get trackOpenOnNoLinks => 'No platform links found for this track.'; + @override String snackbarAddedToQueue(String trackName) { return 'Added \"$trackName\" to queue'; @@ -5555,6 +5561,14 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get updateNewVersionReady => 'Una nueva versión está lista'; + @override + String get updateRequiredTitle => 'Update required'; + + @override + String updateRequiredNotice(int count) { + return 'This version is $count releases behind and is no longer supported. Update to keep using the app.'; + } + @override String get updateCurrent => 'Actual'; @@ -6201,6 +6215,13 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get appearanceAmoledDarkSubtitle => 'Fondo negro puro'; + @override + String get appearanceHeroAnimations => 'Hero animations'; + + @override + String get appearanceHeroAnimationsSubtitle => + 'Fly covers between screens, e.g. when opening the player'; + @override String get queueClearAll => 'Eliminar todo'; @@ -6228,6 +6249,21 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get settingsDownloadNetworkSubtitle => 'Elegir qué red usar para descargas. Cuando se establece en Wi-Fi solamente, las descargas se detendrán en los datos móviles.'; + @override + String get 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 => 'Artista / Álbum'; @@ -6857,6 +6893,20 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get cacheLibraryCoverDesc => 'Portada extraída de archivos locales. Se extraerá de nuevo en el próximo escaneo.'; + @override + String get libraryPlaybackNormalization => 'Volume normalization'; + + @override + String get libraryPlaybackNormalizationSubtitle => + 'Even out loudness between tracks using their ReplayGain or R128 tags, when present'; + + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Explorar caché de inicio'; @@ -7031,6 +7081,13 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get trackConvertBitrate => 'Tasa de bits'; + @override + String get trackConvertKeepOriginal => 'Keep original file'; + + @override + String get trackConvertKeepOriginalDescription => + 'Add the converted file as a separate library entry'; + @override String get trackConvertConfirmTitle => 'Confirmar conversión'; @@ -7051,6 +7108,14 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { return 'Convertir de $sourceFormat a $targetFormat? \n(Sin pérdidas)\n\nEl archivo original será eliminado después de la conversión.'; } + @override + String trackConvertConfirmKeepOriginal( + String sourceFormat, + String targetFormat, + ) { + return 'Convert from $sourceFormat to $targetFormat?\n\nThe original file will be kept and the converted file will be added as a separate library entry.'; + } + @override String get trackConvertLosslessHint => 'Conversión sin pérdidas — sin pérdida de calidad'; @@ -7337,6 +7402,17 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { return '¿Convertir $count $_temp0 a $format? (Sin pérdida — no hay pérdida de calidad)\n\nLos archivos originales se eliminarán después de la conversión.'; } + @override + String selectionBatchConvertConfirmKeepOriginal(int count, String format) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Convert $count $_temp0 to $format?\n\nOriginal files will be kept and converted files will be added as separate library entries.'; + } + @override String selectionBatchConvertSuccess(int success, int total, String format) { return 'Se convirtieron $success de $total pistas a $format'; @@ -7665,6 +7741,24 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get storageModeSafSubtitle => 'Escoge cualquier carpeta, incluyendo la tarjeta SD'; + @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, @@ -8175,6 +8269,13 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { 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 => 'Todas las descargas completadas'; @@ -8551,10 +8652,24 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { String get downloadDeduplicationEnabled => 'Las pistas previamente descargadas se omitirán'; + @override + String get downloadDeduplicationWithQualityVariants => + 'Existing files at the selected quality will be skipped'; + @override String get downloadDeduplicationDisabled => 'Todas las pistas se descargarán independientemente del historial'; + @override + String get downloadQualityVariants => 'Allow different quality versions'; + + @override + String get downloadQualityVariantsDescription => + 'Add the selected quality to the filename and keep each version in download history'; + + @override + String get trackOptionDownloadQualityVariant => 'Download another quality'; + @override String get downloadFallbackExtensions => 'Reslpado de extensiones'; @@ -8683,6 +8798,21 @@ class AppLocalizationsEsEs extends AppLocalizationsEs { @override String get queueDownloadStarting => 'Comenzando...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Seleccionar pista'; diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 52e4cfee..f15258f4 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -661,6 +661,12 @@ class AppLocalizationsFr extends AppLocalizations { @override String get collectionExportM3uFailed => 'Export failed'; + @override + String get trackOpenOn => 'Open on...'; + + @override + String get trackOpenOnNoLinks => 'No platform links found for this track.'; + @override String snackbarAddedToQueue(String trackName) { return 'Ajout de « $trackName » à la file d\'attente'; @@ -917,11 +923,11 @@ class AppLocalizationsFr extends AppLocalizations { String get updateNewVersionReady => 'Une nouvelle version est disponible'; @override - String get updateRequiredTitle => 'Update required'; + String get updateRequiredTitle => 'Mise à jour requise'; @override String updateRequiredNotice(int count) { - return 'This version is $count releases behind and is no longer supported. Update to keep using the app.'; + return 'Cette version a $count versions de retard et n\'est plus prise en charge. Effectuez la mise à jour pour continuer à utiliser l\'application.'; } @override @@ -1582,11 +1588,11 @@ class AppLocalizationsFr extends AppLocalizations { String get appearanceAmoledDarkSubtitle => 'Fond noir pur'; @override - String get appearanceHeroAnimations => 'Hero animations'; + String get appearanceHeroAnimations => 'Animations des héros'; @override String get appearanceHeroAnimationsSubtitle => - 'Fly covers between screens, e.g. when opening the player'; + 'Des fenêtres contextuelles apparaissent entre les écrans, par exemple lors de l\'ouverture du lecteur'; @override String get queueClearAll => 'Tout effacer'; @@ -1617,18 +1623,18 @@ class AppLocalizationsFr extends AppLocalizations { 'Choisissez le réseau à utiliser pour les téléchargements. Si vous sélectionnez « Wi-Fi uniquement », les téléchargements seront interrompus lorsque vous utilisez les données mobiles.'; @override - String get settingsConcurrentDownloads => 'Concurrent downloads'; + String get settingsConcurrentDownloads => 'Téléchargements simultanés'; @override String get settingsConcurrentDownloadsSubtitle => - 'Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.'; + 'Le téléchargement simultané de plusieurs titres est plus rapide, mais certains fournisseurs peuvent limiter le débit des requêtes parallèles.'; @override - String get concurrentDownloadsOne => '1 track at a time'; + String get concurrentDownloadsOne => '1 titre à la fois'; @override String concurrentDownloadsCount(int count) { - return 'Up to $count tracks at once'; + return 'Jusqu\'à $count titres à la fois'; } @override @@ -2265,18 +2271,18 @@ class AppLocalizationsFr extends AppLocalizations { 'Pochettes extraites des fichiers musicaux locaux. Elles seront extraites à nouveau lors de la prochaine analyse.'; @override - String get libraryPlaybackNormalization => 'Volume normalization'; + String get libraryPlaybackNormalization => 'Normalisation du volume'; @override String get libraryPlaybackNormalizationSubtitle => - 'Even out loudness between tracks using their ReplayGain or R128 tags, when present'; + 'Équilibrer le volume entre les morceaux à l\'aide des balises ReplayGain ou R128, lorsqu\'elles sont présentes'; @override - String get cacheAudioAnalysis => 'Audio analysis cache'; + String get cacheAudioAnalysis => 'Cache d\'analyse audio'; @override String get cacheAudioAnalysisDesc => - 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + 'Spectrogrammes et résultats d\'analyse enregistrés. Réanalyse prévue lors de la prochaine ouverture.'; @override String get cacheExploreFeed => 'Explorer le cache des flux'; @@ -2454,11 +2460,11 @@ class AppLocalizationsFr extends AppLocalizations { String get trackConvertBitrate => 'Débit binaire'; @override - String get trackConvertKeepOriginal => 'Keep original file'; + String get trackConvertKeepOriginal => 'Conserver le fichier d\'origine'; @override String get trackConvertKeepOriginalDescription => - 'Add the converted file as a separate library entry'; + 'Ajoutez le fichier converti en tant qu\'entrée distincte dans la bibliothèque'; @override String get trackConvertConfirmTitle => 'Confirmer la conversion'; @@ -2485,7 +2491,7 @@ class AppLocalizationsFr extends AppLocalizations { String sourceFormat, String targetFormat, ) { - return 'Convert from $sourceFormat to $targetFormat?\n\nThe original file will be kept and the converted file will be added as a separate library entry.'; + return 'Convertir du format $sourceFormat au format $targetFormat ?\n\nLe fichier d\'origine sera conservé et le fichier converti sera ajouté en tant qu\'entrée distincte dans la bibliothèque.'; } @override @@ -2780,10 +2786,10 @@ class AppLocalizationsFr extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'titres', + one: 'titre', ); - return 'Convert $count $_temp0 to $format?\n\nOriginal files will be kept and converted files will be added as separate library entries.'; + return 'Convertir $count $_temp0 au format $format ?\n\nLes fichiers d\'origine seront conservés et les fichiers convertis seront ajoutés sous forme d\'entrées distinctes dans la bibliothèque.'; } @override @@ -3117,22 +3123,23 @@ class AppLocalizationsFr extends AppLocalizations { 'Choisissez n\'importe quel dossier, y compris la carte SD'; @override - String get downloadFolderAccessLostTitle => 'Download folder access lost'; + String get downloadFolderAccessLostTitle => + 'Accès au dossier de téléchargement perdu'; @override String get downloadFolderAccessLostSubtitle => - 'Downloads will fail until you re-select the folder'; + 'Les téléchargements échoueront tant que vous n\'aurez pas resélectionné le dossier'; @override - String get downloadFolderReselect => 'Re-select folder'; + String get downloadFolderReselect => 'Sélectionner à nouveau le dossier'; @override String get downloadErrorSafPermissionLost => - 'SAF permission invalid or revoked. Please reconfigure download location in Settings.'; + 'Autorisation SAF non valide ou révoquée. Veuillez reconfigurer l\'emplacement de téléchargement dans les Paramètres.'; @override String get downloadErrorFolderAccessLost => - 'Download folder access lost. Please re-select your download folder in Settings.'; + 'Accès au dossier de téléchargement perdu. Veuillez sélectionner à nouveau votre dossier de téléchargement dans les Paramètres.'; @override String downloadFilenameDescription( @@ -3656,11 +3663,11 @@ class AppLocalizationsFr extends AppLocalizations { } @override - String get notifVerificationRequiredTitle => 'Verification required'; + String get notifVerificationRequiredTitle => 'Vérification requise'; @override String get notifVerificationRequiredBody => - 'Open the app to complete verification and resume downloads'; + 'Ouvrez l\'application pour terminer la vérification et reprendre les téléchargements'; @override String get notifAllDownloadsComplete => @@ -4052,21 +4059,23 @@ class AppLocalizationsFr extends AppLocalizations { @override String get downloadDeduplicationWithQualityVariants => - 'Existing files at the selected quality will be skipped'; + 'Les fichiers existants correspondant à la qualité sélectionnée seront ignorés'; @override String get downloadDeduplicationDisabled => 'Tous les morceaux seront téléchargés, quel que soit l\'historique'; @override - String get downloadQualityVariants => 'Allow different quality versions'; + String get downloadQualityVariants => + 'Autoriser différentes versions de qualité'; @override String get downloadQualityVariantsDescription => - 'Add the selected quality to the filename and keep each version in download history'; + 'Ajouter la qualité sélectionnée au nom du fichier et conserver chaque version dans l\'historique des téléchargements'; @override - String get trackOptionDownloadQualityVariant => 'Download another quality'; + String get trackOptionDownloadQualityVariant => + 'Télécharger une autre version de qualité'; @override String get downloadFallbackExtensions => 'Extensions de secours'; @@ -4199,19 +4208,21 @@ class AppLocalizationsFr extends AppLocalizations { String get queueDownloadStarting => 'C\'est parti...'; @override - String get queueCheckingDownloadSession => 'Checking download session...'; + String get queueCheckingDownloadSession => + 'Vérification de la session de téléchargement...'; @override - String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + String get queueResolvingDownloadMetadata => + 'Récupération des métadonnées du morceau...'; @override - String get queueResolvingDownloadStream => 'Preparing audio stream...'; + String get queueResolvingDownloadStream => 'Préparation du flux audio...'; @override - String get queueWaitingForVerification => 'Waiting for verification...'; + String get queueWaitingForVerification => 'En attente de vérification...'; @override - String get queueResumingAfterVerification => 'Resuming after verification...'; + String get queueResumingAfterVerification => 'Reprise après vérification...'; @override String get a11ySelectTrack => 'Sélectionner une piste'; diff --git a/lib/l10n/app_localizations_id.dart b/lib/l10n/app_localizations_id.dart index 36b43c53..31fb2b03 100644 --- a/lib/l10n/app_localizations_id.dart +++ b/lib/l10n/app_localizations_id.dart @@ -110,7 +110,7 @@ class AppLocalizationsId extends AppLocalizations { 'Gunakan warna dari wallpaper Anda'; @override - String get appearanceHistoryView => 'Tampilan Riwayat'; + String get appearanceHistoryView => 'Gaya Tampilan Histori'; @override String get appearanceHistoryViewList => 'Daftar'; @@ -138,7 +138,7 @@ class AppLocalizationsId extends AppLocalizations { 'Pilih tab mana yang terbuka terlebih dahulu untuk hasil pencarian baru.'; @override - String get optionsAutoFallback => 'Cadangan Otomatis'; + String get optionsAutoFallback => 'Layanan Cadangan'; @override String get optionsAutoFallbackSubtitle => @@ -647,6 +647,12 @@ class AppLocalizationsId extends AppLocalizations { @override String get collectionExportM3uFailed => 'Export failed'; + @override + String get trackOpenOn => 'Open on...'; + + @override + String get trackOpenOnNoLinks => 'No platform links found for this track.'; + @override String snackbarAddedToQueue(String trackName) { return 'Menambahkan \"$trackName\" ke antrian'; diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index f572a182..eb11de7b 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -642,6 +642,12 @@ class AppLocalizationsJa extends AppLocalizations { @override String get collectionExportM3uFailed => 'Export failed'; + @override + String get trackOpenOn => 'Open on...'; + + @override + String get trackOpenOnNoLinks => 'No platform links found for this track.'; + @override String snackbarAddedToQueue(String trackName) { return '「$trackName」をキューに追加しました'; diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart new file mode 100644 index 00000000..9e4162a1 --- /dev/null +++ b/lib/l10n/app_localizations_ko.dart @@ -0,0 +1,4549 @@ +// 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 => '홈'; + + @override + String get navLibrary => '라이브러리'; + + @override + String get navSettings => '설정'; + + @override + String get navStore => '레포'; + + @override + String get homeTitle => '홈'; + + @override + String get homeSubtitle => '지원되는 URL을 붙여넣거나, 이름으로 검색하세요'; + + @override + String get homeEmptyTitle => '아직 검색 제공자가 없음'; + + @override + String get homeEmptySubtitle => '계속하려면 확장 프로그램을 설치하세요'; + + @override + String get homeSupports => '지원 항목: 트랙, 앨범, 재생목록, 아티스트 URL'; + + @override + String get homeRecent => '최근 기록'; + + @override + String get historyFilterAll => '모두'; + + @override + String get historyFilterAlbums => '앨범'; + + @override + String get historyFilterSingles => '싱글'; + + @override + String get historySearchHint => '기록 검색...'; + + @override + String get settingsTitle => '설정'; + + @override + String get settingsDownload => '다운로드'; + + @override + String get settingsAppearance => '디자인'; + + @override + String get settingsExtensions => '확장 프로그램'; + + @override + String get settingsAbout => '정보'; + + @override + String get downloadTitle => '다운로드'; + + @override + String get downloadAskQualitySubtitle => '다운로드를 할 때마다 음질을 선택하도록 합니다'; + + @override + String get downloadFilenameFormat => '파일 이름 형식'; + + @override + String get downloadSingleFilenameFormat => '싱글 파일 이름 형식'; + + @override + String get downloadSingleFilenameFormatDescription => + '싱글 및 EP용 파일 이름 패턴입니다. 앨범 형식과 동일한 태그를 사용합니다'; + + @override + String get downloadFolderOrganization => '폴더 분류 형식'; + + @override + String get appearanceTitle => '디자인'; + + @override + String get appearanceThemeSystem => '시스템'; + + @override + String get appearanceThemeLight => '밝은'; + + @override + String get appearanceThemeDark => '어두운'; + + @override + String get appearanceDynamicColor => '동적 색상'; + + @override + String get appearanceDynamicColorSubtitle => '배경 화면을 참고하여 강조 색상이 지정됩니다'; + + @override + String get appearanceHistoryView => '기록 정렬 방식'; + + @override + String get appearanceHistoryViewList => '리스트'; + + @override + String get appearanceHistoryViewGrid => '그리드'; + + @override + String get optionsPrimaryProvider => '기본 제공자'; + + @override + String get optionsPrimaryProviderSubtitle => '트랙 또는 앨범 이름으로 검색하는 데 사용되는 서비스'; + + @override + String optionsUsingExtension(String extensionName) { + return '확장 프로그램 사용: $extensionName'; + } + + @override + String get optionsDefaultSearchTab => '기본 검색 탭'; + + @override + String get optionsDefaultSearchTabSubtitle => '새 검색 결과를 표시할 탭을 먼저 선택하세요'; + + @override + String get optionsAutoFallback => '자동 대체'; + + @override + String get optionsAutoFallbackSubtitle => '다운로드가 실패한 경우에 다른 서비스를 사용합니다'; + + @override + String get optionsEmbedLyrics => '가사 삽입'; + + @override + String get optionsEmbedLyricsSubtitle => '다운로드된 트랙과 함께 동기화된 가사를 저장합니다'; + + @override + String get optionsMaxQualityCover => '고품질 표지 이미지'; + + @override + String get optionsMaxQualityCoverSubtitle => '최고 해상도의 표지 이미지를 다운로드'; + + @override + String get optionsReplayGain => '리플레이게인'; + + @override + String get optionsReplayGainSubtitleOn => '음량 스캔 및 리플레이게인 태그 삽입 (EBU R128)'; + + @override + String get optionsReplayGainSubtitleOff => '비활성화됨: 음량 정규화 태그 없음'; + + @override + String get trackReplayGain => '리플레이게인 다시 스캔'; + + @override + String get trackReplayGainScanning => '음량을 분석하는 중...'; + + @override + String get trackReplayGainSuccess => '리플레이게인 태그가 추가됨'; + + @override + String get trackReplayGainFailed => '리플레이게인 태그 추가 실패'; + + @override + String selectionReplayGainCount(int count) { + return '리플레이게인 ($count)'; + } + + @override + String get replayGainBatchConfirmTitle => '리플레이게인 추가'; + + @override + String replayGainBatchConfirmMessage(int count) { + return '음량을 분석하고 $count 개의 트랙에 리플레이게인 태그를 추가하시겠습니까?'; + } + + @override + String get replayGainBatchAnalyzing => '리플레이게인을 분석하는 중...'; + + @override + String replayGainBatchSuccess(int success, int total) { + return '$total 개의 트랙 중 $success 개에 리플레이게인이 추가됨'; + } + + @override + String get optionsArtistTagMode => '아티스트 태그 모드'; + + @override + String get optionsArtistTagModeDescription => + '여러 아티스트를 내장 태그에 작성하는 방법을 선택하세요'; + + @override + String get optionsArtistTagModeJoined => '단일 결합 값'; + + @override + String get optionsArtistTagModeJoinedSubtitle => + '플레이어 호환성을 최대화하려면 \'아티스트 A, 아티스트 B\'와 같이 하나의 아티스트 값을 입력하세요'; + + @override + String get optionsArtistTagModeSplitVorbis => 'FLAC/Opus용 태그 분할'; + + @override + String get optionsArtistTagModeSplitVorbisSubtitle => + 'FLAC 및 Opus의 경우 아티스트당 하나의 아티스트 태그를 작성하세요. MP3 및 M4A는 병합된 상태로 유지됩니다'; + + @override + String get optionsExtensionStore => '확장 프로그램 레포'; + + @override + String get optionsExtensionStoreSubtitle => '하단바에서 레포 탭 표시'; + + @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 extensionsTitle => '확장 프로그램'; + + @override + String get extensionsDisabled => '비활성화됨'; + + @override + String extensionsVersion(String version) { + return '버전 $version'; + } + + @override + String get extensionsUninstall => '제거'; + + @override + String get storeTitle => '확장 프로그램 레포'; + + @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 => '모바일 소스 코드'; + + @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 => '텔레그램 채널'; + + @override + String get aboutTelegramChannelSubtitle => '공지 및 업데이트 안내'; + + @override + String get aboutTelegramChat => '텔레그램 커뮤니티'; + + @override + String get aboutTelegramChatSubtitle => '다른 이용자와 소통'; + + @override + String get aboutSocial => '소셜 네트워크'; + + @override + String get aboutApp => '앱 정보'; + + @override + String get aboutVersion => '버전'; + + @override + String get aboutBinimumDesc => + 'QQDL 및 HiFi API 개발자입니다. 이 프로젝트는 무손실 다운로드 지원을 형성하는 데 도움을 주셨습니다'; + + @override + String get aboutSachinsenalDesc => + 'HiFi 프로젝트의 원작자이자, 무손실 음원 소스 연동 기능의 토대를 구축한 개발자입니다'; + + @override + String get aboutSjdonadoDesc => + 'I Don\'t Have Spotify(IDHS) 개발자입니다. 위급 상황 발생 시 해결해 주는 대체 링크 해결 도구를 만들었습니다!'; + + @override + String get aboutAppDescription => + '음악 메타데이터를 검색하고\\n확장 프로그램을 관리하고\\n라이브러리를 정리하세요'; + + @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 => '언어 선택'; + + @override + String get setupLanguageDescription => + '앱에서 사용할 언어를 선택하세요\\n나중에 설정에서 변경할 수 있습니다'; + + @override + String get setupLanguageSystemDefault => '시스템 기본값'; + + @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 => '다운로드'; + + @override + String get previewPlay => '미리듣기 재생'; + + @override + String get previewStop => '미리듣기 중지'; + + @override + String get previewUnavailable => '미리듣기를 사용할 수 없음'; + + @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: '트랙', + one: '트랙', + ); + return '기록에서 $count 개의 $_temp0을 삭제하시겠습니까?\n\n저장소에서도 파일이 삭제됩니다'; + } + + @override + String get dialogImportPlaylistTitle => '재생목록 가져오기'; + + @override + String dialogImportPlaylistMessage(int count) { + return 'CSV 파일에서 $count 개의 트랙을 찾았습니다. 다운로드 목록에 추가하시겠습니까?'; + } + + @override + String csvImportTracks(int count) { + return 'CSV 파일의 트랙: $count'; + } + + @override + String get collectionExportM3u => 'Export as M3U8'; + + @override + String collectionExportM3uDone(int exported, int total) { + return 'Exported $exported of $total tracks'; + } + + @override + String get collectionExportM3uNone => 'No downloaded files to export'; + + @override + String get collectionExportM3uFailed => 'Export failed'; + + @override + String get trackOpenOn => 'Open on...'; + + @override + String get trackOpenOnNoLinks => 'No platform links found for this track.'; + + @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 snackbarDeletedTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '$count 개의 $_temp0이 삭제됨'; + } + + @override + String snackbarCannotOpenFile(String error) { + return '파일을 열 수 없음: $error'; + } + + @override + String get snackbarViewQueue => '다운로드 목록 보기'; + + @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 => '사용 제한됨'; + + @override + String get errorRateLimitedMessage => '요청이 너무 많습니다. 잠시 후 다시 검색해 주세요'; + + @override + String get errorNoTracksFound => '트랙을 찾을 수 없음'; + + @override + String get searchEmptyResultSubtitle => '다른 키워드를 검색해 보세요'; + + @override + String get errorUrlNotRecognized => '링크를 인식할 수 없음'; + + @override + String get errorUrlNotRecognizedMessage => + '이 링크는 지원되지 않습니다. URL이 올바른지, 호환되는 확장 프로그램이 설치되어 있는지 확인하세요'; + + @override + String get errorUrlFetchFailed => '이 링크에서 콘텐츠를 불러오는 데 실패하였습니다. 다시 시도해 주세요'; + + @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 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 => '결과 정렬'; + + @override + String get searchSortDefault => '기본값'; + + @override + String get searchSortTitleAZ => '제목 (오름차순)'; + + @override + String get searchSortTitleZA => '제목 (내림차순)'; + + @override + String get searchSortArtistAZ => '아티스트 (오름차순)'; + + @override + String get searchSortArtistZA => '아티스트 (내림차순)'; + + @override + String get searchSortDurationShort => '재생시간 (짧은순)'; + + @override + String get searchSortDurationLong => '재생시간 (긴순)'; + + @override + String get searchSortDateOldest => '발매일자 (오래된순)'; + + @override + String get searchSortDateNewest => '발매일자 (최신순)'; + + @override + String get tooltipPlay => '재생'; + + @override + String get filenameFormat => '파일 이름 형식'; + + @override + String get filenameShowAdvancedTags => '고급 태그 표시'; + + @override + String get filenameShowAdvancedTagsDescription => + '트랙 패딩 및 날짜 패턴에 대한 서식 있는 태그를 활성화합니다'; + + @override + String get folderOrganizationNone => '정리하지 않음'; + + @override + String get folderOrganizationByPlaylist => '재생목록별'; + + @override + String get folderOrganizationByPlaylistSubtitle => '각 재생목록별 별도 폴더'; + + @override + String get folderOrganizationByArtist => '아티스트별'; + + @override + String get folderOrganizationByAlbum => '앨범별'; + + @override + String get folderOrganizationByArtistAlbum => '아티스트/앨범'; + + @override + String get folderOrganizationDescription => '다운로드된 파일을 폴더로 정리'; + + @override + String get folderOrganizationNoneSubtitle => '다운로드 폴더의 모든 파일'; + + @override + String get folderOrganizationByArtistSubtitle => '각 아티스트별 별도 폴더'; + + @override + String get folderOrganizationByAlbumSubtitle => '각 앨범별 별도 폴더'; + + @override + String get folderOrganizationByArtistAlbumSubtitle => '아티스트 및 앨범용 중첩 폴더'; + + @override + String get updateAvailable => '업데이트 사용 가능'; + + @override + String get updateLater => '나중에'; + + @override + String get updateStartingDownload => '다운로드를 시작하는 중...'; + + @override + String get updateDownloadFailed => '다운로드 실패'; + + @override + String get updateFailedMessage => '업데이트 다운로드 실패'; + + @override + String get updateNewVersionReady => '새 버전이 준비되었습니다'; + + @override + String get updateRequiredTitle => '업데이트 필요'; + + @override + String updateRequiredNotice(int count) { + return '이 버전은 최신 버전보다 $count 개 이전 버전이며 더 이상 지원되지 않습니다. 앱을 계속 사용하려면 업데이트하세요'; + } + + @override + String get updateCurrent => '현재 버전'; + + @override + String get updateNew => '새 버전'; + + @override + String get updateDownloading => '다운로드하는 중...'; + + @override + String get updateWhatsNew => '새 기능'; + + @override + String get updateDownloadInstall => '다운로드 & 설치'; + + @override + String get updateDontRemind => '알림 안 함'; + + @override + String get providerPriorityTitle => '제공자 우선순위'; + + @override + String get providerPriorityDescription => + '드래그하여 다운로드 제공자 순서를 변경하세요. 앱은 트랙을 다운로드할 경우에 위에서 아래로 제공자를 차례로 시도합니다'; + + @override + String get providerPriorityInfo => + '첫 ​​번째 제공자에서 트랙을 사용할 수 없는 경우에 앱은 자동으로 다음 제공자를 시도합니다'; + + @override + String get providerPriorityFallbackExtensionsDescription => + '자동 대체 중에 사용할 수 있는 설치된 다운로드 확장 프로그램을 선택하세요'; + + @override + String get providerPriorityFallbackExtensionsHint => + '다운로드 공급자 기능이 활성화된 확장 프로그램만 여기에 나열됩니다'; + + @override + String get providerExtension => '확장 프로그램'; + + @override + String get metadataProviderPriorityTitle => '메타데이터 우선순위'; + + @override + String get metadataProviderPriorityDescription => + '드래그하여 메타데이터 제공자 순서를 변경하세요. 앱은 트랙을 검색하고 메타데이터를 가져올 경우에 위에서 아래로 제공자를 시도합니다'; + + @override + String get metadataProviderPriorityInfo => + 'Deezer는 요청 횟수 제한이 없으므로 기본 앱으로 사용하는 것이 좋습니다. Spotify는 요청 횟수가 많아지면 요청 횟수를 제한할 수 있습니다'; + + @override + String get logTitle => '로그'; + + @override + String get logCopied => '로그가 클립보드에 복사됨'; + + @override + String get logSearchHint => '로그 검색...'; + + @override + String get logFilterLevel => '레벨'; + + @override + String get logFilterSection => '필터'; + + @override + String get logShareLogs => '로그 공유'; + + @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 개 필터됨)'; + } + + @override + String logEntries(int count) { + return '항목 ($count)'; + } + + @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 => '디버그'; + + @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 => '테마'; + + @override + String get sectionLayout => '레이아웃'; + + @override + String get sectionLanguage => '언어'; + + @override + String get appearanceLanguage => '앱 언어'; + + @override + String get settingsAppearanceSubtitle => '테마, 색상, 디스플레이'; + + @override + String get settingsDownloadSubtitle => '서비스, 음질, 대체'; + + @override + String get settingsExtensionsSubtitle => '다운로드 제공자 관리'; + + @override + String get settingsLogsSubtitle => '디버깅을 위한 앱 로그 보기'; + + @override + String get loadingSharedLink => '공유된 링크를 불러오는 중...'; + + @override + String get pressBackAgainToExit => '종료하려면 뒤로가기 버튼을 다시 탭하세요'; + + @override + String downloadAllCount(int count) { + return '모두 다운로드 ($count)'; + } + + @override + String tracksCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 개의 트랙', + one: '1 개의 트랙', + ); + return '$_temp0'; + } + + @override + String get trackCopyFilePath => '파일 경로 복사'; + + @override + String get trackRemoveFromDevice => '기기에서 제거'; + + @override + String get trackLoadLyrics => '가사 불러오기'; + + @override + String get trackMetadata => '메타데이터'; + + @override + String get trackFileInfo => '파일 정보'; + + @override + String get trackLyrics => '가사'; + + @override + String get trackFileNotFound => '파일을 찾을 수 없음'; + + @override + String get trackOpenInDeezer => 'Deezer에서 열기'; + + @override + String get trackOpenInSpotify => 'Spotify에서 열기'; + + @override + String get trackTrackName => '트랙 이름'; + + @override + String get trackArtist => '아티스트'; + + @override + String get trackAlbumArtist => '앨범 아티스트'; + + @override + String get trackAlbum => '앨범'; + + @override + String get trackTrackNumber => '트랙 번호'; + + @override + String get trackDiscNumber => '디스크 번호'; + + @override + String get trackDuration => '재생시간'; + + @override + String get trackAudioQuality => '오디오 음질'; + + @override + String get trackReleaseDate => '발매일자'; + + @override + String get trackGenre => '장르'; + + @override + String get trackLabel => '레이블'; + + @override + String get trackCopyright => '저작권'; + + @override + String get trackDownloaded => '다운로드됨'; + + @override + String get trackCopyLyrics => '가사 복사'; + + @override + String trackLyricsSource(String source) { + return '출처: $source'; + } + + @override + String get trackLyricsNotAvailable => '이 트랙의 가사를 사용할 수 없습니다'; + + @override + String get trackLyricsNotInFile => '이 파일에서 가사를 찾을 수 없습니다'; + + @override + String get trackFetchOnlineLyrics => '온라인에서 가져오기'; + + @override + String get trackLyricsTimeout => '요청 시간이 초과되었습니다. 나중에 다시 시도하세요'; + + @override + String get trackLyricsLoadFailed => '가사 불러오기 실패'; + + @override + String get trackEmbedLyrics => '가사 삽입'; + + @override + String get trackLyricsEmbedded => '가사 삽입 성공'; + + @override + String get trackInstrumental => '반주 트랙'; + + @override + String get trackCopiedToClipboard => '클립보드에 복사됨'; + + @override + String get trackDeleteConfirmTitle => '기기에서 제거하시겠습니까?'; + + @override + String get trackDeleteConfirmMessage => + '이렇게 하면 다운로드된 파일이 영구적으로 삭제되고 기록에서 제거됩니다'; + + @override + String get dateToday => '오늘'; + + @override + String get dateYesterday => '어제'; + + @override + String dateDaysAgo(int count) { + return '$count 일 전'; + } + + @override + String dateWeeksAgo(int count) { + return '$count 주 전'; + } + + @override + String dateMonthsAgo(int count) { + return '$count 달 전'; + } + + @override + String get storeFilterAll => '모두'; + + @override + String get storeFilterMetadata => '메타데이터'; + + @override + String get storeFilterDownload => '다운로드'; + + @override + String get storeFilterUtility => '유틸리티'; + + @override + String get storeFilterLyrics => '가사'; + + @override + String get storeFilterIntegration => '연동'; + + @override + String get storeClearFilters => '필터 지우기'; + + @override + String get storeAddRepoTitle => '확장 프로그램 레포지토리 추가'; + + @override + String get storeAddRepoDescription => + '확장 프로그램을 찾아보고 설치하려면 registry.json 파일이 포함된 GitHub 레포지토리 URL을 입력하세요'; + + @override + String get storeRepoUrlLabel => '레포지토리 URL'; + + @override + String get storeRepoUrlHint => 'https://github.com/user/repo'; + + @override + String get storeAddRepoButton => '레포지토리 추가'; + + @override + String get storeChangeRepoTooltip => '레포지토리 변경'; + + @override + String get storeRepoDialogTitle => '확장 프로그램 레포지토리'; + + @override + String get storeRepoDialogCurrent => '현재 레포지토리:'; + + @override + String get storeNewRepoUrlLabel => '새 레포지토리 URL'; + + @override + String get storeLoadError => '레포지토리 불러오기 실패'; + + @override + String get storeEmptyNoExtensions => '사용 가능한 확장 프로그램이 없음'; + + @override + String get storeEmptyNoResults => '확장 프로그램을 찾을 수 없음'; + + @override + String get extensionId => 'ID'; + + @override + String get extensionError => '오류'; + + @override + String get extensionCapabilities => '기능'; + + @override + String get extensionMetadataProvider => '메타데이터 제공자'; + + @override + String get extensionDownloadProvider => '다운로드 제공자'; + + @override + String get extensionLyricsProvider => '가사 제공자'; + + @override + String get extensionUrlHandler => 'URL 핸들러'; + + @override + String get extensionQualityOptions => '음질 옵션'; + + @override + String get extensionPostProcessingHooks => '후처리 후크'; + + @override + String get extensionPermissions => '권한'; + + @override + String get extensionSettings => '설정'; + + @override + String get extensionRemoveButton => '확장 프로그램 제거'; + + @override + String get extensionUpdated => '업데이트됨'; + + @override + String get extensionMinAppVersion => '최소 앱 버전'; + + @override + String get extensionCustomTrackMatching => '사용자 정의 트랙 매칭'; + + @override + String get extensionPostProcessing => '후처리'; + + @override + String extensionHooksAvailable(int count) { + return '$count 개의 후크 사용 가능'; + } + + @override + String extensionPatternsCount(int count) { + return '$count 개의 패턴'; + } + + @override + String extensionStrategy(String strategy) { + return '전략: $strategy'; + } + + @override + String get extensionsProviderPrioritySection => '제공자 우선순위'; + + @override + String get extensionsInstalledSection => '설치된 확장 프로그램'; + + @override + String get extensionsNoExtensions => '설치된 확장 프로그램이 없음'; + + @override + String get extensionsNoExtensionsSubtitle => + '새 제공자를 추가하려면 .spotiflac-ext 파일을 설치하세요'; + + @override + String get extensionsInstallButton => '확장 프로그램 설치'; + + @override + String get extensionsInfoTip => + '확장 프로그램은 새 메타데이터와 다운로드 제공자를 추가할 수 있습니다. 신뢰할 수 있는 출처에서만 확장 프로그램을 설치하세요'; + + @override + String get extensionsInstalledSuccess => '확장 프로그램 설치 성공'; + + @override + String extensionsInstalledCount(int count) { + return '$count 개의 확장 프로그램 설치 성공'; + } + + @override + String extensionsInstallPartialSuccess(int installed, int attempted) { + return '$attempted 개의 확장 프로그램 중 $installed 개가 설치됨'; + } + + @override + String get extensionsDownloadPriority => '다운로드 우선순위'; + + @override + String get extensionsDownloadPrioritySubtitle => '다운로드 서비스 순서를 설정하세요'; + + @override + String get extensionsFallbackTitle => '대체 확장 프로그램'; + + @override + String get extensionsFallbackSubtitle => + '설치된 다운로드 확장 프로그램 중 대체 프로그램으로 사용할 항목을 선택하세요'; + + @override + String get extensionsNoDownloadProvider => '다운로드 제공자가 있는 확장 프로그램가 없음'; + + @override + String get extensionsMetadataPriority => '메타데이터 우선순위'; + + @override + String get extensionsMetadataPrioritySubtitle => '검색 & 메타데이터 출처 순서 설정'; + + @override + String get extensionsNoMetadataProvider => '메타데이터 제공자가 있는 확장 프로그램이 없음'; + + @override + String get extensionsSearchProvider => '검색 제공자'; + + @override + String get extensionsNoCustomSearch => '사용자 정의 검색이 있는 확장 프로그램이 없음'; + + @override + String get extensionsSearchProviderDescription => '트랙 검색에 사용할 서비스를 선택하세요'; + + @override + String get extensionsCustomSearch => '사용자 정의 검색'; + + @override + String get extensionsErrorLoading => '확장 프로그램 불러오기 오류'; + + @override + String get qualityFlacLossless => 'FLAC 무손실'; + + @override + String get qualityFlacLosslessSubtitle => '16-bit / 44.1kHz'; + + @override + String get qualityHiResFlac => 'Hi-Res FLAC'; + + @override + String get qualityHiResFlacSubtitle => '24-bit / 최대 96kHz'; + + @override + String get qualityHiResFlacMax => 'Hi-Res FLAC Max'; + + @override + String get qualityHiResFlacMaxSubtitle => '24-bit / 최대 192kHz'; + + @override + String get downloadLossy320 => '손실 압축 320kbps'; + + @override + String get downloadLossyFormat => '손실 압축 형식'; + + @override + String get downloadLossy320Format => '손실 압축 320kbps 형식'; + + @override + String get downloadLossy320FormatDesc => + '320kbps 손실 다운로드의 출력 형식을 선택하세요. 필요에 따라 원본 스트림이 선택한 형식으로 변환됩니다'; + + @override + String get downloadLossyMp3 => 'MP3 320kbps'; + + @override + String get downloadLossyMp3Subtitle => '최상의 호환성, 트랙당 약 10MB'; + + @override + String get downloadLossyAac => 'AAC/M4A 320kbps'; + + @override + String get downloadLossyAacSubtitle => '최상의 모바일 호환성, M4A 컨테이너'; + + @override + String get downloadLossyOpus256 => 'Opus 256kbps'; + + @override + String get downloadLossyOpus256Subtitle => '최고 음질 Opus, 트랙당 약 8MB'; + + @override + String get downloadLossyOpus128 => 'Opus 128kbps'; + + @override + String get downloadLossyOpus128Subtitle => '트랙당 최소 크기, 약 4MB'; + + @override + String get downloadAskBeforeDownload => '다운로드 전 확인'; + + @override + String get downloadDirectory => '다운로드 디렉토리'; + + @override + String get downloadSeparateSinglesFolder => '싱글 폴더 별도 다운로드'; + + @override + String get downloadAlbumFolderStructure => '앨범 폴더 구조'; + + @override + String get albumFolderStructureDescription => '앨범 폴더 구조를 선택하세요'; + + @override + String get downloadUseAlbumArtistForFolders => '폴더에 앨범 아티스트 사용'; + + @override + String get downloadUsePrimaryArtistOnly => '폴더에 기본 아티스트만 사용'; + + @override + String get downloadUsePrimaryArtistOnlyEnabled => + '폴더 이름에서 피처링 아티스트가 제거됩니다 (예: Justin Bieber, Quavo → Justin Bieber)'; + + @override + String get downloadUsePrimaryArtistOnlyDisabled => + '폴더 이름에 전체 아티스트 문자열이 사용됩니다'; + + @override + String get downloadSelectQuality => '음질 선택'; + + @override + String get downloadFrom => '다운로드 제공자 선택'; + + @override + String get appearanceAmoledDark => '아몰레드 블랙'; + + @override + String get appearanceAmoledDarkSubtitle => '순수 검정 배경화면'; + + @override + String get appearanceHeroAnimations => '히어로 애니메이션'; + + @override + String get appearanceHeroAnimationsSubtitle => + '화면 간 이동 시 표지 이미지가 날아가는 애니메이션을 표시합니다 (예시: 플레이어를 실행할 경우)'; + + @override + String get queueClearAll => '모두 지우기'; + + @override + String get queueClearAllMessage => '모든 다운로드를 지우시겠습니까?'; + + @override + String get settingsAutoExportFailed => '실패한 다운로드 자동 내보내기'; + + @override + String get settingsAutoExportFailedSubtitle => '실패한 다운로드를 TXT 파일으로 자동 저장합니다'; + + @override + String get settingsDownloadNetwork => '다운로드 네트워크'; + + @override + String get settingsDownloadNetworkAny => 'WiFi + 모바일 네트워크'; + + @override + String get settingsDownloadNetworkWifiOnly => 'WiFi 전용'; + + @override + String get settingsDownloadNetworkSubtitle => + '다운로드에 사용할 네트워크를 선택하세요. Wi-Fi 전용으로 설정하면 모바일 데이터 사용 시 다운로드가 일시 중지됩니다'; + + @override + String get settingsConcurrentDownloads => '동시 다운로드'; + + @override + String get settingsConcurrentDownloadsSubtitle => + '여러 트랙을 동시에 다운로드하면 속도는 빨라지지만, 일부 제공자는 동시 요청을 제한할 수 있습니다'; + + @override + String get concurrentDownloadsOne => '한 번에 1개의 트랙'; + + @override + String concurrentDownloadsCount(int count) { + return '한 번에 최대 $count 개의 트랙'; + } + + @override + String get albumFolderArtistAlbum => '아티스트 / 앨범'; + + @override + String get albumFolderArtistAlbumSubtitle => '앨범/아티스트 이름/앨범 이름/'; + + @override + String get albumFolderArtistYearAlbum => '아티스트 / [연도] 앨범'; + + @override + String get albumFolderArtistYearAlbumSubtitle => '앨범/아티스트 이름/[2005] 앨범 이름/'; + + @override + String get albumFolderAlbumOnly => '앨범만'; + + @override + String get albumFolderAlbumOnlySubtitle => '앨범/앨범 이름/'; + + @override + String get albumFolderYearAlbum => '[연도] 앨범'; + + @override + String get albumFolderYearAlbumSubtitle => '앨범/[2005] 앨범 이름/'; + + @override + String get albumFolderArtistAlbumSingles => '아티스트 / 앨범 + 싱글'; + + @override + String get albumFolderArtistAlbumSinglesSubtitle => '아티스트/앨범/ 및 아티스트/싱글/'; + + @override + String get albumFolderArtistAlbumFlat => '아티스트 / 앨범 (싱글 플랫)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => '아티스트/앨범/ 및 아티스트/song.flac'; + + @override + String get downloadedAlbumDeleteSelected => '선택 항목 삭제'; + + @override + String downloadedAlbumDeleteMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '앨범에서 $count 개의 $_temp0을 삭제하시겠습니까?\n\n저장소에서도 파일이 삭제됩니다'; + } + + @override + String downloadedAlbumSelectedCount(int count) { + return '$count 개 선택됨'; + } + + @override + String get downloadedAlbumTapToSelect => '트랙을 탭하여 선택하세요'; + + @override + String downloadedAlbumDeleteCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '$count $_temp0 삭제'; + } + + @override + String get downloadedAlbumSelectToDelete => '삭제할 트랙 선택'; + + @override + String downloadedAlbumDiscHeader(int discNumber) { + return '디스크 $discNumber'; + } + + @override + String get recentTypeArtist => '아티스트'; + + @override + String get recentTypeAlbum => '앨범'; + + @override + String get recentTypeSong => '노래'; + + @override + String get recentTypePlaylist => '재생목록'; + + @override + String get recentEmpty => '최근 항목이 없음'; + + @override + String get recentShowAllDownloads => '모든 다운로드 표시'; + + @override + String recentPlaylistInfo(String name) { + return '재생목록: $name'; + } + + @override + String get discographyDownload => '디스코그래피 다운로드'; + + @override + String get discographyDownloadAll => '모두 다운로드'; + + @override + String discographyDownloadAllSubtitle(int count, int albumCount) { + return '$albumCount 개의 발매 음악에서 $count 개의 트랙'; + } + + @override + String get discographyAlbumsOnly => '앨범만'; + + @override + String discographyAlbumsOnlySubtitle(int count, int albumCount) { + return '$albumCount 개의 앨범에서 $count 개의 트랙'; + } + + @override + String get discographySinglesOnly => '싱글 & EP만'; + + @override + String discographySinglesOnlySubtitle(int count, int albumCount) { + return '$albumCount 개의 싱글에서 $count 개의 트랙'; + } + + @override + String get discographySelectAlbums => '앨범 검색...'; + + @override + String get discographySelectAlbumsSubtitle => '특정 앨범 또는 싱글을 선택하세요'; + + @override + String get discographyFetchingTracks => '트랙을 가져오는 중...'; + + @override + String discographyFetchingAlbum(int current, int total) { + return '$total 개 중 $current 개를 가져오는 중...'; + } + + @override + String discographySelectedCount(int count) { + return '$count 개 선택됨'; + } + + @override + String get discographyDownloadSelected => '선택 항목 다운로드'; + + @override + String discographyAddedToQueue(int count) { + return '다운로드 목록에 $count 개의 트랙이 추가됨'; + } + + @override + String discographySkippedDownloaded(int added, int skipped) { + return '$added 개 추가됨, $skipped 개 이미 다운로드됨'; + } + + @override + String get discographyNoAlbums => '사용 가능한 앨범이 없음'; + + @override + String get discographyFailedToFetch => '일부 앨범 가져오기 실패'; + + @override + String get sectionStorageAccess => '저장소 접근'; + + @override + String get allFilesAccess => '모든 파일 접근'; + + @override + String get allFilesAccessEnabledSubtitle => '모든 폴더에 쓰기 가능'; + + @override + String get allFilesAccessDisabledSubtitle => '미디어 폴더에만 제한됨'; + + @override + String get allFilesAccessDescription => + '사용자 정의 폴더에 저장할 경우에 쓰기 오류가 발생하면 이 옵션을 활성화하세요. Android 13 이상에서는 기본적으로 특정 디렉터리에 대한 접근이 제한됩니다'; + + @override + String get allFilesAccessDeniedMessage => + '권한이 거부되었습니다. 시스템 설정에서 \'모든 파일 접근\'를 수동으로 활성화하세요'; + + @override + String get allFilesAccessDisabledMessage => + '모든 파일 접근을 비활성화하였습니다. 앱은 제한된 저장소 접근을 사용합니다'; + + @override + String get settingsLocalLibrary => '로컬 라이브러리'; + + @override + String get settingsLocalLibrarySubtitle => '음악 스캔 & 중복 감지'; + + @override + String get settingsCache => '저장소 & 캐시'; + + @override + String get settingsCacheSubtitle => '크기 보기 및 캐시된 데이터 지우기'; + + @override + String get libraryTitle => '로컬 라이브러리'; + + @override + String get libraryScanSettings => '스캔 설정'; + + @override + String get libraryEnableLocalLibrary => '로컬 라이브러리 활성화'; + + @override + String get libraryEnableLocalLibrarySubtitle => '기존 음악을 스캔하고 추적하세요'; + + @override + String get libraryFolder => '라이브러리 폴더'; + + @override + String get libraryFolderHint => '탭하여 폴더를 선택하세요'; + + @override + String get libraryShowDuplicateIndicator => '중복 표시기 표시'; + + @override + String get libraryShowDuplicateIndicatorSubtitle => '기존 트랙을 검색할 때 표시'; + + @override + String get libraryAutoScan => '자동 스캔'; + + @override + String get libraryAutoScanSubtitle => '라이브러리에서 새 파일을 자동으로 스캔합니다'; + + @override + String get libraryAutoScanOff => '끄기'; + + @override + String get libraryAutoScanOnOpen => '앱을 열 때마다'; + + @override + String get libraryAutoScanDaily => '매일'; + + @override + String get libraryAutoScanWeekly => '주간'; + + @override + String get libraryActions => '작업'; + + @override + String get libraryScan => '라이브러리 스캔'; + + @override + String get libraryScanSubtitle => '오디오 파일 스캔'; + + @override + String get libraryScanSelectFolderFirst => '먼저 폴더를 선택하세요'; + + @override + String get libraryCleanupMissingFiles => '누락된 파일 정리'; + + @override + String get libraryCleanupMissingFilesSubtitle => + '더 이상 존재하지 않는 파일에 대한 항목을 제거합니다'; + + @override + String get libraryClear => '라이브러리 정리'; + + @override + String get libraryClearSubtitle => '스캔된 모든 트랙 제거'; + + @override + String get libraryClearConfirmTitle => '라이브러리 정리'; + + @override + String get libraryClearConfirmMessage => + '이렇게 하면 라이브러리에서 스캔된 모든 트랙이 제거됩니다. 실제 음악 파일은 삭제되지 않습니다'; + + @override + String get libraryAbout => '로컬 라이브러리에 대한 정보'; + + @override + String get libraryAboutDescription => + '기존 음악 라이브러리를 검사하여 다운로드 시 중복 곡을 감지합니다. FLAC, ALAC, M4A, MP3, Opus, OGG, WAV, AIFF 및 APE 형식을 지원합니다. 가능한 경우 파일 태그의 메타데이터를 읽어 사용합니다'; + + @override + String libraryTracksUnit(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '$_temp0'; + } + + @override + String libraryFilesUnit(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '파일', + one: '파일', + ); + return '$_temp0'; + } + + @override + String libraryLastScanned(String time) { + return '마지막 스캔 시간: $time'; + } + + @override + String get libraryLastScannedNever => '스캔한 적 없음'; + + @override + String get libraryScanning => '스캔하는 중...'; + + @override + String get libraryScanFinalizing => '라이브러리를 마무리하는 중...'; + + @override + String libraryScanProgress(String progress, int total) { + return '$total 개의 파일 중 $progress%'; + } + + @override + String get libraryInLibrary => 'in 라이브러리'; + + @override + String libraryRemovedMissingFiles(int count) { + return '라이브러리에서 $count 개의 누락된 파일이 삭제됨'; + } + + @override + String get libraryCleared => '라이브러리가 초기화됨'; + + @override + String get libraryStorageAccessRequired => '저장소 접근 권한 필요'; + + @override + String get libraryStorageAccessMessage => + 'SpotifyFLAC은 음악 라이브러리를 스캔하기 위해 저장소 접근 권한이 필요합니다. 설정에서 권한을 부여해 주세요'; + + @override + String get libraryFolderNotExist => '선택한 폴더가 존재하지 않음'; + + @override + String get librarySourceDownloaded => '다운로드됨'; + + @override + String get librarySourceLocal => '로컬'; + + @override + String get libraryFilterAll => '모두'; + + @override + String get libraryFilterDownloaded => '다운로드됨'; + + @override + String get libraryFilterLocal => '로컬'; + + @override + String get libraryFilterTitle => '필터'; + + @override + String get libraryFilterReset => '초기화'; + + @override + String get libraryFilterApply => '적용'; + + @override + String get libraryFilterSource => '출처'; + + @override + String get libraryFilterQuality => '음질'; + + @override + String get libraryFilterQualityHiRes => 'Hi-Res (24bit)'; + + @override + String get libraryFilterQualityCD => 'CD (16bit)'; + + @override + String get libraryFilterQualityLossy => '손실 압축'; + + @override + String get libraryFilterFormat => '형식'; + + @override + String get libraryFilterMetadata => '메타데이터'; + + @override + String get libraryFilterMetadataComplete => '전체 메타데이터'; + + @override + String get libraryFilterMetadataMissingAny => '메타데이터 누락'; + + @override + String get libraryFilterMetadataMissingYear => '연도 누락'; + + @override + String get libraryFilterMetadataMissingGenre => '장르 누락'; + + @override + String get libraryFilterMetadataMissingAlbumArtist => '앨범 아티스트 누락'; + + @override + String get libraryFilterSort => '정렬'; + + @override + String get libraryFilterSortLatest => '최신순'; + + @override + String get libraryFilterSortOldest => '오래된순'; + + @override + String get libraryFilterSortAlbumAsc => '앨범 (오름차순)'; + + @override + String get libraryFilterSortAlbumDesc => '앨범 (내림차순)'; + + @override + String get libraryFilterSortGenreAsc => '장르 (오름차순)'; + + @override + String get libraryFilterSortGenreDesc => '장르 (내림차순)'; + + @override + String get timeJustNow => '방금 전'; + + @override + String timeMinutesAgo(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 분 전', + one: '1 분 전', + ); + return '$_temp0'; + } + + @override + String timeHoursAgo(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 시간 전', + one: '1 시간 전', + ); + return '$_temp0'; + } + + @override + String get tutorialWelcomeTitle => 'SpotiFLAC에 오신 것을 환영합니다!'; + + @override + String get tutorialWelcomeDesc => + '좋아하는 음악을 무손실 음질로 다운로드하는 방법을 알아보겠습니다. 이 간단한 튜토리얼은 기본 사항을 보여줍니다'; + + @override + String get tutorialWelcomeTip1 => + 'Spotify, Deezer 또는 지원되는 URL에서 음악을 다운로드할 수 있습니다'; + + @override + String get tutorialWelcomeTip2 => + '설치된 다운로드 확장 프로그램으로 FLAC 고음질 오디오를 다운로드할 수 있습니다'; + + @override + String get tutorialWelcomeTip3 => '메타데이터, 표지 이미지 및 가사를 자동으로 추가할 수 있습니다'; + + @override + String get tutorialSearchTitle => '음악 찾기'; + + @override + String get tutorialSearchDesc => '다운로드하고 싶은 음악을 찾는 두 가지 쉬운 방법이 있습니다'; + + @override + String get tutorialDownloadTitle => '음악 다운로드'; + + @override + String get tutorialDownloadDesc => '음악 다운로드는 간단하고 빠릅니다\\n작동 방식은 다음과 같습니다'; + + @override + String get tutorialLibraryTitle => '내 라이브러리'; + + @override + String get tutorialLibraryDesc => '다운로드된 모든 음악은 라이브러리 탭에 정리되어 있습니다'; + + @override + String get tutorialLibraryTip1 => '라이브러리 탭에서 다운로드 진행 상황과 다운로드 목록을 확인할 수 있습니다'; + + @override + String get tutorialLibraryTip2 => '아무 트랙을 탭하여 음악 플레이어로 재생할 수 있습니다'; + + @override + String get tutorialLibraryTip3 => '리스트 보기 또는 그리드 보기로 전환하여 더 나은 탐색을 할 수 있습니다'; + + @override + String get tutorialExtensionsTitle => '확장 프로그램'; + + @override + String get tutorialExtensionsDesc => '커뮤니티 확장 프로그램을 사용하여 앱의 기능을 확장하세요'; + + @override + String get tutorialExtensionsTip1 => '레포 탭을 탐색하여 유용한 확장 프로그램을 찾을 수 있습니다'; + + @override + String get tutorialExtensionsTip2 => '새 다운로드 제공자 또는 검색 출처를 추가할 수 있습니다'; + + @override + String get tutorialExtensionsTip3 => '가사, 향상된 메타데이터 및 더 많은 기능을 사용할 수 있습니다'; + + @override + String get tutorialSettingsTitle => '사용자 환경 맞춤 설정'; + + @override + String get tutorialSettingsDesc => '설정에서 앱을 원하는 대로 맞춤 설정하세요'; + + @override + String get tutorialSettingsTip1 => '다운로드 위치 및 폴더 구성 변경'; + + @override + String get tutorialSettingsTip2 => '기본 오디오 음질 및 형식 설정'; + + @override + String get tutorialSettingsTip3 => '앱 테마 및 디자인 사용자 정의'; + + @override + String get tutorialReadyMessage => '모든 준비가 완료되었습니다! 지금 바로 좋아하는 음악을 다운로드하세요'; + + @override + String get libraryForceFullScan => '전제 스캔 강제 실행'; + + @override + String get libraryForceFullScanSubtitle => '캐시를 무시하고 모든 파일을 다시 스캔합니다'; + + @override + String get cleanupOrphanedDownloads => '불필요한 다운로드 파일 정리'; + + @override + String get cleanupOrphanedDownloadsSubtitle => + '더 이상 존재하지 않는 파일의 기록 항목을 제거합니다'; + + @override + String cleanupOrphanedDownloadsResult(int count) { + return '기록에서 $count 개의 불필요한 항목이 제거됨'; + } + + @override + String get cleanupOrphanedDownloadsNone => '불필요한 항목이 없습니다'; + + @override + String get cacheTitle => '저장소 & 캐시'; + + @override + String get cacheSummaryTitle => '캐시 요약'; + + @override + String get cacheSummarySubtitle => '캐시를 지워도 다운로드된 음악 파일은 삭제되지 않습니다'; + + @override + String cacheEstimatedTotal(String size) { + return '예상 캐시 사용량: $size'; + } + + @override + String get cacheSectionStorage => '캐시된 데이터'; + + @override + String get cacheSectionMaintenance => '유지 관리'; + + @override + String get cacheAppDirectory => '앱 캐시 디렉토리'; + + @override + String get cacheAppDirectoryDesc => 'HTTP 응답, WebView 데이터 및 기타 임시 앱 데이터입니다'; + + @override + String get cacheTempDirectory => '임시 디렉토리'; + + @override + String get cacheTempDirectoryDesc => '다운로드 및 오디오 변환으로 만들어진 임시 파일'; + + @override + String get cacheCoverImage => '표지 이미지 캐시'; + + @override + String get cacheCoverImageDesc => '다운로드된 앨범 및 트랙 표지 이미지입니다. 볼 때 다시 다운로드됩니다'; + + @override + String get cacheLibraryCover => '라이브러리 표지 캐시'; + + @override + String get cacheLibraryCoverDesc => + '로컬 음악 파일에서 추출된 표지 이미지입니다. 다음 스캔 시 다시 추출됩니다'; + + @override + String get libraryPlaybackNormalization => '볼륨 정규화'; + + @override + String get libraryPlaybackNormalizationSubtitle => + '트랙에 ReplayGain 또는 R128 태그가 있는 경우에 이를 사용하여 트랙 간 음량을 일정하게 맞춥니다'; + + @override + String get cacheAudioAnalysis => '오디오 분석 캐시'; + + @override + String get cacheAudioAnalysisDesc => + '저장된 스펙트로그램과 분석 결과입니다. 다음에 실행할 경우에 다시 분석합니다'; + + @override + String get cacheExploreFeed => '탐색 피드 캐시'; + + @override + String get cacheExploreFeedDesc => + '탐색 탭 콘텐츠(최신 발매 음악, 인기 콘텐츠)는 다음 방문 시 새로 고쳐집니다'; + + @override + String get cacheTrackLookup => '트랙 조회 캐시'; + + @override + String get cacheTrackLookupDesc => + '조회된 Spotify/Deezer 트랙 ID입니다. 지우면 속도가 느려질 수 있습니다'; + + @override + String get cacheCleanupUnusedDesc => + '누락된 파일에 대한 불필요한 다운로드 기록 및 라이브러리 항목을 제거합니다'; + + @override + String get cacheNoData => '캐시된 데이터가 없음'; + + @override + String cacheSizeWithFiles(String size, int count) { + return '$count 개의 파일에 $size 사용'; + } + + @override + String cacheSizeOnly(String size) { + return '$size'; + } + + @override + String cacheEntries(int count) { + return '$count 개의 항목'; + } + + @override + String cacheClearSuccess(String target) { + return '지워짐: $target'; + } + + @override + String get cacheClearConfirmTitle => '캐시를 지우시겠습니까?'; + + @override + String cacheClearConfirmMessage(String target) { + return '\'\'$target\'\'의 캐시된 데이터를 지웁니다. 다운로드된 음악 파일은 삭제되지 않습니다'; + } + + @override + String get cacheClearAllConfirmTitle => '모든 캐시를 지우시겠습니까?'; + + @override + String get cacheClearAllConfirmMessage => + '이 페이지의 모든 캐시 카테고리가 지워집니다. 다운로드된 음악 파일은 삭제되지 않습니다'; + + @override + String get cacheClearAll => '모든 캐시 지우기'; + + @override + String get cacheCleanupUnused => '사용되지 않는 데이터 정리'; + + @override + String get cacheCleanupUnusedSubtitle => '불필요한 다운로드 기록 및 누락된 라이브러리 항목을 제거합니다'; + + @override + String cacheCleanupResult(int downloadCount, int libraryCount) { + return '정리 완료: $downloadCount 개의 사용되지 않는 다운로드, $libraryCount 개의 누락된 라이브러리 항목'; + } + + @override + String get cacheRefreshStats => '통계 새로고침'; + + @override + String get trackSaveCoverArt => '표지 이미지 저장'; + + @override + String get trackSaveLyrics => '가사 (.lrc) 저장'; + + @override + String get trackSaveLyricsProgress => '가사를 저장하는 중...'; + + @override + String get trackReEnrich => '보강'; + + @override + String get trackReEnrichOnlineSubtitle => '온라인에서 메타데이터를 검색하고 파일에 삽입'; + + @override + String get trackReEnrichFieldCover => '표지 이미지'; + + @override + String get trackReEnrichFieldLyrics => '가사'; + + @override + String get trackReEnrichFieldBasicTags => '앨범, 앨범 아티스트'; + + @override + String get trackReEnrichFieldTrackInfo => '트랙 & 디스크 번호'; + + @override + String get trackReEnrichFieldReleaseInfo => '데이터 & ISRC'; + + @override + String get trackReEnrichFieldExtra => '장르, 레이블, 저작권'; + + @override + String get trackReEnrichSelectAll => '모두 선택'; + + @override + String get trackEditMetadata => '메타데이터 편집'; + + @override + String trackCoverSaved(String fileName) { + return '표지 이미지가 \'\'$fileName\'\'에 저장됨'; + } + + @override + String get trackCoverNoSource => '사용할 수 있는 표지 출처가 없음'; + + @override + String trackLyricsSaved(String fileName) { + return '가사가 \'\'$fileName\'\'에 저장됨'; + } + + @override + String get trackReEnrichProgress => '메타데이터를 다시 구성하는 중...'; + + @override + String get trackReEnrichSearching => '온라인에서 메타데이터를 검색하는 중...'; + + @override + String get trackReEnrichSuccess => '메타데이터 재구성 성공'; + + @override + String get trackReEnrichFfmpegFailed => 'FFmpeg 메타데이터 삽입 실패'; + + @override + String get queueFlacAction => 'FLAC 다운로드 목록'; + + @override + String queueFlacConfirmMessage(int count) { + return '선택한 트랙에 대한 온라인 일치 항목을 검색하고 FLAC을 다운로드 목록에 추가합니다\n\n기존 파일은 수정되거나 삭제되지 않습니다\n\n신뢰도가 높은 일치 항목만 자동으로 대기열에 추가됩니다\n\n$count 개가 선택되었습니다'; + } + + @override + String get queueFlacNoReliableMatches => + '선택한 항목에 대한 신뢰할 수 있는 온라인 일치 항목을 찾을 수 없음'; + + @override + String queueFlacQueuedWithSkipped(int addedCount, int skippedCount) { + return '다운로드 목록에 $addedCount 개의 트랙을 추가하고, $skippedCount 개의 트랙을 건너뜀'; + } + + @override + String trackSaveFailed(String error) { + return '실패: $error'; + } + + @override + String get trackConvertFormat => '형식 변환'; + + @override + String get trackConvertTitle => '오디오 변환'; + + @override + String get trackConvertTargetFormat => '변경될 형식'; + + @override + String get trackConvertBitrate => '비트레이트'; + + @override + String get trackConvertKeepOriginal => '원본 파일 유지'; + + @override + String get trackConvertKeepOriginalDescription => + '변환된 파일을 별도의 라이브러리 항목으로 추가합니다'; + + @override + String get trackConvertConfirmTitle => '변환 확인'; + + @override + String trackConvertConfirmMessage( + String sourceFormat, + String targetFormat, + String bitrate, + ) { + return '$bitrate 비트레이트로 $sourceFormat에서 $targetFormat으로 변환하시겠습니까?\n\n변환 후 원본 파일이 삭제됩니다'; + } + + @override + String trackConvertConfirmMessageLossless( + String sourceFormat, + String targetFormat, + ) { + return '$sourceFormat에서 $targetFormat으로 변환하시겠습니까? (무손실 — 음질 손실 없음)\n\n변환 후에 원본 파일이 삭제됩니다'; + } + + @override + String trackConvertConfirmKeepOriginal( + String sourceFormat, + String targetFormat, + ) { + return '$sourceFormat에서 $targetFormat으로 변환하시겠습니까?\n\n원본 파일은 유지되고 변환된 파일은 별도의 라이브러리 항목으로 추가됩니다'; + } + + @override + String get trackConvertLosslessHint => '무손실 변환 — 음질 손실 없음'; + + @override + String get trackConvertConverting => '오디오를 변환하는 중...'; + + @override + String trackConvertSuccess(String format) { + return '$format으로 변환 성공'; + } + + @override + String get trackConvertFailed => '변환 실패'; + + @override + String get cueSplitTitle => 'CUE 시트 분할'; + + @override + String cueSplitAlbum(String album) { + return '앨범: $album'; + } + + @override + String cueSplitArtist(String artist) { + return '아티스트: $artist'; + } + + @override + String cueSplitTrackCount(int count) { + return '$count 개의 트랙'; + } + + @override + String get cueSplitConfirmTitle => 'CUE 앨범 분할'; + + @override + String cueSplitConfirmMessage(String album, int count) { + return '\'\'$album\'\'을 $count 개의 개별 FLAC 파일로 분할하시겠습니까?\n\n파일은 동일한 디렉토리에 저장됩니다'; + } + + @override + String cueSplitSplitting(int current, int total) { + return 'CUE 시트를 분할하는 중... ($current/$total)'; + } + + @override + String cueSplitSuccess(int count) { + return '$count 개의 트랙 분할 성공'; + } + + @override + String get cueSplitFailed => 'CUE 분할 실패'; + + @override + String get cueSplitNoAudioFile => '이 CUE 시트에 대한 오디오 파일을 찾을 수 없습니다'; + + @override + String get cueSplitButton => '트랙으로 분할'; + + @override + String get actionCreate => '만들기'; + + @override + String get collectionFoldersTitle => '내 폴더'; + + @override + String get collectionWishlist => '위시리스트'; + + @override + String get collectionLoved => '좋아요 표시한 음악'; + + @override + String get collectionFavoriteArtists => '좋아하는 아티스트'; + + @override + String get collectionPlaylist => '재생목록'; + + @override + String get collectionAddToPlaylist => '재생목록에 추가'; + + @override + String get collectionCreatePlaylist => '재생목록 만들기'; + + @override + String get collectionNoPlaylistsYet => '아직 재생목록이 없음'; + + @override + String collectionPlaylistTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 개의 트랙', + one: '1 개의 트랙', + ); + return '$_temp0'; + } + + @override + String collectionArtistCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 명의 아티스트', + one: '1 명의 아티스트', + ); + return '$_temp0'; + } + + @override + String collectionAddedToPlaylist(String playlistName) { + return '\'\'$playlistName\'\'에 추가됨'; + } + + @override + String collectionAlreadyInPlaylist(String playlistName) { + return '이미 \'\'$playlistName\'\'에 있음'; + } + + @override + String get collectionPlaylistNameHint => '재생목록 이름'; + + @override + String get collectionPlaylistNameRequired => '재생목록 이름은 필수입니다'; + + @override + String get collectionRenamePlaylist => '재생목록 이름 변경'; + + @override + String get collectionDeletePlaylist => '재생목록 삭제'; + + @override + String get collectionPlaylistRenamed => '재생목록 이름 변경 완료'; + + @override + String get collectionWishlistEmptyTitle => '위시리스트가 비어 있음'; + + @override + String get collectionWishlistEmptySubtitle => + '나중에 다운로드할 트랙을 저장하려면 트랙에서 +를 탭하세요'; + + @override + String get collectionLovedEmptyTitle => '\'좋아요 표시한 음악\' 폴더가 비어 있음'; + + @override + String get collectionLovedEmptySubtitle => '트랙에 하트를 탭하여 \'좋아요\'를 유지하세요'; + + @override + String get collectionFavoriteArtistsEmptyTitle => '아직 좋아하는 아티스트가 없음'; + + @override + String get collectionFavoriteArtistsEmptySubtitle => + '아티스트 페이지에서 하트를 탭하여 여기에 추가하세요'; + + @override + String get collectionPlaylistEmptyTitle => '재생목록이 비어 있음'; + + @override + String get collectionPlaylistEmptySubtitle => '아무 트랙에서 +를 길게 탭하여 여기에 추가하세요'; + + @override + String get collectionRemoveFromPlaylist => '재생목록에서 제거'; + + @override + String get collectionRemoveFromFolder => '폴더에서 제거'; + + @override + String collectionAddedToLoved(String trackName) { + return '\'\'$trackName\'\'이 \'좋아요 표시한 음악\'에 추가됨'; + } + + @override + String collectionRemovedFromLoved(String trackName) { + return '\'\'$trackName\'\'이 \'좋아요 표시한 음악\'에서 제거됨'; + } + + @override + String collectionAddedToWishlist(String trackName) { + return '\'\'$trackName\'\'가 위시리스트에 추가됨'; + } + + @override + String collectionRemovedFromWishlist(String trackName) { + return '\'\'$trackName\'\'가 위시리스트에서 제거됨'; + } + + @override + String collectionAddedToFavoriteArtists(String artistName) { + return '\'\'$artistName\'\'가 좋아하는 아티스트에 추가됨'; + } + + @override + String collectionRemovedFromFavoriteArtists(String artistName) { + return '\'\'$artistName\'\'가 좋아하는 아티스트에서 제거됨'; + } + + @override + String get trackOptionAddToLoved => '좋아요 표시한 음악에 추가'; + + @override + String get trackOptionRemoveFromLoved => '좋아요 표시한 음악에서 제거'; + + @override + String get trackOptionAddToWishlist => '위시리스트에 추가'; + + @override + String get trackOptionRemoveFromWishlist => '위시리스트에서 제거'; + + @override + String get artistOptionAddToFavorites => '즐겨찾는 아티스트에 추가'; + + @override + String get artistOptionRemoveFromFavorites => '즐겨찾는 아티스트에서 제거'; + + @override + String get collectionPlaylistChangeCover => '표지 이미지 변경'; + + @override + String get collectionPlaylistRemoveCover => '표지 이미지 제거'; + + @override + String selectionShareCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '$count $_temp0 공유'; + } + + @override + String get selectionShareNoFiles => '공유할 수 있는 파일을 찾을 수 없음'; + + @override + String selectionConvertCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '$count $_temp0 변환'; + } + + @override + String get selectionConvertNoConvertible => '선택된 변환할 수 있는 트랙이 없음'; + + @override + String get selectionBatchConvertConfirmTitle => '일괄 변환'; + + @override + String selectionBatchConvertConfirmMessage( + int count, + String format, + String bitrate, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '$count 개의 $_temp0을 $bitrate 비트레이트로 $format으로 변환하시겠습니까?\n\n변환 후 원본 파일이 삭제됩니다'; + } + + @override + String selectionBatchConvertConfirmMessageLossless(int count, String format) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '$count 개의 $_temp0을 $format으로 변환하시겠습니까? (무손실 — 음질 손실 없음)\n\n변환 후 원본 파일이 삭제됩니다'; + } + + @override + String selectionBatchConvertConfirmKeepOriginal(int count, String format) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '$count 개의 $_temp0을 $format으로 변환하시겠습니까?\n\n원본 파일은 유지되고 변환된 파일은 별도의 라이브러리 항목으로 추가됩니다'; + } + + @override + String selectionBatchConvertSuccess(int success, int total, String format) { + return '$total 개 중 $success 개를 $format로 변환 완료'; + } + + @override + String downloadedAlbumDownloadedCount(int count) { + return '$count 개 다운로드됨'; + } + + @override + String get downloadUseAlbumArtistForFoldersAlbumSubtitle => + '앨범 아티스트 태그로 이름이 지정된 폴더'; + + @override + String get downloadUseAlbumArtistForFoldersTrackSubtitle => + '트랙 아티스트 태그로 이름이 지정된 폴더'; + + @override + String get lyricsProvidersTitle => '가사 제공자 우선순위'; + + @override + String get lyricsProvidersDescription => + '가사 출처를 활성화, 비활성화 및 재정렬할 수 있습니다. 가사가 발견될 때까지 위에서 아래로 제공자를 시도합니다'; + + @override + String get lyricsProvidersInfoText => + '확장 프로그램 가사 제공자는 내부 가사 제공자보다 먼저 실행됩니다. 하나 이상의 제공자가 활성화되어 있어야 합니다'; + + @override + String lyricsProvidersEnabledSection(int count) { + return '활성화됨 ($count)'; + } + + @override + String lyricsProvidersDisabledSection(int count) { + return '비활성화됨 ($count)'; + } + + @override + String get lyricsProvidersAtLeastOne => '최소 한 명의 제공자가 활성화된 상태로 유지되어야 합니다'; + + @override + String get lyricsProvidersSaved => '가사 제공자 우선순위가 저장됨'; + + @override + String get lyricsProvidersDiscardContent => '저장되지 않은 변경 사항이 손실됩니다'; + + @override + String get lyricsProviderLrclibDesc => '오픈 소스 동기화 가사 데이터베이스'; + + @override + String get lyricsProviderNeteaseDesc => 'NetEase Cloud Music (아시아 노래에 적합)'; + + @override + String get lyricsProviderMusixmatchDesc => '최대 규모의 가사 데이터베이스 (다국어 지원)'; + + @override + String get lyricsProviderAppleMusicDesc => '단어별 동기화 가사 (프록시 경유)'; + + @override + String get lyricsProviderQqMusicDesc => 'QQ Music (중국 노래에 적합, 프록시 경유)'; + + @override + String get lyricsProviderLyricsPlusDesc => + '단어별 노래방 가사 (Apple/Musixmatch/Spotify/QQ, 프록시 이용)'; + + @override + String get lyricsProviderExtensionDesc => '확장 프로그램 제공자'; + + @override + String get safMigrationTitle => '저장소 업데이트 필요'; + + @override + String get safMigrationMessage1 => + 'SpotiFLAC은 이제 다운로드에 Android 저장소 접근 프레임워크(SAF)를 사용합니다. 이로써 Android 10 이상에서 \'권한 거부\' 오류가 해결됩니다'; + + @override + String get safMigrationMessage2 => '새 저장소 시스템으로 전환하려면 다운로드 폴더를 다시 선택하세요'; + + @override + String get safMigrationSuccess => '다운로드 폴더가 SAF 모드로 업데이트됨'; + + @override + String get settingsDonate => '개발 후원'; + + @override + String get settingsDonateSubtitle => '개발자에게 커피 한 잔 사주세요'; + + @override + String get settingsBackup => '백업 & 복원'; + + @override + String get settingsBackupSubtitle => '라이브러리, 기록 및 설정을 새 기기로 옮겨보세요'; + + @override + String get backupTitle => '백업 & 복원'; + + @override + String get backupExportSectionTitle => '백업 생성'; + + @override + String get backupExportSectionDescription => + '설정, 다운로드 기록, 좋아요 표시한 음악, 위시리스트, 즐겨찾는 아티스트 및 재생목록을 하나의 파일로 저장하여 보관하거나 다른 휴대전화로 옮길 수 있습니다'; + + @override + String get backupExportButton => '백업 파일 생성'; + + @override + String get backupImportSectionTitle => '백업 복원'; + + @override + String get backupImportSectionDescription => + '데이터를 복원할 백업 파일을 선택하세요. 이 작업을 수행하면 현재 기기에 저장된 설정, 기록 및 라이브러리가 백업 파일의 내용으로 대체됩니다'; + + @override + String get backupImportButton => '백업 파일 선택'; + + @override + String get backupCreated => '백업 생성 완료'; + + @override + String get backupCreateFailed => '백업 생성 실패'; + + @override + String get backupRestoreConfirmTitle => '이 백업을 복원하시겠습니까?'; + + @override + String get backupRestoreConfirmMessage => + '현재 설정, 다운로드 기록, 좋아요 표시한 음악, 위시리스트 및 재생목록이 백업 파일의 내용으로 대체됩니다. 이 작업은 되돌릴 수 없습니다'; + + @override + String get backupRestoreConfirmButton => '복원'; + + @override + String get backupRestored => '백업 복원 성공'; + + @override + String get backupRestoreFailed => '백업 복원 실패'; + + @override + String get backupInvalidFile => '이 파일은 유효한 SpotiFLAC 백업이 아닙니다'; + + @override + String get backupRestoreRestartHint => '모든 변경 사항을 적용하려면 앱을 다시 시작하세요'; + + @override + String get backupContentsTitle => '백업 콘텐츠'; + + @override + String get backupContentsSettings => '앱 설정'; + + @override + String backupContentsHistory(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목', + one: '항목', + ); + return '$count 개의 기록 $_temp0'; + } + + @override + String backupContentsLiked(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '음악', + one: '음악', + ); + return '$count 개의 좋아요 표시한 $_temp0'; + } + + @override + String backupContentsWishlist(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '$count 개의 위시리스트 $_temp0'; + } + + @override + String backupContentsPlaylists(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 개의 재생목록', + one: '1 개의 재생목록', + ); + return '$_temp0'; + } + + @override + String backupContentsArtists(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 명의 좋아하는 아티스트', + one: '1 명의 좋아하는 아티스트', + ); + return '$_temp0'; + } + + @override + String backupContentsExtensions(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 개의 확장 프로그램', + one: '1 개의 확장 프로그램', + ); + return '$_temp0'; + } + + @override + String get backupIncludeSecrets => '확장 프로그램 자격 증명 포함'; + + @override + String get backupIncludeSecretsDescription => + '확장 프로그램의 토큰과 API 키가 백업 파일에 함께 저장됩니다. 백업 파일은 안전하게 보관하세요. 비활성화하면 복원 후 다시 입력해야 합니다'; + + @override + String backupExtensionsRestoreFailed(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '확장 프로그램', + one: '확장 프로그램', + ); + return '$count 개의 $_temp0을 다시 설치할 수 없습니다. 레포에서 수동으로 설치하세요'; + } + + @override + String get tooltipLoveAll => '모두 좋아요 표시'; + + @override + String get tooltipAddToPlaylist => '재생목록에 추가'; + + @override + String snackbarRemovedTracksFromLoved(int count) { + return '\'좋아요 표시한 음악\'에서 $count 개의 트랙이 제거됨'; + } + + @override + String snackbarAddedTracksToLoved(int count) { + return '\'좋아요 표시한 음악\'에 $count 개의 트랙이 추가됨'; + } + + @override + String get dialogDownloadAllTitle => '모두 다운로드'; + + @override + String dialogDownloadAllMessage(int count) { + return '$count 개의 트랙을 다운로드하시겠습니까?'; + } + + @override + String get homeSkipAlreadyDownloaded => '이미 다운로드된 노래 건너뛰기'; + + @override + String get homeGoToAlbum => '앨범으로 이동'; + + @override + String get homeAlbumInfoUnavailable => '앨범 정보를 사용할 수 없음'; + + @override + String get snackbarLoadingCueSheet => 'CUE 시트를 불러오는 중...'; + + @override + String get snackbarMetadataSaved => '메타데이터 저장 성공'; + + @override + String get snackbarFailedToEmbedLyrics => '가사 삽입 실패'; + + @override + String get snackbarFailedToWriteStorage => '저장소 다시 쓰기 실패'; + + @override + String snackbarError(String error) { + return '오류: $error'; + } + + @override + String get snackbarNoActionDefined => '이 버튼에 대해 정의된 작업이 없음'; + + @override + String get noTracksFoundForAlbum => '이 앨범에서 트랙을 찾을 수 없음'; + + @override + String get downloadLocationSubtitle => '다운로드된 트랙을 저장할 위치를 선택하세요'; + + @override + String get storageModeAppFolder => '앱 폴더 (추천)'; + + @override + String get storageModeAppFolderSubtitle => '기본적으로 Music/SpotiFLAC에 저장'; + + @override + String get storageModeSaf => '사용자 정의 폴더 (SAF)'; + + @override + String get storageModeSafSubtitle => 'SD 카드를 포함한 아무 폴더나 선택하세요'; + + @override + String get downloadFolderAccessLostTitle => '다운로드 폴더 접근 손실'; + + @override + String get downloadFolderAccessLostSubtitle => '폴더를 다시 선택할 때까지 다운로드할 수 없습니다'; + + @override + String get downloadFolderReselect => '폴더 다시 선택'; + + @override + String get downloadErrorSafPermissionLost => + 'SAF 권한이 잘못되었거나 취소되었습니다. 설정에서 다운로드 위치를 다시 설정하세요'; + + @override + String get downloadErrorFolderAccessLost => + '다운로드 폴더 접근 권한이 없습니다. 설정에서 다운로드 폴더를 다시 설정하세요'; + + @override + String downloadFilenameDescription( + Object album, + Object artist, + Object date, + Object disc, + Object title, + Object track, + Object year, + ) { + return '\'\'$artist\'\', \'\'$title\'\', \'\'$album\'\', \'\'$track\'\', \'\'$year\'\', \'\'$date\'\', \'\'$disc\'\'를 자리표시자로 사용하세요'; + } + + @override + String get downloadFilenameInsertTag => '태그를 삽입하려면 탭하세요:'; + + @override + String get downloadSeparateSinglesEnabled => '싱글과 EP를 별도의 폴더에 저장합니다'; + + @override + String get downloadSeparateSinglesDisabled => '싱글과 앨범을 같은 폴더에 저장합니다'; + + @override + String get downloadArtistNameFilters => '아티스트 이름 필터'; + + @override + String get downloadCreatePlaylistSourceFolder => '재생목록 소스 폴더'; + + @override + String get downloadCreatePlaylistSourceFolderEnabled => + '각 재생 목록에 대한 하위 폴더를 만듭니다'; + + @override + String get downloadCreatePlaylistSourceFolderDisabled => + '모든 트랙을 다운로드 폴더에 직접 저장합니다'; + + @override + String get downloadCreatePlaylistSourceFolderRedundant => '폴더 구성 설정에 의해 처리됨'; + + @override + String get downloadSongLinkRegion => 'SongLink 지역'; + + @override + String get downloadNetworkCompatibilityMode => '네트워크 호환 모드'; + + @override + String get downloadNetworkCompatibilityModeEnabled => + '이전 네트워크에 대한 레거시 TLS 설정 사용'; + + @override + String get downloadNetworkCompatibilityModeDisabled => '표준 ​​네트워크 설정 사용'; + + @override + String get downloadAllowLocalNetwork => '로컬 네트워크 접근 허용'; + + @override + String get downloadAllowLocalNetworkEnabled => + '로컬/사설 주소에 대한 요청이 허용됨 (로컬 프록시 또는 사용자 지정 DNS용)'; + + @override + String get downloadAllowLocalNetworkDisabled => '보안을 위해 로컬/사설 주소가 차단됨'; + + @override + String get downloadSelectServiceToEnable => + '이 옵션을 활성화하려면 음질 옵션이 있는 공급자를 선택하세요'; + + @override + String get downloadEmbedLyricsDisabled => '먼저 메타데이터 삽입을 활성화하세요'; + + @override + String get downloadNeteaseIncludeTranslation => 'Netease: 번역 포함'; + + @override + String get downloadNeteaseIncludeTranslationEnabled => '중국어 번역 포함'; + + @override + String get downloadNeteaseIncludeTranslationDisabled => '원본 가사만'; + + @override + String get downloadNeteaseIncludeRomanization => 'Netease: 로마자 표기 포함'; + + @override + String get downloadNeteaseIncludeRomanizationEnabled => '로마자 표기 포함'; + + @override + String get downloadNeteaseIncludeRomanizationDisabled => '로마자 표기 없음'; + + @override + String get downloadAppleQqMultiPerson => 'Apple / QQ: 다인용 가사'; + + @override + String get downloadAppleQqMultiPersonEnabled => '듀엣 및 그룹 트랙이 포함된 스피커 레이블'; + + @override + String get downloadAppleQqMultiPersonDisabled => '스피커 레이블이 없는 표준 가사'; + + @override + String get downloadAppleElrcWordSync => 'Apple Music eLRC 단어 동기화'; + + @override + String get downloadAppleElrcWordSyncEnabled => '단어별 타임스탬프 원본 유지'; + + @override + String get downloadAppleElrcWordSyncDisabled => '더 안전한 Apple Music 가사 (줄 단위)'; + + @override + String get downloadMusixmatchLanguage => 'Musixmatch 언어'; + + @override + String get downloadMusixmatchLanguageAuto => '자동 (원본 언어)'; + + @override + String get downloadFilterContributing => '참여 아티스트 필터'; + + @override + String get downloadFilterContributingEnabled => '앨범 아티스트 폴더 이름에서 제거된 참여 아티스트'; + + @override + String get downloadFilterContributingDisabled => '전체 앨범 아티스트 문자열 사용'; + + @override + String get downloadProvidersNoneEnabled => '활성화된 제공자가 없음'; + + @override + String get downloadMusixmatchLanguageCode => '언어 코드'; + + @override + String get downloadMusixmatchLanguageHint => '예시: en, de, ja'; + + @override + String get downloadMusixmatchLanguageDesc => + 'Musixmatch에서 번역된 가사를 요청하려면 BCP-47 언어 코드를 입력하세요 (예시: ko, en, ja)'; + + @override + String get downloadMusixmatchAuto => '자동'; + + @override + String get downloadNetworkAnySubtitle => 'Wi-Fi 또는 모바일 네트워크 사용'; + + @override + String get downloadNetworkWifiOnlySubtitle => '모바일 네트워크 사용 시 다운로드 일시 중지'; + + @override + String get downloadSongLinkRegionDesc => + 'SongLink를 통해 트랙 링크를 해결할 경우에 사용되는 지역입니다. 스트리밍 서비스를 이용할 수 있는 국가를 선택하세요'; + + @override + String get snackbarUnsupportedAudioFormat => '지원되지 않는 오디오 형식'; + + @override + String get cacheRefresh => '새로고침'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: '재생록록', + one: '재생목록', + ); + String _temp1 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '$playlistCount 개의 $_temp0에서 $trackCount 개의 $_temp1을 다운로드하시겠습니까?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '재생목록', + one: '재생목록', + ); + return '$count 개의 $_temp0 다운로드'; + } + + @override + String get bulkDownloadSelectPlaylists => '다운로드할 재생목록 선택'; + + @override + String get snackbarSelectedPlaylistsEmpty => '선택한 재생목록에 트랙이 없습니다'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 개의 재생목록', + one: '1 개의 재생목록', + ); + return '$_temp0'; + } + + @override + String get editMetadataAutoFill => '온라인에서 자동 채우기'; + + @override + String get editMetadataAutoFillDesc => '온라인 메타데이터에서 자동으로 채워질 필드를 선택하세요'; + + @override + String get editMetadataAutoFillFetch => '가져오기 & 채우기'; + + @override + String get editMetadataAutoFillSearching => '온라인에서 검색하는 중...'; + + @override + String get editMetadataAutoFillNoResults => '온라인에서 일치하는 메타데이터를 찾을 수 없음'; + + @override + String editMetadataAutoFillDone(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '필드', + one: '필드', + ); + return '온라인 메타데이터로부터 $count 개의 $_temp0가 채워짐'; + } + + @override + String get editMetadataAutoFillNoneSelected => '자동 채우기를 위해 하나 이상의 필드를 선택하세요'; + + @override + String get editMetadataFieldTitle => '제목'; + + @override + String get editMetadataFieldArtist => '아티스트'; + + @override + String get editMetadataFieldAlbum => '앨범'; + + @override + String get editMetadataFieldAlbumArtist => '앨범 아티스트'; + + @override + String get editMetadataFieldDate => '날짜'; + + @override + String get editMetadataFieldTrackNum => '트랙 #'; + + @override + String get editMetadataFieldDiscNum => '디스크 #'; + + @override + String get editMetadataFieldGenre => '장르'; + + @override + String get editMetadataFieldIsrc => 'ISRC'; + + @override + String get editMetadataFieldLabel => '레이블'; + + @override + String get editMetadataFieldCopyright => '저작권'; + + @override + String get editMetadataFieldCover => '표지 이미지'; + + @override + String get editMetadataSelectAll => '모두'; + + @override + String get editMetadataSelectEmpty => '비어 있음만'; + + @override + String queueDownloadingCount(int count) { + return '다운로드하는 중 ($count)'; + } + + @override + String get queueFilteringIndicator => '필터링하는 중...'; + + @override + String queueTrackCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 개의 트랙', + one: '1 개의 트랙', + ); + return '$_temp0'; + } + + @override + String queueAlbumCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 개의 앨범', + one: '1 개의 앨범', + ); + return '$_temp0'; + } + + @override + String get queueEmptyAlbums => '앨범 다운로드가 없음'; + + @override + String get queueEmptyAlbumsSubtitle => '앨범에서 여러 트랙을 다운로드하면 여기에 표시됩니다'; + + @override + String get queueEmptySingles => '싱글 다운로드가 없음'; + + @override + String get queueEmptySinglesSubtitle => '싱글 트랙 다운로드는 여기에 표시됩니다'; + + @override + String get queueEmptyHistory => '다운로드 기록이 없음'; + + @override + String get queueEmptyHistorySubtitle => '다운로드된 트랙이 여기에 표시됩니다'; + + @override + String get selectionAllPlaylistsSelected => '모든 재생목록이 선택됨'; + + @override + String get selectionTapPlaylistsToSelect => '선택할 재생목록을 탭하세요'; + + @override + String get selectionSelectPlaylistsToDelete => '삭제할 재생 목록 선택'; + + @override + String get audioAnalysisTitle => '오디오 음질 분석'; + + @override + String get audioAnalysisDescription => '스펙트럼 분석으로 무손실 음질을 확인합니다'; + + @override + String get audioAnalysisAnalyzing => '오디오를 분석하는 중...'; + + @override + String get audioAnalysisSampleRate => '샘플링 레이트'; + + @override + String get audioAnalysisCodec => '코덱'; + + @override + String get audioAnalysisContainer => '컨테이너'; + + @override + String get audioAnalysisDecodedFormat => '디코딩 형식'; + + @override + String get audioAnalysisBitDepth => '비트 심도'; + + @override + String get audioAnalysisChannels => '채널'; + + @override + String get audioAnalysisDuration => '재생시간'; + + @override + String get audioAnalysisNyquist => '나이퀴스트'; + + @override + String get audioAnalysisFileSize => '크기'; + + @override + String get audioAnalysisDynamicRange => '다이나믹 레인지'; + + @override + String get audioAnalysisPeak => '최대 피크'; + + @override + String get audioAnalysisRms => 'RMS'; + + @override + String get audioAnalysisLufs => 'LUFS'; + + @override + String get audioAnalysisTruePeak => '트루 피크'; + + @override + String get audioAnalysisClipping => '클리핑'; + + @override + String get audioAnalysisNoClipping => '클리핑 없음'; + + @override + String get audioAnalysisSpectralCutoff => '주파수 컷오프'; + + @override + String get audioAnalysisChannelStats => '채널별 통계'; + + @override + String get audioAnalysisSamples => '샘플'; + + @override + String get audioAnalysisRescan => '다시 분석'; + + @override + String get audioAnalysisRescanning => '오디오를 다시 분석하는 중...'; + + @override + String get extensionsHomeFeedProvider => '홈 피드 제공자'; + + @override + String get extensionsHomeFeedDescription => + '메인 화면에 홈 피드를 제공하는 확장 프로그램을 선택하세요'; + + @override + String get extensionsHomeFeedAuto => '자동'; + + @override + String get extensionsHomeFeedAutoSubtitle => '사용 가능한 최적의 항목을 자동으로 선택합니다'; + + @override + String get extensionsHomeFeedOff => '끄기'; + + @override + String get extensionsHomeFeedOffSubtitle => '메인 화면에 홈 피드를 표시하지 않습니다'; + + @override + String extensionsHomeFeedUse(String extensionName) { + return '$extensionName 홈 피드 사용'; + } + + @override + String get extensionsNoHomeFeedExtensions => '홈 피드가 있는 확장 프로그램가 없음'; + + @override + String get cancelDownloadTitle => '다운로드를 취소하시겠습니까?'; + + @override + String cancelDownloadContent(String trackName) { + return '\'\'$trackName\'\'에 대한 활성 다운로드를 취소합니다'; + } + + @override + String get cancelDownloadKeep => '유지'; + + @override + String get metadataSaveFailedFfmpeg => 'FFmpeg를 통해 메타데이터 저장 실패'; + + @override + String get metadataSaveFailedStorage => '저장소에 메타데이터 다시 쓰기 실패'; + + @override + String snackbarFolderPickerFailed(String error) { + return '폴더 선택기 열기 실패: $error'; + } + + @override + String notifDownloadingTrack(String trackName) { + return '\'\'$trackName\'\'를 다운로드하는 중'; + } + + @override + String notifFinalizingTrack(String trackName) { + return '\'\'$trackName\'\'를 마무리하는 중'; + } + + @override + String get notifEmbeddingMetadata => '메타데이터를 삽입하는 중...'; + + @override + String notifAlreadyInLibraryCount(int completed, int total) { + return '이미 라이브러리에 있음 ($completed/$total)'; + } + + @override + String get notifAlreadyInLibrary => '이미 라이브러리에 있음'; + + @override + String notifDownloadCompleteCount(int completed, int total) { + return '다운로드 완료 ($completed/$total)'; + } + + @override + String get notifDownloadComplete => '다운로드 완료'; + + @override + String notifDownloadsFinished(int completed, int failed) { + return '다운로드 완료 ($completed 개 완료, $failed 개 실패)'; + } + + @override + String get notifVerificationRequiredTitle => '인증 필요'; + + @override + String get notifVerificationRequiredBody => '앱을 실행하여 인증을 완료하고 다운로드를 재개하세요'; + + @override + String get notifAllDownloadsComplete => '모든 다운로드 완료'; + + @override + String notifTracksDownloadedSuccess(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 개의 트랙 다운로드 성공', + one: '1 개의 트랙 다운로드 성공', + ); + return '$_temp0'; + } + + @override + String notifDownloadsFinishedBody(int completed, int failed) { + String _temp0 = intl.Intl.pluralLogic( + completed, + locale: localeName, + other: '$completed 개의 트랙 다운로드 성공', + one: '1 개의 트랙 다운로드 성공', + ); + String _temp1 = intl.Intl.pluralLogic( + failed, + locale: localeName, + other: '$failed 개 실패', + one: '1 개 실패', + ); + return '$_temp0, $_temp1'; + } + + @override + String get notifDownloadsCanceledTitle => '다운로드 취소됨'; + + @override + String notifDownloadsCanceledBody(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count 개의 다운로드가 사용자에 의해 취소됨', + one: '1 개의 다운로드가 사용자에 의해 취소됨', + ); + return '$_temp0'; + } + + @override + String get notifScanningLibrary => '로컬 라이브러리를 스캔하는 중'; + + @override + String notifLibraryScanProgressWithTotal( + int scanned, + int total, + int percentage, + ) { + return '$scanned/$total 개의 파일 • $percentage%'; + } + + @override + String notifLibraryScanProgressNoTotal(int scanned, int percentage) { + return '$scanned 게의 파일이 스캔됨 • $percentage%'; + } + + @override + String get notifLibraryScanComplete => '라이브러리 스캔 완료'; + + @override + String notifLibraryScanCompleteBody(int count) { + return '$count 개의 트랙이 색인됨'; + } + + @override + String notifLibraryScanExcluded(int count) { + return '$count 개가 제외됨'; + } + + @override + String notifLibraryScanErrors(int count) { + return '$count 개의 오류'; + } + + @override + String get notifLibraryScanFailed => '라이브러리 스캔 실패'; + + @override + String get notifLibraryScanCancelled => '라이브러리 스캔이 취소됨'; + + @override + String get notifLibraryScanStopped => '스캔이 완료되기 전에 중단되었습니다'; + + @override + String notifDownloadingUpdate(String version) { + return 'SpotiFLAC Mobile v$version을 다운로드하는 중'; + } + + @override + String notifUpdateProgress(String received, String total, int percentage) { + return '$received / $total MB • $percentage%'; + } + + @override + String get notifUpdateReady => '업데이트 준비 완료'; + + @override + String notifUpdateReadyBody(String version) { + return 'SpotiFLAC Mobile v$version 다운로드 완료. 설치하려면 탭하세요'; + } + + @override + String get notifUpdateFailed => '업데이트 실패'; + + @override + String get notifUpdateFailedBody => '업데이트를 다운로드할 수 없습니다. 나중에 다시 시도하세요'; + + @override + String get searchTracks => '트랙'; + + @override + String get homeSearchHintDefault => '지원되는 URL을 붙여넣거나 검색...'; + + @override + String homeSearchHintProvider(String providerName) { + return '$providerName으로 검색...'; + } + + @override + String get homeImportCsvTooltip => 'CSV 가져오기'; + + @override + String get homeChangeSearchProviderTooltip => '검색 제공자 변경'; + + @override + String get actionPaste => '붙여넣기'; + + @override + String get tutorialSearchHint => '붙여넣기 또는 검색하기...'; + + @override + String get tutorialDownloadCompletedSemantics => '다운로드 완료'; + + @override + String get tutorialDownloadInProgressSemantics => '다운로드를 진행하는 중'; + + @override + String get tutorialStartDownloadSemantics => '다운로드 시작'; + + @override + String get optionsEmbedMetadata => '메타데이터 삽입'; + + @override + String get optionsEmbedMetadataSubtitleOn => '메타데이터, 표지 이미지 및 내장 가사를 파일에 기록'; + + @override + String get optionsEmbedMetadataSubtitleOff => '비활성화됨 (고급): 모든 메타데이터 삽입 건너뛰기'; + + @override + String get trackCoverNoEmbeddedArt => '내장된 표지 이미지가 없음'; + + @override + String get trackCoverReplace => '표지 교체'; + + @override + String get trackCoverPick => '표지 선택'; + + @override + String get trackCoverClearSelected => '선택된 표지 지우기'; + + @override + String get trackCoverCurrent => '현재 표지'; + + @override + String get trackCoverSelected => '선택된 표지'; + + @override + String get trackCoverReplaceNotice => '저장을 탭하면 선택한 표지가 현재 내장된 표지를 대체합니다'; + + @override + String get actionStop => '중지'; + + @override + String get queueFinalizingDownload => '다운로드를 마무리하는 중'; + + @override + String get queueDownloadNext => 'Download next'; + + @override + String get queueDownloadedFileMissing => '다운로드된 파일이 없음'; + + @override + String get queueDownloadCompleted => '다운로드 완료'; + + @override + String get queueRateLimitTitle => '서비스 사용 제한됨'; + + @override + String get queueRateLimitMessage => + '이 트랙은 아직 사용 가능할 수 있습니다. 몇 분 기다렸다가 병렬 다운로드를 줄인 후에 다시 시도하세요'; + + @override + String appearanceSelectAccentColor(String hex) { + return '강조 색상 $hex 선택'; + } + + @override + String get logAutoScrollOn => '자동 스크롤: ON'; + + @override + String get logAutoScrollOff => '자동 스크롤: OFF'; + + @override + String get logCopyLogs => '로그 복사'; + + @override + String get logClearSearch => '로그 지우기'; + + @override + String get logIssueIspBlockingLabel => 'ISP 차단 감지됨'; + + @override + String get logIssueIspBlockingDescription => 'ISP에서 다운로드 서비스 접속을 차단했을 수 있습니다'; + + @override + String get logIssueIspBlockingSuggestion => + 'VPN을 사용하거나 DNS를 1.1.1.1 또는 8.8.8.8로 변경해 보세요'; + + @override + String get logIssueRateLimitedLabel => '사용 제한'; + + @override + String get logIssueRateLimitedDescription => '서비스에 대한 요청이 너무 많습니다'; + + @override + String get logIssueRateLimitedSuggestion => '몇 분 기다린 후에 다시 시도하세요'; + + @override + String get logIssueNetworkErrorLabel => '네트워크 오류'; + + @override + String get logIssueNetworkErrorDescription => '연결 문제가 감지됨'; + + @override + String get logIssueNetworkErrorSuggestion => '인터넷 연결 상태를 확인하세요'; + + @override + String get logIssueTrackNotFoundLabel => '트랙을 찾을 수 없음'; + + @override + String get logIssueTrackNotFoundDescription => '일부 트랙은 다운로드 서비스에서 찾을 수 없습니다'; + + @override + String get logIssueTrackNotFoundSuggestion => '트랙이 무손실 음질로 제공되지 않을 수 있습니다'; + + @override + String get clickableLookingUpArtist => '아티스트를 검색하는 중...'; + + @override + String clickableInformationUnavailable(String type) { + return '$type 정보를 사용할 수 없음'; + } + + @override + String get extensionDetailsTags => '태그'; + + @override + String get extensionDetailsInformation => '정보'; + + @override + String get extensionUtilityFunctions => '유틸리티 함수'; + + @override + String get actionDismiss => '닫기'; + + @override + String get setupChangeFolderTooltip => '폴더 변경'; + + @override + String a11yOpenTrackByArtist(String trackName, String artistName) { + return '\'\'$artistName\'\'의 트랙 \'\'$trackName\'\' 열기'; + } + + @override + String a11yOpenItem(String itemType, String name) { + return '$itemType $name 열기'; + } + + @override + String a11yOpenItemCount(String title, int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목', + one: '항목', + ); + return '$title, $count 개의 $_temp0 열기'; + } + + @override + String a11yOpenAlbumByArtistTrackCount( + String albumName, + String artistName, + int trackCount, + ) { + return '\'\'$artistName\'\'의 앨범 \'\'$albumName\'\' 열기 ($trackCount 번째 곡)'; + } + + @override + String a11yTrackByArtist(String trackName, String artistName) { + return '\'\'$artistName\'\'의 \'\'$trackName\'\''; + } + + @override + String a11ySelectAlbum(String albumName) { + return '앨범 \'\'$albumName\'\' 선택'; + } + + @override + String a11yOpenAlbum(String albumName) { + return '앨범 \'\'$albumName\'\' 열기'; + } + + @override + String get settingsFiles => '파일 & 폴더'; + + @override + String get settingsFilesSubtitle => '다운로드 위치, 파일 이름, 폴더 구조'; + + @override + String get settingsMetadata => '메타데이터'; + + @override + String get settingsMetadataSubtitle => '표지 이미지, 태그, 리플레이게인, 제공자'; + + @override + String get settingsLyrics => '가사'; + + @override + String get settingsLyricsSubtitle => '삽입, 모드, 제공자, 언어 옵션'; + + @override + String get settingsApp => '앱'; + + @override + String get settingsAppSubtitle => '업데이트, 데이터, 확장프로그램 레포, 디버그'; + + @override + String get sectionMetadataProviders => '제공자'; + + @override + String get sectionDuplicates => '중복'; + + @override + String get sectionLyricsProviderOptions => '제공자 옵션'; + + @override + String get metadataProvidersTitle => '메타데이터 제공자 우선순위'; + + @override + String get metadataProvidersSubtitle => '드래그하여 검색 및 메타데이터 출처 순서를 설정하세요'; + + @override + String get downloadDeduplication => '중복 다운로드 건너뛰기'; + + @override + String get downloadDeduplicationEnabled => '이미 다운로드된 트랙은 건너뜁니다'; + + @override + String get downloadDeduplicationWithQualityVariants => '선택된 음질의 기존 파일은 건너뜁니다'; + + @override + String get downloadDeduplicationDisabled => '기록과 관계없이 모든 트랙이 다운로드됩니다'; + + @override + String get downloadQualityVariants => '다양한 음질 버전 허용'; + + @override + String get downloadQualityVariantsDescription => + '선택된 음질을 파일 이름에 추가하고, 각 버전을 다운로드 기록에 유지합니다'; + + @override + String get trackOptionDownloadQualityVariant => '다른 음질 다운로드'; + + @override + String get downloadFallbackExtensions => '대체 확장 프로그램'; + + @override + String get downloadFallbackExtensionsSubtitle => + '대체 확장 프로그램으로 사용할 확장 프로그램을 선택하세요'; + + @override + String get editMetadataFieldDateHint => 'YYYY-MM-DD 또는 YYYY'; + + @override + String get editMetadataFieldTrackTotal => '전체 트랙 수'; + + @override + String get editMetadataFieldDiscTotal => '전체 디스크 수'; + + @override + String get editMetadataFieldComposer => '작곡가'; + + @override + String get editMetadataFieldComment => '주석'; + + @override + String get editMetadataAdvanced => '고급'; + + @override + String get libraryFilterMetadataMissingTrackNumber => '트랙 번호 누락'; + + @override + String get libraryFilterMetadataMissingDiscNumber => '디스크 번호 누락'; + + @override + String get libraryFilterMetadataMissingArtist => '아티스트 누락'; + + @override + String get libraryFilterMetadataIncorrectIsrcFormat => 'ISRC 형식이 잘못됨'; + + @override + String get libraryFilterMetadataMissingLabel => '레이블 누락'; + + @override + String collectionDeletePlaylistsMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '재생목록', + one: '재생목록', + ); + return '$count 개의 $_temp0을 삭제하시겠습니까?'; + } + + @override + String collectionPlaylistsDeleted(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '재생목록', + one: '재생목록', + ); + return '$count 개의 $_temp0이 삭제됨'; + } + + @override + String collectionAddedTracksToPlaylist(int count, String playlistName) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '\'\'$playlistName\'\'에 $count 개의 $_temp0이 추가됨'; + } + + @override + String collectionAddedTracksToPlaylistWithExisting( + int count, + String playlistName, + int alreadyCount, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '\'\'$playlistName\'\'에 $count 개의 $_temp0이 추가됨 ($alreadyCount 개의 트랙은 이미 재생목록에 있음)'; + } + + @override + String itemCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '항목', + one: '항목', + ); + return '$count 개의 $_temp0'; + } + + @override + String trackReEnrichSuccessWithFailures( + int successCount, + int total, + int failedCount, + ) { + return '메타데이터 재구성 성공 ($successCount/$total) - 실패: $failedCount'; + } + + @override + String selectionDeleteTracksCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '$count $_temp0 삭제'; + } + + @override + String queueDownloadSpeedStatus(String speed) { + return '다운로드하는 중 - $speed MB/s'; + } + + @override + String get queueDownloadStarting => '시작하는 중...'; + + @override + String get queueCheckingDownloadSession => '다운로드 세션을 확인하는 중...'; + + @override + String get queueResolvingDownloadMetadata => '트랙 메타데이터를 확인하는 중...'; + + @override + String get queueResolvingDownloadStream => '오디오 스트림을 준비하는 중...'; + + @override + String get queueWaitingForVerification => '확인을 기다리는 중...'; + + @override + String get queueResumingAfterVerification => '확인 후 재개하는 중...'; + + @override + String get a11ySelectTrack => '트랙 선택'; + + @override + String get a11yDeselectTrack => '트랙 선택 해제'; + + @override + String a11yPlayTrackByArtist(String trackName, String artistName) { + return '\'\'$artistName\'\'의 \'\'$trackName\'\' 재생'; + } + + @override + String storeExtensionsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '확장 프로그램', + one: '확장 프로그램', + ); + return '$count 개의 $_temp0'; + } + + @override + String storeRequiresVersion(String version) { + return 'v$version 이상 필요'; + } + + @override + String get actionGo => '이동'; + + @override + String get logIssueSummary => '문제 요약'; + + @override + String logTotalErrors(int count) { + return '총 오류 수: $count'; + } + + @override + String logAffectedDomains(String domains) { + return '영향받은 도메인: $domains'; + } + + @override + String get libraryScanCancelled => '스캔이 취소됨'; + + @override + String get libraryScanCancelledSubtitle => '준비가 되면 스캔을 다시 시도할 수 있습니다'; + + @override + String libraryDownloadsHistoryExcluded(int count) { + return '다운로드 기록에서 $count 개 (목록에서 제외됨)'; + } + + @override + String get downloadNativeWorker => '기본 다운로드 워커'; + + @override + String get downloadNativeWorkerSubtitle => + '확장 프로그램 다운로드를 위한 Android 백그라운드 서비스'; + + @override + String get badgeBeta => '베타'; + + @override + String get extensionServiceStatus => '서비스 상태'; + + @override + String get extensionServiceHealth => '서비스 상태'; + + @override + String extensionHealthChecksConfigured(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '검사', + one: '검사', + ); + return '$count 개의 $_temp0가 설정됨'; + } + + @override + String get extensionOauthConnectHint => 'Spotify에 연결을 탭하여 이 필드를 채우세요'; + + @override + String extensionLastChecked(String time) { + return '마지막 확인 시간: $time'; + } + + @override + String get extensionRefreshStatus => '상태 새로고침'; + + @override + String get extensionCustomUrlHandling => '사용자 정의 URL 처리'; + + @override + String get extensionCustomUrlHandlingSubtitle => + '이 확장 프로그램은 다음 사이트의 링크를 처리할 수 있습니다'; + + @override + String get extensionCustomUrlHandlingShareHint => + '이 사이트의 링크를 SpotiFLAC Mobile로 공유하면 이 확장 프로그램이 처리합니다'; + + @override + String extensionSettingsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '설정', + one: '설정', + ); + return '$count 개의 $_temp0'; + } + + @override + String get extensionHealthOnline => '온라인'; + + @override + String get extensionHealthDegraded => '저하됨'; + + @override + String get extensionHealthOffline => '오프라인'; + + @override + String get extensionHealthNotConfigured => '설정되지 않음'; + + @override + String get extensionHealthUnknown => '알 수 없음'; + + @override + String get extensionHealthRequired => '필수'; + + @override + String get extensionSettingNotSet => '설정되지 않음'; + + @override + String get extensionActionFailed => '작업 실패'; + + @override + String get extensionEnterValue => '값을 입력하세요'; + + @override + String get extensionHealthServiceOnline => '서비스 온라인'; + + @override + String get extensionHealthServiceDegraded => '서비스 저하됨'; + + @override + String get extensionHealthServiceOffline => '서비스 오프라인'; + + @override + String get extensionHealthServiceUnknown => '서비스 상태 알 수 없음'; + + @override + String get audioAnalysisStereo => '스테레오'; + + @override + String get audioAnalysisMono => '모노'; + + @override + String trackOpenInService(String serviceName) { + return '$serviceName에서 열기'; + } + + @override + String get trackLyricsEmbeddedSource => '내장'; + + @override + String get unknownAlbum => '알 수 없는 앨범'; + + @override + String get unknownArtist => '알 수 없는 아티스트'; + + @override + String get permissionAudio => '오디오'; + + @override + String get permissionStorage => '저장소'; + + @override + String get permissionNotification => '알림'; + + @override + String get errorInvalidFolderSelected => '잘못된 폴더가 선택됨'; + + @override + String get storeAnyVersion => '모든'; + + @override + String get storeCategoryMetadata => '메타데이터'; + + @override + String get storeCategoryDownload => '다운로드'; + + @override + String get storeCategoryUtility => '유틸리티'; + + @override + String get storeCategoryLyrics => '가사'; + + @override + String get storeCategoryIntegration => '연동'; + + @override + String get artistReleases => '발매 음악'; + + @override + String get editMetadataSelectNone => '없음'; + + @override + String queueRetryAllFailed(int count) { + return '재시도 $count 번 실패'; + } + + @override + String get settingsSaveDownloadHistory => '다운로드 기록 저장'; + + @override + String get settingsSaveDownloadHistorySubtitle => + '완료된 다운로드를 기록 및 라이브러리 보기에 유지합니다'; + + @override + String get dialogDisableHistoryTitle => '다운로드 기록을 끄시겠습니까?'; + + @override + String get dialogDisableHistoryMessage => '기존 기록이 삭제됩니다. 다운로드된 파일은 삭제되지 않습니다'; + + @override + String get dialogDisableAndClear => '끄고 지우기'; + + @override + String get openInOtherServices => '다른 서비스에서 열기'; + + @override + String get shareSheetNoExtensions => '호환되는 다른 서비스가 없음'; + + @override + String get shareSheetNotFound => '찾을 수 없음'; + + @override + String get shareSheetCopyLink => '링크 복사'; + + @override + String shareSheetLinkCopied(Object service) { + return '$service 링크가 복사됨'; + } + + @override + String get libraryPlayback => '재생'; + + @override + String get libraryExternalPlayer => '외부 플레이어'; + + @override + String get libraryExternalPlayerSubtitle => + '감상용으로 권장됩니다. 최고 음질, 갭리스 재생, EQ 및 다양한 오디오 형식을 지원합니다'; + + @override + String get libraryBuiltInPreviewPlayer => '내부 미리듣기 플레이어'; + + @override + String get libraryBuiltInPreviewPlayerSubtitle => + 'SpotiFLAC Mobile에서 빠른 로컬 미리듣기 전용이며, 일반적인 음악 감상에는 권장되지 않습니다'; + + @override + String get libraryBuiltInPlayerInfo => + '내부 플레이어는 로컬 트랙을 빠르게 미리듣기 위한 도구입니다. 실제 음악 감상은 외부 음악 플레이어를 이용하는 것을 권장합니다'; + + @override + String get nowPlayingTitle => '현재 재생 중'; + + @override + String get nowPlayingNothingPlaying => '재생 중인 노래가 없음'; + + @override + String get nowPlayingMinimize => '최소화'; + + @override + String get nowPlayingUpNext => '다음 곡'; + + @override + String get nowPlayingDetails => '트랙 세부 정보'; + + @override + String get nowPlayingOpenInExternalPlayer => '외부 플레이어에서 열기'; + + @override + String get nowPlayingTabPlayer => '플레이어'; + + @override + String get nowPlayingTabLyrics => '가사'; + + @override + String get nowPlayingNoLyrics => '이 파일에는 가사가 없음'; + + @override + String get nowPlayingLibraryEmpty => '라이브러리가 비어 있음'; + + @override + String nowPlayingShuffleLibraryFailed(String error) { + return '라이브러리에서 셔플을 사용할 수 없음: $error'; + } + + @override + String get nowPlayingShuffleOn => '셔플 켜기'; + + @override + String get nowPlayingPlayInOrder => '순서대로 재생'; + + @override + String get nowPlayingShuffleLibrary => '라이브러리 셔플'; + + @override + String get nowPlayingQueueEmpty => '현재 다운로드 목록이 비어 있음'; + + @override + String get nowPlayingNoMetadata => '사용할 수 있는 메타데이터가 없음'; + + @override + String get announcementUnableToOpenLink => '링크를 열 수 없습니다. 다시 시도해 주세요'; + + @override + String trackConvertLosslessOutputWithCap(String quality) { + return '$quality 제한이 있는 무손실 출력'; + } + + @override + String trackConvertConfirmMessageLosslessCapped( + String sourceFormat, + String targetFormat, + String quality, + ) { + return '$sourceFormat에서 $targetFormat($quality)으로 변환하시겠습니까?\n\n출력은 무손실 코덱을 유지하지만 비트 심도/샘플 속도가 제한됩니다. 변환 후 원본 파일이 삭제됩니다'; + } + + @override + String selectionBatchConvertConfirmMessageLosslessCapped( + int count, + String format, + String quality, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '트랙', + one: '트랙', + ); + return '$count 개의 $_temp0을 $format($quality)으로 변환하시겠습니까?\n\n출력은 무손실 코덱을 유지하지만 비트 심도/샘플 속도가 제한됩니다. 변환 후 원본 파일이 삭제됩니다'; + } + + @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 => + 'Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou 및 Genius용 가사 프록시'; + + @override + String get snackbarPlayingNext => '다음 곡 재생'; + + @override + String get snackbarAddedToQueueGeneric => '현재 다운로드 목록에 추가됨'; + + @override + String selectionDeletePlaylistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '재생목록', + one: '재생목록', + ); + return '$count $_temp0 삭제'; + } + + @override + String get actionShuffle => '셔플'; + + @override + String get downloadPrimaryArtistOnlyOn => '기본 아티스트만: ON'; + + @override + String get downloadPrimaryArtistOnlyOff => '기본 아티스트만: OFF'; + + @override + String get downloadAlbumArtistMetadataPrimaryOnly => '앨범 아티스트 메타데이터: 기본만'; + + @override + String get downloadAlbumArtistMetadataFull => '앨범 아티스트 메타데이터: 전체'; + + @override + String get trackConvertOriginal => '원본'; + + @override + String get trackConvertOriginalQuality => '원본 음질'; + + @override + String get trackConvertLosslessSuffix => '무손실'; + + @override + String get trackConvertDithering => '디더링'; + + @override + String get trackConvertResampler => '리샘플러'; + + @override + String get trackConvertDitherNone => '없음'; + + @override + String get trackConvertDitherTriangular => 'TPDF'; + + @override + String get trackConvertDitherTriangularHp => '삼각형 HP'; + + @override + String get trackConvertResamplerSwr => 'SWR'; + + @override + String get trackConvertResamplerSoxr => 'SoXr'; + + @override + String get updateSeeReleaseNotes => '자세한 내용은 릴리스 노트를 참조하세요'; + + @override + String get unknownTitle => '알 수 없는 제목'; + + @override + String get trackPlayNext => '다음 곡 재생'; + + @override + String get trackAddToQueue => '다운로드 목록에 추가'; + + @override + String snackbarExtensionInstalledEnable(String extensionName) { + return '\'\'$extensionName\'\'이 설치됨. \'설정 > 확장 프로그램\'에서 활성화하세요'; + } + + @override + String snackbarExtensionUpdatedVersion(String extensionName, String version) { + return '\'\'$extensionName\'\'이 v$version으로 업데이트됨'; + } + + @override + String snackbarFailedToInstallNamed(String extensionName) { + return '$extensionName 설치 실패'; + } + + @override + String snackbarFailedToUpdateNamed(String extensionName) { + return '$extensionName 업데이트 실패'; + } + + @override + String get releaseTypeEp => 'EP'; + + @override + String get releaseTypeSingle => '싱글'; + + @override + String get trackCoverOnline => '온라인 표지'; + + @override + String get regionCountryUS => '미국'; + + @override + String get regionCountryGB => '영국'; + + @override + String get regionCountryFR => '프랑스'; + + @override + String get regionCountryDE => '독일'; + + @override + String get regionCountryJP => '일본'; + + @override + String get regionCountryKR => '한국'; + + @override + String get regionCountryIN => '인도'; + + @override + String get regionCountryID => '인도네시아'; + + @override + String get regionCountryBR => '브라질'; + + @override + String get regionCountryMX => '멕시코'; + + @override + String get regionCountryAU => '호주'; + + @override + String get regionCountryCA => '캐나다'; + + @override + String get regionCountryXK => '코소보'; + + @override + String get extensionVerificationBrowserTitle => '인증 브라우저'; + + @override + String get extensionVerificationBrowserSubtitleExternal => + '인증을 기본 브라우저에서 먼저 실행합니다'; + + @override + String get extensionVerificationBrowserSubtitleInApp => + '인증을 앱 내 브라우저에서 먼저 실행합니다'; + + @override + String get extensionVerificationBrowserExternal => '외부'; + + @override + String get extensionVerificationBrowserInApp => '내부'; + + @override + String get extensionVerificationHelpTitleManual => '수동으로 인증 열기'; + + @override + String get extensionVerificationHelpTitleWaiting => '아직 인증을 기다리는 중'; + + @override + String get extensionVerificationHelpMessageManual => + 'SpotiFLAC Mobile에서 브라우저를 자동으로 열지 못하였습니다. 아래 링크를 브라우저에서 열거나 직접 복사하세요'; + + @override + String get extensionVerificationHelpMessageWaiting => + '브라우저가 열리지 않았거나 인증을 완료한 후에도 SpotiFLAC Mobile로 돌아오지 않았다면, 아래 링크를 다시 열거나 직접 복사하세요'; + + @override + String get extensionVerificationClose => '닫기'; + + @override + String get extensionVerificationCopyLink => '링크 복사'; + + @override + String get extensionVerificationLinkCopied => '인증 링크가 복사됨'; + + @override + String get extensionVerificationOpenBrowser => '브라우저 열기'; +} diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 8bb856b1..bba88870 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -645,6 +645,12 @@ class AppLocalizationsPt extends AppLocalizations { @override String get collectionExportM3uFailed => 'Export failed'; + @override + String get trackOpenOn => 'Open on...'; + + @override + String get trackOpenOnNoLinks => 'No platform links found for this track.'; + @override String snackbarAddedToQueue(String trackName) { return 'Added \"$trackName\" to queue'; @@ -5554,6 +5560,14 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get updateNewVersionReady => 'Uma nova versão está pronta'; + @override + String get updateRequiredTitle => 'Update required'; + + @override + String updateRequiredNotice(int count) { + return 'This version is $count releases behind and is no longer supported. Update to keep using the app.'; + } + @override String get updateCurrent => 'Atual'; @@ -6195,6 +6209,13 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get appearanceAmoledDarkSubtitle => 'Fundo preto puro'; + @override + String get appearanceHeroAnimations => 'Hero animations'; + + @override + String get appearanceHeroAnimationsSubtitle => + 'Fly covers between screens, e.g. when opening the player'; + @override String get queueClearAll => 'Limpar Tudo'; @@ -6222,6 +6243,21 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { 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 => 'Artista / Álbum'; @@ -6843,6 +6879,20 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { String get cacheLibraryCoverDesc => 'Cover art extracted from local music files. Will re-extract on next scan.'; + @override + String get libraryPlaybackNormalization => 'Volume normalization'; + + @override + String get libraryPlaybackNormalizationSubtitle => + 'Even out loudness between tracks using their ReplayGain or R128 tags, when present'; + + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Explore feed cache'; @@ -7016,6 +7066,13 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get trackConvertBitrate => 'Bitrate'; + @override + String get trackConvertKeepOriginal => 'Keep original file'; + + @override + String get trackConvertKeepOriginalDescription => + 'Add the converted file as a separate library entry'; + @override String get trackConvertConfirmTitle => 'Confirm Conversion'; @@ -7036,6 +7093,14 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { return 'Convert from $sourceFormat to $targetFormat? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.'; } + @override + String trackConvertConfirmKeepOriginal( + String sourceFormat, + String targetFormat, + ) { + return 'Convert from $sourceFormat to $targetFormat?\n\nThe original file will be kept and the converted file will be added as a separate library entry.'; + } + @override String get trackConvertLosslessHint => 'Lossless conversion — no quality loss'; @@ -7192,11 +7257,10 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { 'Tap the heart on an artist page to keep them here'; @override - String get collectionPlaylistEmptyTitle => 'Playlist is empty'; + String get collectionPlaylistEmptyTitle => 'A lista de reprodução está vazia'; @override - String get collectionPlaylistEmptySubtitle => - 'Long-press + on any track to add it here'; + String get collectionPlaylistEmptySubtitle => ''; @override String get collectionRemoveFromPlaylist => 'Remove from playlist'; @@ -7315,6 +7379,17 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { return 'Convert $count $_temp0 to $format? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.'; } + @override + String selectionBatchConvertConfirmKeepOriginal(int count, String format) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Convert $count $_temp0 to $format?\n\nOriginal files will be kept and converted files will be added as separate library entries.'; + } + @override String selectionBatchConvertSuccess(int success, int total, String format) { return 'Converted $success of $total tracks to $format'; @@ -7628,10 +7703,29 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { 'Saves to Music/SpotiFLAC by default'; @override - String get storageModeSaf => 'Custom Folder (SAF)'; + String get storageModeSaf => ''; @override - String get storageModeSafSubtitle => 'Pick any folder, including SD card'; + String get storageModeSafSubtitle => + 'Escolha qualquer pasta, incluindo o cartão SD'; + + @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( @@ -8140,6 +8234,13 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { 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'; @@ -8224,10 +8325,11 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { String get notifLibraryScanFailed => 'Library scan failed'; @override - String get notifLibraryScanCancelled => 'Library scan cancelled'; + String get notifLibraryScanCancelled => + 'Escaneamento de biblioteca cancelado'; @override - String get notifLibraryScanStopped => 'Scan stopped before completion.'; + String get notifLibraryScanStopped => ''; @override String notifDownloadingUpdate(String version) { @@ -8515,10 +8617,24 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { String get downloadDeduplicationEnabled => 'Already-downloaded tracks will be skipped'; + @override + String get downloadDeduplicationWithQualityVariants => + 'Existing files at the selected quality will be skipped'; + @override String get downloadDeduplicationDisabled => 'All tracks will be downloaded regardless of history'; + @override + String get downloadQualityVariants => 'Allow different quality versions'; + + @override + String get downloadQualityVariantsDescription => + 'Add the selected quality to the filename and keep each version in download history'; + + @override + String get trackOptionDownloadQualityVariant => 'Download another quality'; + @override String get downloadFallbackExtensions => 'Fallback Extensions'; @@ -8647,6 +8763,21 @@ class AppLocalizationsPtPt extends AppLocalizationsPt { @override String get queueDownloadStarting => 'Starting...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Select track'; diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index 1da098a6..17517c38 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -649,6 +649,12 @@ class AppLocalizationsRu extends AppLocalizations { @override String get collectionExportM3uFailed => 'Export failed'; + @override + String get trackOpenOn => 'Open on...'; + + @override + String get trackOpenOnNoLinks => 'No platform links found for this track.'; + @override String snackbarAddedToQueue(String trackName) { return '\"$trackName\" добавлен в очередь'; diff --git a/lib/l10n/app_localizations_tr.dart b/lib/l10n/app_localizations_tr.dart index 5e8003b9..22bc8fe2 100644 --- a/lib/l10n/app_localizations_tr.dart +++ b/lib/l10n/app_localizations_tr.dart @@ -651,6 +651,12 @@ class AppLocalizationsTr extends AppLocalizations { @override String get collectionExportM3uFailed => 'Export failed'; + @override + String get trackOpenOn => 'Open on...'; + + @override + String get trackOpenOnNoLinks => 'No platform links found for this track.'; + @override String snackbarAddedToQueue(String trackName) { return '\"$trackName\" kuyruğa eklendi'; diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index 5b34ed37..749b8d5f 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -652,6 +652,12 @@ class AppLocalizationsUk extends AppLocalizations { @override String get collectionExportM3uFailed => 'Export failed'; + @override + String get trackOpenOn => 'Open on...'; + + @override + String get trackOpenOnNoLinks => 'No platform links found for this track.'; + @override String snackbarAddedToQueue(String trackName) { return 'Додано \"$trackName\" до черги'; diff --git a/lib/l10n/arb/app_de.arb b/lib/l10n/arb/app_de.arb index 6ad5db24..d1947239 100644 --- a/lib/l10n/arb/app_de.arb +++ b/lib/l10n/arb/app_de.arb @@ -23,7 +23,7 @@ "@cacheCleanupUnused": { "description": "Action title for cleaning unused entries" }, - "trackConvertDitherNone": "None", + "trackConvertDitherNone": "Keine", "@trackConvertDitherNone": { "description": "Lossless conversion dither option with no dithering applied" }, @@ -143,7 +143,7 @@ "description": "Share button tooltip" }, "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "extensionsInstallButton": "Erweiterung installieren", "@extensionsInstallButton": { @@ -317,7 +317,7 @@ }, "optionsExtensionStore": "Erweiterungs-Repo", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "libraryDownloadsHistoryExcluded": "{count} aus dem Download-Verlauf (von der Liste ausgeschlossen)", "@libraryDownloadsHistoryExcluded": { @@ -459,7 +459,7 @@ }, "storeFilterDownload": "Herunterladen", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "@collectionAddToPlaylist": { "description": "Action to add a track to user playlist" @@ -775,7 +775,7 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "logTitle": "Logs", + "logTitle": "Protokolle", "@logTitle": { "description": "Logs screen title" }, @@ -1151,7 +1151,7 @@ }, "storeFilterMetadata": "Metadaten", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "shareSheetCopyLink": "Copy Link", "errorRateLimitedMessage": "Zu viele Anfragen. Bitte warte einen Moment, bevor du es erneut suchst.", @@ -1732,7 +1732,7 @@ }, "storeFilterUtility": "Utility", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "collectionAddedToPlaylist": "Zu \"{playlistName} \" hinzugefügt", "@collectionAddedToPlaylist": { @@ -2919,7 +2919,7 @@ "description": "Status label when primary-artist-only folder naming is enabled" }, "lyricsProvidersDiscardContent": "Ungespeicherte Änderungen die verloren gehen.", - "previewStop": "Stop preview", + "previewStop": "Vorschau stoppen", "@previewStop": { "description": "Tooltip for the button that stops the playing track preview snippet" }, @@ -3205,7 +3205,7 @@ }, "trackConvertOriginal": "Original", "sectionLyricsProviderOptions": "Anbieter-Optionen", - "nowPlayingTitle": "Now Playing", + "nowPlayingTitle": "Jetzt läuft", "@nowPlayingTitle": { "description": "Title for the now playing screen" }, @@ -3328,7 +3328,7 @@ }, "libraryPlayback": "Playback", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "aboutApp": "App", "@aboutApp": { @@ -3348,7 +3348,7 @@ "logIssueIspBlockingLabel": "ISP BLOCKIERUNG ERKANNT", "storeFilterIntegration": "Integration", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "@lyricsProvidersAtLeastOne": { "description": "Snackbar when user tries to disable the last enabled provider" @@ -3538,7 +3538,7 @@ }, "storeTitle": "Erweiterungs-Repo", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "libraryCleared": "Bibliothek geleert", "@libraryCleared": { @@ -3586,7 +3586,7 @@ "@searchSortTitle": { "description": "Bottom sheet title for search sort options" }, - "editMetadataSelectNone": "None", + "editMetadataSelectNone": "Keine", "@historyFilterSingles": { "description": "Filter chip - show singles only" }, @@ -3705,7 +3705,7 @@ "description": "Dialog title for default folder" }, "optionsArtistTagModeSplitVorbisSubtitle": "Schreibe einen Künstler Tag pro Künstler für FLAC und Opus; MP3 und M4A bleiben beigetreten.", - "snackbarPlayingNext": "Playing next", + "snackbarPlayingNext": "Als nächstes", "@snackbarPlayingNext": { "description": "Snackbar when a track is inserted as the next queue item" }, @@ -3853,7 +3853,7 @@ }, "lyricsProviderMusixmatchDesc": "Größte Lyrics-Datenbank (mehrsprachig)", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "extensionPostProcessing": "Post-processing", "@searchTracks": { @@ -4348,7 +4348,7 @@ "description": "Snackbar when no selected tracks support conversion" }, "extensionHealthDegraded": "Eingeschränkt", - "regionCountryKR": "South Korea", + "regionCountryKR": "Südkorea", "@regionCountryKR": { "description": "Country name for SongLink region picker" }, @@ -4444,7 +4444,7 @@ "appName": "SpotiFLAC Mobile", "storeRepoDialogCurrent": "Aktuelles Repository:", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "@trackLyrics": { "description": "Tab title - lyrics" @@ -4557,7 +4557,7 @@ "downloadUseAlbumArtistForFoldersTrackSubtitle": "Ordner benannt nach dem Tag des Künstlers", "storeSearch": "Erweiterungen suchen...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "aboutTelegramChat": "Telegram Community", "lyricsModeBoth": "Beides", @@ -4792,7 +4792,7 @@ } }, "dialogRemove": "Entfernen", - "extensionVerificationClose": "Close", + "extensionVerificationClose": "Schließen", "bulkDownloadPlaylistsButton": "Lade {count} {count, plural, =1{Playlist} other{Playlists}} herunter", "@bulkDownloadPlaylistsButton": { "description": "Button label for bulk downloading selected playlists", @@ -4979,7 +4979,7 @@ "description": "Button text to start CUE splitting" }, "appearanceHistoryView": "Verlaufsansicht", - "audioAnalysisSampleRate": "Sample Rate", + "audioAnalysisSampleRate": "Abtastrate", "@settingsCache": { "description": "Settings menu item - cache management" }, @@ -5585,7 +5585,7 @@ "homeAlbumInfoUnavailable": "Albuminfo nicht verfügbar", "settingsLyrics": "Lyrics", "extensionVerificationBrowserExternal": "External", - "regionCountryIN": "India", + "regionCountryIN": "Indien", "extensionHealthUnknown": "Unbekannt", "backupContentsWishlist": "{count} wishlist {count, plural, =1{track} other{tracks}}", "settingsAutoExportFailed": "Auto-Export fehlgeschlagener Downloads", @@ -5733,7 +5733,7 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "previewPlay": "Play preview", + "previewPlay": "Vorschau abspielen", "setupPermissionRequiredMessage": "{permissionType}-Berechtigung ist erforderlich für\ndie beste Benutzererfahrung. Du kannst dies später in den Einstellungen ändern.", "aboutVersion": "Version", "qualityHiResFlacSubtitle": "24-Bit / bis 96kHz", @@ -5791,7 +5791,7 @@ "libraryFilterTitle": "Filter", "cleanupOrphanedDownloadsResult": "Entfernte {count} verwaiste Einträge aus dem Verlauf", "extensionHooksAvailable": "{count} Hook(s) verfügbar", - "backupContentsSettings": "App settings", + "backupContentsSettings": "Appeinstellungen", "trackLyricsEmbedded": "Lyrics erfolgreich eingebettet", "optionsUpdateChannelPreview": "Vorschau-Versionen erhalten", "collectionAddedToFavoriteArtists": "\"{artistName}\" zu Lieblingskünstlern hinzugefügt", @@ -5883,5 +5883,144 @@ "extensionsSearchProviderDescription": "Wähle den Dienst für die Suche von Titel", "albumFolderAlbumOnly": "Nur Alben", "nowPlayingOpenInExternalPlayer": "Open in external player", - "cueSplitButton": "In Titel aufteilen" + "cueSplitButton": "In Titel aufteilen", + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification..." } diff --git a/lib/l10n/arb/app_es_ES.arb b/lib/l10n/arb/app_es_ES.arb index c8815253..659a964c 100644 --- a/lib/l10n/arb/app_es_ES.arb +++ b/lib/l10n/arb/app_es_ES.arb @@ -19,7 +19,7 @@ }, "navStore": "Repositorio", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "Inicio", "@homeTitle": { @@ -282,11 +282,11 @@ }, "optionsExtensionStore": "Repositorio de extensiones", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "Mostrar la pestaña del repositorio en la navegación", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "Buscar actualizaciones", "@optionsCheckUpdates": { @@ -355,11 +355,11 @@ }, "storeTitle": "Repositorio de extensiones", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "Buscar extensiones...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "Instalar", "@storeInstall": { @@ -1604,27 +1604,27 @@ }, "storeFilterAll": "Todo", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "Información", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "Descargar", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "Utilidad", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "Letras", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "Integración", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "Limpiar filtros", "@storeClearFilters": { @@ -5883,5 +5883,144 @@ "extensionVerificationOpenBrowser": "Open browser", "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" - } + }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification..." } diff --git a/lib/l10n/arb/app_fr.arb b/lib/l10n/arb/app_fr.arb index 54b5d32d..12226668 100644 --- a/lib/l10n/arb/app_fr.arb +++ b/lib/l10n/arb/app_fr.arb @@ -143,7 +143,7 @@ "description": "Share button tooltip" }, "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "extensionsInstallButton": "Installer l'extension", "@extensionsInstallButton": { @@ -317,7 +317,7 @@ }, "optionsExtensionStore": "Référentiel d'extensions", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "libraryDownloadsHistoryExcluded": "{count} dans l'historique des téléchargements (exclu de la liste)", "@libraryDownloadsHistoryExcluded": { @@ -459,7 +459,7 @@ }, "storeFilterDownload": "Télécharger", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "@collectionAddToPlaylist": { "description": "Action to add a track to user playlist" @@ -1151,7 +1151,7 @@ }, "storeFilterMetadata": "Métadonnées", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "shareSheetCopyLink": "Copier le lien", "errorRateLimitedMessage": "Trop de requêtes. Veuillez patienter quelques instants avant de relancer la recherche.", @@ -1732,7 +1732,7 @@ }, "storeFilterUtility": "Utilitaire", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "collectionAddedToPlaylist": "Ajouté à « {playlistName} »", "@collectionAddedToPlaylist": { @@ -3328,7 +3328,7 @@ }, "libraryPlayback": "Lecture", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "aboutApp": "Application", "@aboutApp": { @@ -3348,7 +3348,7 @@ "logIssueIspBlockingLabel": "BLOCAGE PAR LE FAI DÉTECTÉ", "storeFilterIntegration": "Intégration", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "@lyricsProvidersAtLeastOne": { "description": "Snackbar when user tries to disable the last enabled provider" @@ -3538,7 +3538,7 @@ }, "storeTitle": "Répertoire des extensions", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "libraryCleared": "Bibliothèque vidée", "@libraryCleared": { @@ -3853,7 +3853,7 @@ }, "lyricsProviderMusixmatchDesc": "La plus grande base de données de paroles (multilingue)", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "extensionPostProcessing": "Post-traitement", "@searchTracks": { @@ -4444,7 +4444,7 @@ "appName": "SpotiFLAC Mobile", "storeRepoDialogCurrent": "Dépôt actuel :", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "@trackLyrics": { "description": "Tab title - lyrics" @@ -4557,7 +4557,7 @@ "downloadUseAlbumArtistForFoldersTrackSubtitle": "Dossier nommé d'après la balise « Artiste » de la piste", "storeSearch": "Recherche d'extensions...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "aboutTelegramChat": "Communauté Telegram", "lyricsModeBoth": "Les deux", @@ -5883,5 +5883,144 @@ "extensionsSearchProviderDescription": "Choisissez le service que vous souhaitez utiliser pour rechercher des morceaux", "albumFolderAlbumOnly": "Album uniquement", "nowPlayingOpenInExternalPlayer": "Ouvrir dans un lecteur externe", - "cueSplitButton": "Diviser en pistes" + "cueSplitButton": "Diviser en pistes", + "updateRequiredTitle": "Mise à jour requise", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "Cette version a {count} versions de retard et n'est plus prise en charge. Effectuez la mise à jour pour continuer à utiliser l'application.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "appearanceHeroAnimations": "Animations des héros", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Des fenêtres contextuelles apparaissent entre les écrans, par exemple lors de l'ouverture du lecteur", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, + "settingsConcurrentDownloads": "Téléchargements simultanés", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Le téléchargement simultané de plusieurs titres est plus rapide, mais certains fournisseurs peuvent limiter le débit des requêtes parallèles.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 titre à la fois", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Jusqu'à {count} titres à la fois", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryPlaybackNormalization": "Normalisation du volume", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Équilibrer le volume entre les morceaux à l'aide des balises ReplayGain ou R128, lorsqu'elles sont présentes", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Cache d'analyse audio", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Spectrogrammes et résultats d'analyse enregistrés. Réanalyse prévue lors de la prochaine ouverture.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, + "trackConvertKeepOriginal": "Conserver le fichier d'origine", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Ajoutez le fichier converti en tant qu'entrée distincte dans la bibliothèque", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, + "trackConvertConfirmKeepOriginal": "Convertir du format {sourceFormat} au format {targetFormat} ?\n\nLe fichier d'origine sera conservé et le fichier converti sera ajouté en tant qu'entrée distincte dans la bibliothèque.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmKeepOriginal": "Convertir {count} {count, plural, =1{titre} other{titres}} au format {format} ?\n\nLes fichiers d'origine seront conservés et les fichiers convertis seront ajoutés sous forme d'entrées distinctes dans la bibliothèque.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadFolderAccessLostTitle": "Accès au dossier de téléchargement perdu", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Les téléchargements échoueront tant que vous n'aurez pas resélectionné le dossier", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Sélectionner à nouveau le dossier", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "Autorisation SAF non valide ou révoquée. Veuillez reconfigurer l'emplacement de téléchargement dans les Paramètres.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Accès au dossier de téléchargement perdu. Veuillez sélectionner à nouveau votre dossier de téléchargement dans les Paramètres.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, + "notifVerificationRequiredTitle": "Vérification requise", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Ouvrez l'application pour terminer la vérification et reprendre les téléchargements", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, + "downloadDeduplicationWithQualityVariants": "Les fichiers existants correspondant à la qualité sélectionnée seront ignorés", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, + "downloadQualityVariants": "Autoriser différentes versions de qualité", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Ajouter la qualité sélectionnée au nom du fichier et conserver chaque version dans l'historique des téléchargements", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Télécharger une autre version de qualité", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, + "queueCheckingDownloadSession": "Vérification de la session de téléchargement...", + "queueResolvingDownloadMetadata": "Récupération des métadonnées du morceau...", + "queueResolvingDownloadStream": "Préparation du flux audio...", + "queueWaitingForVerification": "En attente de vérification...", + "queueResumingAfterVerification": "Reprise après vérification..." } diff --git a/lib/l10n/arb/app_id.arb b/lib/l10n/arb/app_id.arb index 271768d4..ed75d396 100644 --- a/lib/l10n/arb/app_id.arb +++ b/lib/l10n/arb/app_id.arb @@ -143,7 +143,7 @@ "description": "Share button tooltip" }, "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "extensionsInstallButton": "Pasang Ekstensi", "@extensionsInstallButton": { @@ -317,7 +317,7 @@ }, "optionsExtensionStore": "Repositori Ekstensi", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", "@libraryDownloadsHistoryExcluded": { @@ -459,7 +459,7 @@ }, "storeFilterDownload": "Unduhan", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "@collectionAddToPlaylist": { "description": "Action to add a track to user playlist" @@ -1151,7 +1151,7 @@ }, "storeFilterMetadata": "Metadata", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "shareSheetCopyLink": "Copy Link", "errorRateLimitedMessage": "Terlalu banyak permintaan. Harap tunggu sebentar sebelum mencari lagi.", @@ -1732,7 +1732,7 @@ }, "storeFilterUtility": "Utilitas", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "collectionAddedToPlaylist": "Added to \"{playlistName}\"", "@collectionAddedToPlaylist": { @@ -1808,7 +1808,7 @@ "@regionCountryDE": { "description": "Country name for SongLink region picker" }, - "optionsAutoFallback": "Cadangan Otomatis", + "optionsAutoFallback": "Layanan Cadangan", "@optionsAutoFallback": { "description": "Auto-retry with other services" }, @@ -3328,7 +3328,7 @@ }, "libraryPlayback": "Playback", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "aboutApp": "Aplikasi", "@aboutApp": { @@ -3348,7 +3348,7 @@ "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", "storeFilterIntegration": "Integrasi", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "@lyricsProvidersAtLeastOne": { "description": "Snackbar when user tries to disable the last enabled provider" @@ -3538,7 +3538,7 @@ }, "storeTitle": "Repositori Ekstensi", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "libraryCleared": "Library cleared", "@libraryCleared": { @@ -3853,7 +3853,7 @@ }, "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "extensionPostProcessing": "Pasca-Pemrosesan", "@searchTracks": { @@ -4444,7 +4444,7 @@ "appName": "SpotiFLAC Mobile", "storeRepoDialogCurrent": "Repositori saat ini:", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "@trackLyrics": { "description": "Tab title - lyrics" @@ -4557,7 +4557,7 @@ "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "storeSearch": "Cari ekstensi...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "aboutTelegramChat": "Komunitas Telegram", "lyricsModeBoth": "Keduanya", @@ -4978,7 +4978,7 @@ "@cueSplitButton": { "description": "Button text to start CUE splitting" }, - "appearanceHistoryView": "Tampilan Riwayat", + "appearanceHistoryView": "Gaya Tampilan Histori", "audioAnalysisSampleRate": "Sample Rate", "@settingsCache": { "description": "Settings menu item - cache management" @@ -5936,5 +5936,91 @@ "downloadDeduplicationWithQualityVariants": "File yang sudah ada pada kualitas yang dipilih akan dilewati", "@downloadDeduplicationWithQualityVariants": { "description": "Subtitle deduplikasi ketika versi kualitas terpisah diizinkan" + }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" } } diff --git a/lib/l10n/arb/app_ja.arb b/lib/l10n/arb/app_ja.arb index df6b9e98..e9eb7c9d 100644 --- a/lib/l10n/arb/app_ja.arb +++ b/lib/l10n/arb/app_ja.arb @@ -143,7 +143,7 @@ "description": "Share button tooltip" }, "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "extensionsInstallButton": "拡張をインストール", "@extensionsInstallButton": { @@ -317,7 +317,7 @@ }, "optionsExtensionStore": "Extension Repo", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", "@libraryDownloadsHistoryExcluded": { @@ -459,7 +459,7 @@ }, "storeFilterDownload": "ダウンロード", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "@collectionAddToPlaylist": { "description": "Action to add a track to user playlist" @@ -1151,7 +1151,7 @@ }, "storeFilterMetadata": "メタデータ", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "shareSheetCopyLink": "Copy Link", "errorRateLimitedMessage": "Too many requests. Please wait a moment before searching again.", @@ -1732,7 +1732,7 @@ }, "storeFilterUtility": "ユーティリティ", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "collectionAddedToPlaylist": "Added to \"{playlistName}\"", "@collectionAddedToPlaylist": { @@ -3328,7 +3328,7 @@ }, "libraryPlayback": "Playback", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "aboutApp": "アプリ", "@aboutApp": { @@ -3348,7 +3348,7 @@ "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", "storeFilterIntegration": "統合", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "@lyricsProvidersAtLeastOne": { "description": "Snackbar when user tries to disable the last enabled provider" @@ -3538,7 +3538,7 @@ }, "storeTitle": "Extension Repo", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "libraryCleared": "Library cleared", "@libraryCleared": { @@ -3853,7 +3853,7 @@ }, "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "extensionPostProcessing": "ポストプロセス", "@searchTracks": { @@ -4444,7 +4444,7 @@ "appName": "SpotiFLAC Mobile", "storeRepoDialogCurrent": "Current repository:", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "@trackLyrics": { "description": "Tab title - lyrics" @@ -4557,7 +4557,7 @@ "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "storeSearch": "拡張を検索...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "aboutTelegramChat": "Telegram コミュニティ", "lyricsModeBoth": "両方", @@ -5883,5 +5883,144 @@ "extensionsSearchProviderDescription": "トラックの検索に使用するサービスを選択してください", "albumFolderAlbumOnly": "アルバムのみ", "nowPlayingOpenInExternalPlayer": "Open in external player", - "cueSplitButton": "Split into Tracks" + "cueSplitButton": "Split into Tracks", + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification..." } diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb new file mode 100644 index 00000000..0329b22f --- /dev/null +++ b/lib/l10n/arb/app_ko.arb @@ -0,0 +1,6026 @@ +{ + "@@locale": "ko", + "@@last_modified": "2026-04-28", + "appName": "SpotiFLAC Mobile", + "@appName": { + "description": "App name - DO NOT TRANSLATE" + }, + "navHome": "홈", + "@navHome": { + "description": "Bottom navigation - Home tab" + }, + "navLibrary": "라이브러리", + "@navLibrary": { + "description": "Bottom navigation - Library tab" + }, + "navSettings": "설정", + "@navSettings": { + "description": "Bottom navigation - Settings tab" + }, + "navStore": "레포", + "@navStore": { + "description": "Bottom navigation - Extension repo tab" + }, + "homeTitle": "홈", + "@homeTitle": { + "description": "Home screen title" + }, + "homeSubtitle": "지원되는 URL을 붙여넣거나, 이름으로 검색하세요", + "@homeSubtitle": { + "description": "Subtitle shown below search box" + }, + "homeEmptyTitle": "아직 검색 제공자가 없음", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "계속하려면 확장 프로그램을 설치하세요", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "homeSupports": "지원 항목: 트랙, 앨범, 재생목록, 아티스트 URL", + "@homeSupports": { + "description": "Info text about supported URL types" + }, + "homeRecent": "최근 기록", + "@homeRecent": { + "description": "Section header for recent searches" + }, + "historyFilterAll": "모두", + "@historyFilterAll": { + "description": "Filter chip - show all items" + }, + "historyFilterAlbums": "앨범", + "@historyFilterAlbums": { + "description": "Filter chip - show albums only" + }, + "historyFilterSingles": "싱글", + "@historyFilterSingles": { + "description": "Filter chip - show singles only" + }, + "historySearchHint": "기록 검색...", + "@historySearchHint": { + "description": "Search bar placeholder in history" + }, + "settingsTitle": "설정", + "@settingsTitle": { + "description": "Settings screen title" + }, + "settingsDownload": "다운로드", + "@settingsDownload": { + "description": "Settings section - download options" + }, + "settingsAppearance": "디자인", + "@settingsAppearance": { + "description": "Settings section - visual customization" + }, + "settingsExtensions": "확장 프로그램", + "@settingsExtensions": { + "description": "Settings section - extension management" + }, + "settingsAbout": "정보", + "@settingsAbout": { + "description": "Settings section - app info" + }, + "downloadTitle": "다운로드", + "@downloadTitle": { + "description": "Download settings page title" + }, + "downloadAskQualitySubtitle": "다운로드를 할 때마다 음질을 선택하도록 합니다", + "@downloadAskQualitySubtitle": { + "description": "Subtitle for ask quality toggle" + }, + "downloadFilenameFormat": "파일 이름 형식", + "@downloadFilenameFormat": { + "description": "Setting for output filename pattern" + }, + "downloadSingleFilenameFormat": "싱글 파일 이름 형식", + "@downloadSingleFilenameFormat": { + "description": "Setting for output filename pattern for singles/EPs" + }, + "downloadSingleFilenameFormatDescription": "싱글 및 EP용 파일 이름 패턴입니다. 앨범 형식과 동일한 태그를 사용합니다", + "@downloadSingleFilenameFormatDescription": { + "description": "Subtitle description for single filename format setting" + }, + "downloadFolderOrganization": "폴더 분류 형식", + "@downloadFolderOrganization": { + "description": "Title of the folder organization picker bottom sheet" + }, + "appearanceTitle": "디자인", + "@appearanceTitle": { + "description": "Appearance settings page title" + }, + "appearanceThemeSystem": "시스템", + "@appearanceThemeSystem": { + "description": "Follow system theme" + }, + "appearanceThemeLight": "밝은", + "@appearanceThemeLight": { + "description": "Light theme" + }, + "appearanceThemeDark": "어두운", + "@appearanceThemeDark": { + "description": "Dark theme" + }, + "appearanceDynamicColor": "동적 색상", + "@appearanceDynamicColor": { + "description": "Material You dynamic colors" + }, + "appearanceDynamicColorSubtitle": "배경 화면을 참고하여 강조 색상이 지정됩니다", + "@appearanceDynamicColorSubtitle": { + "description": "Subtitle for dynamic color" + }, + "appearanceHistoryView": "기록 정렬 방식", + "@appearanceHistoryView": { + "description": "Layout style for history" + }, + "appearanceHistoryViewList": "리스트", + "@appearanceHistoryViewList": { + "description": "List layout option" + }, + "appearanceHistoryViewGrid": "그리드", + "@appearanceHistoryViewGrid": { + "description": "Grid layout option" + }, + "optionsPrimaryProvider": "기본 제공자", + "@optionsPrimaryProvider": { + "description": "Main search provider setting" + }, + "optionsPrimaryProviderSubtitle": "트랙 또는 앨범 이름으로 검색하는 데 사용되는 서비스", + "@optionsPrimaryProviderSubtitle": { + "description": "Subtitle for primary provider" + }, + "optionsUsingExtension": "확장 프로그램 사용: {extensionName}", + "@optionsUsingExtension": { + "description": "Shows active extension name", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "optionsDefaultSearchTab": "기본 검색 탭", + "@optionsDefaultSearchTab": { + "description": "Title for the preferred default search tab setting" + }, + "optionsDefaultSearchTabSubtitle": "새 검색 결과를 표시할 탭을 먼저 선택하세요", + "@optionsDefaultSearchTabSubtitle": { + "description": "Subtitle for the preferred default search tab setting" + }, + "optionsAutoFallback": "자동 대체", + "@optionsAutoFallback": { + "description": "Auto-retry with other services" + }, + "optionsAutoFallbackSubtitle": "다운로드가 실패한 경우에 다른 서비스를 사용합니다", + "@optionsAutoFallbackSubtitle": { + "description": "Subtitle for auto fallback" + }, + "optionsEmbedLyrics": "가사 삽입", + "@optionsEmbedLyrics": { + "description": "Embed lyrics in audio files" + }, + "optionsEmbedLyricsSubtitle": "다운로드된 트랙과 함께 동기화된 가사를 저장합니다", + "@optionsEmbedLyricsSubtitle": { + "description": "Subtitle for embed lyrics" + }, + "optionsMaxQualityCover": "고품질 표지 이미지", + "@optionsMaxQualityCover": { + "description": "Download highest quality album art" + }, + "optionsMaxQualityCoverSubtitle": "최고 해상도의 표지 이미지를 다운로드", + "@optionsMaxQualityCoverSubtitle": { + "description": "Subtitle for max quality cover" + }, + "optionsReplayGain": "리플레이게인", + "@optionsReplayGain": { + "description": "Title for ReplayGain setting toggle" + }, + "optionsReplayGainSubtitleOn": "음량 스캔 및 리플레이게인 태그 삽입 (EBU R128)", + "@optionsReplayGainSubtitleOn": { + "description": "Subtitle when ReplayGain is enabled" + }, + "optionsReplayGainSubtitleOff": "비활성화됨: 음량 정규화 태그 없음", + "@optionsReplayGainSubtitleOff": { + "description": "Subtitle when ReplayGain is disabled" + }, + "trackReplayGain": "리플레이게인 다시 스캔", + "@trackReplayGain": { + "description": "Three-dot menu option to scan loudness and write ReplayGain tags" + }, + "trackReplayGainScanning": "음량을 분석하는 중...", + "@trackReplayGainScanning": { + "description": "Snackbar/progress message while scanning ReplayGain for a single track" + }, + "trackReplayGainSuccess": "리플레이게인 태그가 추가됨", + "@trackReplayGainSuccess": { + "description": "Snackbar message after ReplayGain tags written for a single track" + }, + "trackReplayGainFailed": "리플레이게인 태그 추가 실패", + "@trackReplayGainFailed": { + "description": "Snackbar message when ReplayGain scan/write fails" + }, + "selectionReplayGainCount": "리플레이게인 ({count})", + "@selectionReplayGainCount": { + "description": "Batch selection action button label for ReplayGain", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainBatchConfirmTitle": "리플레이게인 추가", + "@replayGainBatchConfirmTitle": { + "description": "Title of the batch ReplayGain confirmation dialog" + }, + "replayGainBatchConfirmMessage": "음량을 분석하고 {count} 개의 트랙에 리플레이게인 태그를 추가하시겠습니까?", + "@replayGainBatchConfirmMessage": { + "description": "Message of the batch ReplayGain confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainBatchAnalyzing": "리플레이게인을 분석하는 중...", + "@replayGainBatchAnalyzing": { + "description": "Progress dialog title while batch scanning ReplayGain" + }, + "replayGainBatchSuccess": "{total} 개의 트랙 중 {success} 개에 리플레이게인이 추가됨", + "@replayGainBatchSuccess": { + "description": "Snackbar after batch ReplayGain completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "optionsArtistTagMode": "아티스트 태그 모드", + "@optionsArtistTagMode": { + "description": "Setting title for how artist metadata is written into files" + }, + "optionsArtistTagModeDescription": "여러 아티스트를 내장 태그에 작성하는 방법을 선택하세요", + "@optionsArtistTagModeDescription": { + "description": "Bottom-sheet description for artist tag mode setting" + }, + "optionsArtistTagModeJoined": "단일 결합 값", + "@optionsArtistTagModeJoined": { + "description": "Artist tag mode option that joins multiple artists into one value" + }, + "optionsArtistTagModeJoinedSubtitle": "플레이어 호환성을 최대화하려면 '아티스트 A, 아티스트 B'와 같이 하나의 아티스트 값을 입력하세요", + "@optionsArtistTagModeJoinedSubtitle": { + "description": "Subtitle for joined artist tag mode" + }, + "optionsArtistTagModeSplitVorbis": "FLAC/Opus용 태그 분할", + "@optionsArtistTagModeSplitVorbis": { + "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" + }, + "optionsArtistTagModeSplitVorbisSubtitle": "FLAC 및 Opus의 경우 아티스트당 하나의 아티스트 태그를 작성하세요. MP3 및 M4A는 병합된 상태로 유지됩니다", + "@optionsArtistTagModeSplitVorbisSubtitle": { + "description": "Subtitle for split Vorbis artist tag mode" + }, + "optionsExtensionStore": "확장 프로그램 레포", + "@optionsExtensionStore": { + "description": "Show/hide repo tab" + }, + "optionsExtensionStoreSubtitle": "하단바에서 레포 탭 표시", + "@optionsExtensionStoreSubtitle": { + "description": "Subtitle for extension repo toggle" + }, + "optionsCheckUpdates": "업데이트 확인", + "@optionsCheckUpdates": { + "description": "Auto update check toggle" + }, + "optionsCheckUpdatesSubtitle": "새 버전이 출시되면 알림", + "@optionsCheckUpdatesSubtitle": { + "description": "Subtitle for update check" + }, + "optionsUpdateChannel": "업데이트 채널", + "@optionsUpdateChannel": { + "description": "Stable vs preview releases" + }, + "optionsUpdateChannelStable": "안정 버전만 받기", + "@optionsUpdateChannelStable": { + "description": "Only stable updates" + }, + "optionsUpdateChannelPreview": "베타 버전을 받기", + "@optionsUpdateChannelPreview": { + "description": "Include beta/preview updates" + }, + "optionsUpdateChannelWarning": "베타 버전은 불안정할 수 있습니다", + "@optionsUpdateChannelWarning": { + "description": "Warning about preview channel" + }, + "optionsClearHistory": "다운로드 기록 지우기", + "@optionsClearHistory": { + "description": "Delete all download history" + }, + "optionsClearHistorySubtitle": "기록에서 모든 다운로드된 트랙을 제거합니다", + "@optionsClearHistorySubtitle": { + "description": "Subtitle for clear history" + }, + "optionsDetailedLogging": "상세 로깅", + "@optionsDetailedLogging": { + "description": "Enable verbose logs for debugging" + }, + "optionsDetailedLoggingOn": "상세한 로그가 기록되고 있습니다", + "@optionsDetailedLoggingOn": { + "description": "Status when logging enabled" + }, + "optionsDetailedLoggingOff": "버그 보고서 활성화", + "@optionsDetailedLoggingOff": { + "description": "Status when logging disabled" + }, + "extensionsTitle": "확장 프로그램", + "@extensionsTitle": { + "description": "Extensions page title" + }, + "extensionsDisabled": "비활성화됨", + "@extensionsDisabled": { + "description": "Extension status - inactive" + }, + "extensionsVersion": "버전 {version}", + "@extensionsVersion": { + "description": "Extension version display", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "extensionsUninstall": "제거", + "@extensionsUninstall": { + "description": "Uninstall extension button" + }, + "storeTitle": "확장 프로그램 레포", + "@storeTitle": { + "description": "Repo screen title" + }, + "storeSearch": "확장 프로그램 검색...", + "@storeSearch": { + "description": "Repo search placeholder" + }, + "storeInstall": "설치", + "@storeInstall": { + "description": "Install extension button" + }, + "storeInstalled": "설치됨", + "@storeInstalled": { + "description": "Already installed badge" + }, + "storeUpdate": "업데이트", + "@storeUpdate": { + "description": "Update available button" + }, + "aboutTitle": "정보", + "@aboutTitle": { + "description": "About page title" + }, + "aboutContributors": "개발에 힘써주신 분들", + "@aboutContributors": { + "description": "Section for contributors" + }, + "aboutMobileDeveloper": "모바일 버전 개발자", + "@aboutMobileDeveloper": { + "description": "Role description for mobile dev" + }, + "aboutOriginalCreator": "SpotiFLAC 오리지널 개발자", + "@aboutOriginalCreator": { + "description": "Role description for original creator" + }, + "aboutLogoArtist": "아름다운 로고를 만들어주신 재능 있는 아티스트!", + "@aboutLogoArtist": { + "description": "Role description for logo artist" + }, + "aboutTranslators": "번역에 도움주신 분들", + "@aboutTranslators": { + "description": "Section for translators" + }, + "aboutSpecialThanks": "특별히 감사드리는 분들", + "@aboutSpecialThanks": { + "description": "Section for special thanks" + }, + "aboutLinks": "링크", + "@aboutLinks": { + "description": "Section for external links" + }, + "aboutMobileSource": "모바일 소스 코드", + "@aboutMobileSource": { + "description": "Link to mobile GitHub repo" + }, + "aboutPCSource": "PC 소스 코드", + "@aboutPCSource": { + "description": "Link to PC GitHub repo" + }, + "aboutKeepAndroidOpen": "Keep Android Open", + "@aboutKeepAndroidOpen": { + "description": "Link to Keep Android Open campaign website" + }, + "aboutReportIssue": "문제 신고", + "@aboutReportIssue": { + "description": "Link to report bugs" + }, + "aboutReportIssueSubtitle": "발생하는 모든 문제를 신고해 주세요", + "@aboutReportIssueSubtitle": { + "description": "Subtitle for report issue" + }, + "aboutFeatureRequest": "기능 요청", + "@aboutFeatureRequest": { + "description": "Link to suggest features" + }, + "aboutFeatureRequestSubtitle": "앱의 새 기능을 제안해 주세요", + "@aboutFeatureRequestSubtitle": { + "description": "Subtitle for feature request" + }, + "aboutTelegramChannel": "텔레그램 채널", + "@aboutTelegramChannel": { + "description": "Link to Telegram channel" + }, + "aboutTelegramChannelSubtitle": "공지 및 업데이트 안내", + "@aboutTelegramChannelSubtitle": { + "description": "Subtitle for Telegram channel" + }, + "aboutTelegramChat": "텔레그램 커뮤니티", + "@aboutTelegramChat": { + "description": "Link to Telegram chat group" + }, + "aboutTelegramChatSubtitle": "다른 이용자와 소통", + "@aboutTelegramChatSubtitle": { + "description": "Subtitle for Telegram chat" + }, + "aboutSocial": "소셜 네트워크", + "@aboutSocial": { + "description": "Section for social links" + }, + "aboutApp": "앱 정보", + "@aboutApp": { + "description": "Section for app info" + }, + "aboutVersion": "버전", + "@aboutVersion": { + "description": "Version info label" + }, + "aboutBinimumDesc": "QQDL 및 HiFi API 개발자입니다. 이 프로젝트는 무손실 다운로드 지원을 형성하는 데 도움을 주셨습니다", + "@aboutBinimumDesc": { + "description": "Credit description for binimum" + }, + "aboutSachinsenalDesc": "HiFi 프로젝트의 원작자이자, 무손실 음원 소스 연동 기능의 토대를 구축한 개발자입니다", + "@aboutSachinsenalDesc": { + "description": "Credit description for sachinsenal0x64" + }, + "aboutSjdonadoDesc": "I Don't Have Spotify(IDHS) 개발자입니다. 위급 상황 발생 시 해결해 주는 대체 링크 해결 도구를 만들었습니다!", + "@aboutSjdonadoDesc": { + "description": "Credit description for sjdonado" + }, + "aboutAppDescription": "음악 메타데이터를 검색하고\\n확장 프로그램을 관리하고\\n라이브러리를 정리하세요", + "@aboutAppDescription": { + "description": "App description in header card" + }, + "artistAlbums": "앨범", + "@artistAlbums": { + "description": "Section header for artist albums" + }, + "artistSingles": "싱글 및 EP", + "@artistSingles": { + "description": "Section header for singles/EPs" + }, + "artistCompilations": "컴필레이션", + "@artistCompilations": { + "description": "Section header for compilations" + }, + "artistPopular": "인기", + "@artistPopular": { + "description": "Section header for popular/top tracks" + }, + "artistMonthlyListeners": "월별 청취자 {count}", + "@artistMonthlyListeners": { + "description": "Monthly listener count display", + "placeholders": { + "count": { + "type": "String", + "description": "Formatted listener count" + } + } + }, + "trackMetadataService": "제공자", + "@trackMetadataService": { + "description": "Metadata field - download service used" + }, + "trackMetadataPlay": "재생", + "@trackMetadataPlay": { + "description": "Action button - play track" + }, + "trackMetadataShare": "공유", + "@trackMetadataShare": { + "description": "Action button - share track" + }, + "trackMetadataDelete": "삭제", + "@trackMetadataDelete": { + "description": "Action button - delete track" + }, + "setupGrantPermission": "권한을 부여해 주세요", + "@setupGrantPermission": { + "description": "Button to request permission" + }, + "setupSkip": "다음에 할래요", + "@setupSkip": { + "description": "Skip current step button" + }, + "setupStorageAccessRequired": "저장소 접근 권한 필요", + "@setupStorageAccessRequired": { + "description": "Title when storage access needed" + }, + "setupStorageAccessMessageAndroid11": "Android 11 이상 버전에서는 선택한 다운로드 폴더에 파일을 저장하려면 '모든 파일 접근' 권한이 필요합니다", + "@setupStorageAccessMessageAndroid11": { + "description": "Android 11+ specific explanation" + }, + "setupOpenSettings": "설정 열기", + "@setupOpenSettings": { + "description": "Button to open system settings" + }, + "setupPermissionDeniedMessage": "권한이 거부되었습니다. 계속하려면 모든 권한을 허용해 주세요", + "@setupPermissionDeniedMessage": { + "description": "Error when permission denied" + }, + "setupPermissionRequired": "''{permissionType}'' 권한 필요", + "@setupPermissionRequired": { + "description": "Generic permission required title", + "placeholders": { + "permissionType": { + "type": "String", + "description": "Type of permission (Storage/Notification)" + } + } + }, + "setupPermissionRequiredMessage": "최상의 사용 경험을 위해 ''{permissionType}'' 권한이 필요합니다. 설정에서 나중에 변경할 수 있습니다", + "@setupPermissionRequiredMessage": { + "description": "Generic permission required message", + "placeholders": { + "permissionType": { + "type": "String" + } + } + }, + "setupUseDefaultFolder": "기본 폴더를 사용하시겠습니까?", + "@setupUseDefaultFolder": { + "description": "Dialog title for default folder" + }, + "setupNoFolderSelected": "선택된 폴더가 없습니다. 기본 음악 폴더를 사용하시겠습니까?", + "@setupNoFolderSelected": { + "description": "Prompt when no folder selected" + }, + "setupUseDefault": "기본값 사용", + "@setupUseDefault": { + "description": "Button to use default folder" + }, + "setupDownloadLocationTitle": "다운로드 경로", + "@setupDownloadLocationTitle": { + "description": "Download location dialog title" + }, + "setupDownloadLocationIosMessage": "iOS에서는 다운로드된 파일이 앱의 문서 폴더에 저장됩니다. 파일 앱을 통해 해당 파일에 접근할 수 있습니다", + "@setupDownloadLocationIosMessage": { + "description": "iOS-specific folder info" + }, + "setupAppDocumentsFolder": "앱 문서 폴더", + "@setupAppDocumentsFolder": { + "description": "iOS documents folder option" + }, + "setupAppDocumentsFolderSubtitle": "권장 사항 - 파일 앱을 통해 접근 가능", + "@setupAppDocumentsFolderSubtitle": { + "description": "Subtitle for documents folder" + }, + "setupChooseFromFiles": "파일 탐색기에서 선택", + "@setupChooseFromFiles": { + "description": "iOS file picker option" + }, + "setupChooseFromFilesSubtitle": "iCloud 또는 다른 위치를 선택하세요", + "@setupChooseFromFilesSubtitle": { + "description": "Subtitle for file picker" + }, + "setupIosEmptyFolderWarning": "iOS 제한 사항: 빈 폴더는 선택할 수 없습니다. 파일이 하나 이상 있는 폴더를 선택하세요", + "@setupIosEmptyFolderWarning": { + "description": "iOS folder selection warning" + }, + "setupIcloudNotSupported": "iCloud Drive는 지원되지 않습니다. 앱의 문서 폴더를 사용해 주세요", + "@setupIcloudNotSupported": { + "description": "Error when user selects iCloud Drive on iOS" + }, + "setupDownloadInFlac": "Spotify 음악을 FLAC 형식으로 다운로드하세요", + "@setupDownloadInFlac": { + "description": "App tagline in setup" + }, + "setupStorageGranted": "저장소 접근 권한이 부여되었습니다!", + "@setupStorageGranted": { + "description": "Success message for storage permission" + }, + "setupStorageRequired": "저장소 접근 권한 필요", + "@setupStorageRequired": { + "description": "Title when storage permission needed" + }, + "setupStorageDescription": "SpotiFLAC은 다운로드된 음악 파일을 저장하기 위해 저장소 접근 권한이 필요합니다", + "@setupStorageDescription": { + "description": "Explanation for storage permission" + }, + "setupNotificationGranted": "알림 권한이 부여되었습니다!", + "@setupNotificationGranted": { + "description": "Success message for notification permission" + }, + "setupNotificationEnable": "알림 활성화", + "@setupNotificationEnable": { + "description": "Button to enable notifications" + }, + "setupFolderChoose": "다운로드 폴더를 선택하세요", + "@setupFolderChoose": { + "description": "Button to choose folder" + }, + "setupFolderDescription": "다운로드된 음악 파일이 저장될 폴더를 선택하세요", + "@setupFolderDescription": { + "description": "Explanation for folder selection" + }, + "setupSelectFolder": "폴더 선택", + "@setupSelectFolder": { + "description": "Button to select folder" + }, + "setupEnableNotifications": "알림 활성화", + "@setupEnableNotifications": { + "description": "Button to enable notifications" + }, + "setupNotificationBackgroundDescription": "알림으로 다운로드 진행 상황을 확인하세요. 앱이 백그라운드에서 실행 중일 때 다운로드 상태와 완료 여부를 확인할 수 있습니다", + "@setupNotificationBackgroundDescription": { + "description": "Detailed notification explanation" + }, + "setupSkipForNow": "다음에 할래요", + "@setupSkipForNow": { + "description": "Skip button text" + }, + "setupNext": "다음", + "@setupNext": { + "description": "Next button text" + }, + "setupGetStarted": "시작하기", + "@setupGetStarted": { + "description": "Final setup button" + }, + "setupAllowAccessToManageFiles": "다음 화면에서 '모든 파일 관리 권한 허용'을 활성화해 주세요", + "@setupAllowAccessToManageFiles": { + "description": "Instruction for file access permission" + }, + "setupLanguageTitle": "언어 선택", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "앱에서 사용할 언어를 선택하세요\\n나중에 설정에서 변경할 수 있습니다", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "시스템 기본값", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "dialogCancel": "취소", + "@dialogCancel": { + "description": "Dialog button - cancel action" + }, + "dialogSave": "저장", + "@dialogSave": { + "description": "Dialog button - save changes" + }, + "dialogDelete": "삭제", + "@dialogDelete": { + "description": "Dialog button - delete item" + }, + "dialogRetry": "다시 시도", + "@dialogRetry": { + "description": "Dialog button - retry action" + }, + "dialogClear": "지우기", + "@dialogClear": { + "description": "Dialog button - clear items" + }, + "dialogDone": "완료", + "@dialogDone": { + "description": "Dialog button - action completed" + }, + "dialogImport": "불러오기", + "@dialogImport": { + "description": "Dialog button - import data" + }, + "dialogDownload": "다운로드", + "@dialogDownload": { + "description": "Confirm button in Download All dialog" + }, + "previewPlay": "미리듣기 재생", + "@previewPlay": { + "description": "Tooltip for the button that plays a short track preview snippet" + }, + "previewStop": "미리듣기 중지", + "@previewStop": { + "description": "Tooltip for the button that stops the playing track preview snippet" + }, + "previewUnavailable": "미리듣기를 사용할 수 없음", + "@previewUnavailable": { + "description": "Snackbar shown when a track preview snippet cannot be played" + }, + "dialogDiscard": "폐기", + "@dialogDiscard": { + "description": "Dialog button - discard changes" + }, + "dialogRemove": "제거", + "@dialogRemove": { + "description": "Dialog button - remove item" + }, + "dialogUninstall": "삭제", + "@dialogUninstall": { + "description": "Dialog button - uninstall extension" + }, + "dialogDiscardChanges": "변경 사항 폐기", + "@dialogDiscardChanges": { + "description": "Dialog title - unsaved changes warning" + }, + "dialogUnsavedChanges": "저장되지 않은 변경 사항이 있습니다. 폐기하시겠습니까?", + "@dialogUnsavedChanges": { + "description": "Dialog message - unsaved changes" + }, + "dialogClearAll": "모두 지우기", + "@dialogClearAll": { + "description": "Dialog title - clear all items" + }, + "dialogRemoveExtension": "확장 프로그램 제거", + "@dialogRemoveExtension": { + "description": "Dialog title - uninstall extension" + }, + "dialogRemoveExtensionMessage": "이 확장 프로그램을 제거하시겠습니까? 이 작업은 되돌릴 수 없습니다", + "@dialogRemoveExtensionMessage": { + "description": "Dialog message - uninstall confirmation" + }, + "dialogUninstallExtension": "확장 프로그램을 제거하시겠습니까?", + "@dialogUninstallExtension": { + "description": "Dialog title - uninstall extension" + }, + "dialogUninstallExtensionMessage": "''{extensionName}''을 제거하시겠습니까?", + "@dialogUninstallExtensionMessage": { + "description": "Dialog message - uninstall specific extension", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "dialogClearHistoryTitle": "기록 지우기", + "@dialogClearHistoryTitle": { + "description": "Dialog title - clear download history" + }, + "dialogClearHistoryMessage": "모든 다운로드 기록을 지우시겠습니까? 이 작업은 되돌릴 수 없습니다", + "@dialogClearHistoryMessage": { + "description": "Dialog message - clear history confirmation" + }, + "dialogDeleteSelectedTitle": "선택 항목 삭제", + "@dialogDeleteSelectedTitle": { + "description": "Dialog title - delete selected items" + }, + "dialogDeleteSelectedMessage": "기록에서 {count} 개의 {count, plural, =1{트랙} other{트랙}}을 삭제하시겠습니까?\n\n저장소에서도 파일이 삭제됩니다", + "@dialogDeleteSelectedMessage": { + "description": "Dialog message - delete selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dialogImportPlaylistTitle": "재생목록 가져오기", + "@dialogImportPlaylistTitle": { + "description": "Dialog title - import CSV playlist" + }, + "dialogImportPlaylistMessage": "CSV 파일에서 {count} 개의 트랙을 찾았습니다. 다운로드 목록에 추가하시겠습니까?", + "csvImportTracks": "CSV 파일의 트랙: {count}", + "@csvImportTracks": { + "description": "Label shown in quality picker for CSV import", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@dialogImportPlaylistMessage": { + "description": "Dialog message - import playlist confirmation", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAddedToQueue": "''{trackName}''가 다운로드 목록에 추가됨", + "@snackbarAddedToQueue": { + "description": "Snackbar - track added to download queue", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarAddedTracksToQueue": "다운로드 목록에 {count} 개의 트랙이 추가됨", + "@snackbarAddedTracksToQueue": { + "description": "Snackbar - multiple tracks added to queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAlreadyDownloaded": "''{trackName}''은 이미 다운로드되어 있음", + "@snackbarAlreadyDownloaded": { + "description": "Snackbar - track already exists", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarAlreadyInLibrary": "라이브러리에 ''{trackName}''이 이미 존재함", + "@snackbarAlreadyInLibrary": { + "description": "Snackbar - track already exists in local library", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarHistoryCleared": "기록 지워짐", + "@snackbarHistoryCleared": { + "description": "Snackbar - history deleted" + }, + "snackbarDeletedTracks": "{count} 개의 {count, plural, =1{트랙} other{트랙}}이 삭제됨", + "@snackbarDeletedTracks": { + "description": "Snackbar - tracks deleted", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarCannotOpenFile": "파일을 열 수 없음: {error}", + "@snackbarCannotOpenFile": { + "description": "Snackbar - file open error", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "snackbarViewQueue": "다운로드 목록 보기", + "@snackbarViewQueue": { + "description": "Snackbar action - view download queue" + }, + "snackbarUrlCopied": "{platform} 링크가 클립보드에 저장됨", + "@snackbarUrlCopied": { + "description": "Snackbar - URL copied", + "placeholders": { + "platform": { + "type": "String", + "description": "Platform name (Spotify/Deezer)" + } + } + }, + "snackbarFileNotFound": "파일을 찾을 수 없음", + "@snackbarFileNotFound": { + "description": "Snackbar - file doesn't exist" + }, + "snackbarSelectExtFile": ".spotiflac-ext 파일을 선택하세요", + "@snackbarSelectExtFile": { + "description": "Snackbar - wrong file type selected" + }, + "snackbarProviderPrioritySaved": "제공자 우선순위가 저장됨", + "@snackbarProviderPrioritySaved": { + "description": "Snackbar - provider order saved" + }, + "snackbarMetadataProviderSaved": "메타데이터 제공자 우선순위가 저장됨", + "@snackbarMetadataProviderSaved": { + "description": "Snackbar - metadata provider order saved" + }, + "snackbarExtensionInstalled": "''{extensionName}''이 설치됨", + "@snackbarExtensionInstalled": { + "description": "Snackbar - extension installed successfully", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarExtensionUpdated": "''{extensionName}''이 설치됨", + "@snackbarExtensionUpdated": { + "description": "Snackbar - extension updated successfully", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarFailedToInstall": "확장 프로그램 설치 실패", + "@snackbarFailedToInstall": { + "description": "Snackbar - extension install error" + }, + "snackbarFailedToUpdate": "확장 프로그램 업데이트 실패", + "@snackbarFailedToUpdate": { + "description": "Snackbar - extension update error" + }, + "errorRateLimited": "사용 제한됨", + "@errorRateLimited": { + "description": "Error title - too many requests" + }, + "errorRateLimitedMessage": "요청이 너무 많습니다. 잠시 후 다시 검색해 주세요", + "@errorRateLimitedMessage": { + "description": "Error message - rate limit explanation" + }, + "errorNoTracksFound": "트랙을 찾을 수 없음", + "@errorNoTracksFound": { + "description": "Error - search returned no results" + }, + "searchEmptyResultSubtitle": "다른 키워드를 검색해 보세요", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "errorUrlNotRecognized": "링크를 인식할 수 없음", + "@errorUrlNotRecognized": { + "description": "Error title - URL not handled by any extension or service" + }, + "errorUrlNotRecognizedMessage": "이 링크는 지원되지 않습니다. URL이 올바른지, 호환되는 확장 프로그램이 설치되어 있는지 확인하세요", + "@errorUrlNotRecognizedMessage": { + "description": "Error message - URL not recognized explanation" + }, + "errorUrlFetchFailed": "이 링크에서 콘텐츠를 불러오는 데 실패하였습니다. 다시 시도해 주세요", + "@errorUrlFetchFailed": { + "description": "Error message - generic URL fetch failure" + }, + "errorMissingExtensionSource": "''{item}''을 불러올 수 없음: 확장 소스가 누락됨", + "@errorMissingExtensionSource": { + "description": "Error - extension source not available", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "actionPause": "일시 중지", + "@actionPause": { + "description": "Action button - pause download" + }, + "actionResume": "계속", + "@actionResume": { + "description": "Action button - resume download" + }, + "actionCancel": "취소", + "@actionCancel": { + "description": "Action button - cancel operation" + }, + "actionSelectAll": "모두 선택", + "@actionSelectAll": { + "description": "Action button - select all items" + }, + "actionDeselect": "선택 해제", + "@actionDeselect": { + "description": "Action button - deselect all" + }, + "selectionSelected": "{count} 개 선택됨", + "@selectionSelected": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionAllSelected": "모든 트랙 선택됨", + "@selectionAllSelected": { + "description": "Status - all items selected" + }, + "selectionSelectToDelete": "삭제할 트랙을 선택", + "@selectionSelectToDelete": { + "description": "Placeholder when nothing selected" + }, + "progressFetchingMetadata": "메타데이터를 가져오는 중... {current}/{total}", + "@progressFetchingMetadata": { + "description": "Progress indicator - loading track info", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "progressReadingCsv": "CSV 파일을 읽는 중...", + "@progressReadingCsv": { + "description": "Progress indicator - parsing CSV file" + }, + "searchSongs": "노래", + "@searchSongs": { + "description": "Search result category - songs" + }, + "searchArtists": "아티스트", + "@searchArtists": { + "description": "Search result category - artists" + }, + "searchAlbums": "앨범", + "@searchAlbums": { + "description": "Search result category - albums" + }, + "searchPlaylists": "재생목록", + "@searchPlaylists": { + "description": "Search result category - playlists" + }, + "searchSortTitle": "결과 정렬", + "@searchSortTitle": { + "description": "Bottom sheet title for search sort options" + }, + "searchSortDefault": "기본값", + "@searchSortDefault": { + "description": "Sort option - default API order" + }, + "searchSortTitleAZ": "제목 (오름차순)", + "@searchSortTitleAZ": { + "description": "Sort option - title ascending" + }, + "searchSortTitleZA": "제목 (내림차순)", + "@searchSortTitleZA": { + "description": "Sort option - title descending" + }, + "searchSortArtistAZ": "아티스트 (오름차순)", + "@searchSortArtistAZ": { + "description": "Sort option - artist ascending" + }, + "searchSortArtistZA": "아티스트 (내림차순)", + "@searchSortArtistZA": { + "description": "Sort option - artist descending" + }, + "searchSortDurationShort": "재생시간 (짧은순)", + "@searchSortDurationShort": { + "description": "Sort option - shortest duration first" + }, + "searchSortDurationLong": "재생시간 (긴순)", + "@searchSortDurationLong": { + "description": "Sort option - longest duration first" + }, + "searchSortDateOldest": "발매일자 (오래된순)", + "@searchSortDateOldest": { + "description": "Sort option - oldest release first" + }, + "searchSortDateNewest": "발매일자 (최신순)", + "@searchSortDateNewest": { + "description": "Sort option - newest release first" + }, + "tooltipPlay": "재생", + "@tooltipPlay": { + "description": "Tooltip - play button" + }, + "filenameFormat": "파일 이름 형식", + "@filenameFormat": { + "description": "Setting title - filename pattern" + }, + "filenameShowAdvancedTags": "고급 태그 표시", + "@filenameShowAdvancedTags": { + "description": "Toggle label for showing advanced filename tags" + }, + "filenameShowAdvancedTagsDescription": "트랙 패딩 및 날짜 패턴에 대한 서식 있는 태그를 활성화합니다", + "@filenameShowAdvancedTagsDescription": { + "description": "Description for advanced filename tag toggle" + }, + "folderOrganizationNone": "정리하지 않음", + "@folderOrganizationNone": { + "description": "Folder option - flat structure" + }, + "folderOrganizationByPlaylist": "재생목록별", + "@folderOrganizationByPlaylist": { + "description": "Folder option - playlist folders" + }, + "folderOrganizationByPlaylistSubtitle": "각 재생목록별 별도 폴더", + "@folderOrganizationByPlaylistSubtitle": { + "description": "Subtitle for playlist folder option" + }, + "folderOrganizationByArtist": "아티스트별", + "@folderOrganizationByArtist": { + "description": "Folder option - artist folders" + }, + "folderOrganizationByAlbum": "앨범별", + "@folderOrganizationByAlbum": { + "description": "Folder option - album folders" + }, + "folderOrganizationByArtistAlbum": "아티스트/앨범", + "@folderOrganizationByArtistAlbum": { + "description": "Folder option - nested folders" + }, + "folderOrganizationDescription": "다운로드된 파일을 폴더로 정리", + "@folderOrganizationDescription": { + "description": "Folder organization sheet description" + }, + "folderOrganizationNoneSubtitle": "다운로드 폴더의 모든 파일", + "@folderOrganizationNoneSubtitle": { + "description": "Subtitle for no organization option" + }, + "folderOrganizationByArtistSubtitle": "각 아티스트별 별도 폴더", + "@folderOrganizationByArtistSubtitle": { + "description": "Subtitle for artist folder option" + }, + "folderOrganizationByAlbumSubtitle": "각 앨범별 별도 폴더", + "@folderOrganizationByAlbumSubtitle": { + "description": "Subtitle for album folder option" + }, + "folderOrganizationByArtistAlbumSubtitle": "아티스트 및 앨범용 중첩 폴더", + "@folderOrganizationByArtistAlbumSubtitle": { + "description": "Subtitle for nested folder option" + }, + "updateAvailable": "업데이트 사용 가능", + "@updateAvailable": { + "description": "Update dialog title" + }, + "updateLater": "나중에", + "@updateLater": { + "description": "Update button - dismiss" + }, + "updateStartingDownload": "다운로드를 시작하는 중...", + "@updateStartingDownload": { + "description": "Update status - initializing" + }, + "updateDownloadFailed": "다운로드 실패", + "@updateDownloadFailed": { + "description": "Update error title" + }, + "updateFailedMessage": "업데이트 다운로드 실패", + "@updateFailedMessage": { + "description": "Update error message" + }, + "updateNewVersionReady": "새 버전이 준비되었습니다", + "@updateNewVersionReady": { + "description": "Update subtitle" + }, + "updateRequiredTitle": "업데이트 필요", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "이 버전은 최신 버전보다 {count} 개 이전 버전이며 더 이상 지원되지 않습니다. 앱을 계속 사용하려면 업데이트하세요", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "updateCurrent": "현재 버전", + "@updateCurrent": { + "description": "Label for current version" + }, + "updateNew": "새 버전", + "@updateNew": { + "description": "Label for new version" + }, + "updateDownloading": "다운로드하는 중...", + "@updateDownloading": { + "description": "Update status - downloading" + }, + "updateWhatsNew": "새 기능", + "@updateWhatsNew": { + "description": "Changelog section title" + }, + "updateDownloadInstall": "다운로드 & 설치", + "@updateDownloadInstall": { + "description": "Update button - download and install" + }, + "updateDontRemind": "알림 안 함", + "@updateDontRemind": { + "description": "Update button - skip this version" + }, + "providerPriorityTitle": "제공자 우선순위", + "@providerPriorityTitle": { + "description": "Provider priority page title" + }, + "providerPriorityDescription": "드래그하여 다운로드 제공자 순서를 변경하세요. 앱은 트랙을 다운로드할 경우에 위에서 아래로 제공자를 차례로 시도합니다", + "@providerPriorityDescription": { + "description": "Provider priority page description" + }, + "providerPriorityInfo": "첫 ​​번째 제공자에서 트랙을 사용할 수 없는 경우에 앱은 자동으로 다음 제공자를 시도합니다", + "@providerPriorityInfo": { + "description": "Info tip about fallback behavior" + }, + "providerPriorityFallbackExtensionsDescription": "자동 대체 중에 사용할 수 있는 설치된 다운로드 확장 프로그램을 선택하세요", + "@providerPriorityFallbackExtensionsDescription": { + "description": "Section description for extension fallback selection" + }, + "providerPriorityFallbackExtensionsHint": "다운로드 공급자 기능이 활성화된 확장 프로그램만 여기에 나열됩니다", + "@providerPriorityFallbackExtensionsHint": { + "description": "Hint below the extension fallback selection list" + }, + "providerExtension": "확장 프로그램", + "@providerExtension": { + "description": "Label for extension-provided providers" + }, + "metadataProviderPriorityTitle": "메타데이터 우선순위", + "@metadataProviderPriorityTitle": { + "description": "Metadata priority page title" + }, + "metadataProviderPriorityDescription": "드래그하여 메타데이터 제공자 순서를 변경하세요. 앱은 트랙을 검색하고 메타데이터를 가져올 경우에 위에서 아래로 제공자를 시도합니다", + "@metadataProviderPriorityDescription": { + "description": "Metadata priority page description" + }, + "metadataProviderPriorityInfo": "Deezer는 요청 횟수 제한이 없으므로 기본 앱으로 사용하는 것이 좋습니다. Spotify는 요청 횟수가 많아지면 요청 횟수를 제한할 수 있습니다", + "@metadataProviderPriorityInfo": { + "description": "Info tip about rate limits" + }, + "logTitle": "로그", + "@logTitle": { + "description": "Logs screen title" + }, + "logCopied": "로그가 클립보드에 복사됨", + "@logCopied": { + "description": "Snackbar - logs copied" + }, + "logSearchHint": "로그 검색...", + "@logSearchHint": { + "description": "Log search placeholder" + }, + "logFilterLevel": "레벨", + "@logFilterLevel": { + "description": "Filter by log level" + }, + "logFilterSection": "필터", + "@logFilterSection": { + "description": "Filter section title" + }, + "logShareLogs": "로그 공유", + "@logShareLogs": { + "description": "Share button tooltip" + }, + "logClearLogs": "로그 지우기", + "@logClearLogs": { + "description": "Clear button tooltip" + }, + "logClearLogsTitle": "로그 지우기", + "@logClearLogsTitle": { + "description": "Clear logs dialog title" + }, + "logClearLogsMessage": "모든 로그를 지우시겠습니까?", + "@logClearLogsMessage": { + "description": "Clear logs confirmation message" + }, + "logFilterBySeverity": "심각성에 따라 로그 분류", + "@logFilterBySeverity": { + "description": "Filter dialog title" + }, + "logNoLogsYet": "아직 로그 없음", + "@logNoLogsYet": { + "description": "Empty state title" + }, + "logNoLogsYetSubtitle": "앱을 사용하는 동안에 로그가 여기에 표시됩니다", + "@logNoLogsYetSubtitle": { + "description": "Empty state subtitle" + }, + "logEntriesFiltered": "항목 ({count} 개 필터됨)", + "@logEntriesFiltered": { + "description": "Log count with filter active", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logEntries": "항목 ({count})", + "@logEntries": { + "description": "Total log count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "channelStable": "안정", + "@channelStable": { + "description": "Update channel - stable releases" + }, + "channelPreview": "베타", + "@channelPreview": { + "description": "Update channel - beta/preview releases" + }, + "sectionSearchSource": "검색 출처", + "@sectionSearchSource": { + "description": "Settings section header" + }, + "sectionDownload": "다운로드", + "@sectionDownload": { + "description": "Settings section header" + }, + "sectionPerformance": "성능", + "@sectionPerformance": { + "description": "Settings section header" + }, + "sectionApp": "앱", + "@sectionApp": { + "description": "Settings section header" + }, + "sectionData": "데이터", + "@sectionData": { + "description": "Settings section header" + }, + "sectionDebug": "디버그", + "@sectionDebug": { + "description": "Settings section header" + }, + "sectionService": "서비스", + "@sectionService": { + "description": "Settings section header" + }, + "sectionAudioQuality": "오디오 음질", + "@sectionAudioQuality": { + "description": "Settings section header" + }, + "sectionFileSettings": "파일 설정", + "@sectionFileSettings": { + "description": "Settings section header" + }, + "sectionLyrics": "가사", + "@sectionLyrics": { + "description": "Settings section header" + }, + "lyricsMode": "가사 설정", + "@lyricsMode": { + "description": "Setting - how to save lyrics" + }, + "lyricsModeDescription": "다운로드된 파일에 가사를 저장하는 방법을 선택하세요", + "@lyricsModeDescription": { + "description": "Lyrics mode picker description" + }, + "lyricsModeEmbed": "파일에 포함", + "@lyricsModeEmbed": { + "description": "Lyrics mode option - embed in audio file" + }, + "lyricsModeEmbedSubtitle": "FLAC 메타데이터 내에 저장됩니다", + "@lyricsModeEmbedSubtitle": { + "description": "Subtitle for embed option" + }, + "lyricsModeExternal": "외부 .lrc 파일", + "@lyricsModeExternal": { + "description": "Lyrics mode option - separate LRC file" + }, + "lyricsModeExternalSubtitle": "삼성 뮤직과 같은 플레이어용 별도 .lrc 파일", + "@lyricsModeExternalSubtitle": { + "description": "Subtitle for external option" + }, + "lyricsModeBoth": "둘 다", + "@lyricsModeBoth": { + "description": "Lyrics mode option - embed and external" + }, + "lyricsModeBothSubtitle": ".lrc 파일을 삽입하고 저장합니다", + "@lyricsModeBothSubtitle": { + "description": "Subtitle for both option" + }, + "sectionColor": "색상", + "@sectionColor": { + "description": "Settings section header" + }, + "sectionTheme": "테마", + "@sectionTheme": { + "description": "Settings section header" + }, + "sectionLayout": "레이아웃", + "@sectionLayout": { + "description": "Settings section header" + }, + "sectionLanguage": "언어", + "@sectionLanguage": { + "description": "Settings section header for language" + }, + "appearanceLanguage": "앱 언어", + "@appearanceLanguage": { + "description": "Language setting title" + }, + "settingsAppearanceSubtitle": "테마, 색상, 디스플레이", + "@settingsAppearanceSubtitle": { + "description": "Appearance settings description" + }, + "settingsDownloadSubtitle": "서비스, 음질, 대체", + "@settingsDownloadSubtitle": { + "description": "Download settings description" + }, + "settingsExtensionsSubtitle": "다운로드 제공자 관리", + "@settingsExtensionsSubtitle": { + "description": "Extensions settings description" + }, + "settingsLogsSubtitle": "디버깅을 위한 앱 로그 보기", + "@settingsLogsSubtitle": { + "description": "Logs settings description" + }, + "loadingSharedLink": "공유된 링크를 불러오는 중...", + "@loadingSharedLink": { + "description": "Status when opening shared URL" + }, + "pressBackAgainToExit": "종료하려면 뒤로가기 버튼을 다시 탭하세요", + "@pressBackAgainToExit": { + "description": "Exit confirmation message" + }, + "downloadAllCount": "모두 다운로드 ({count})", + "@downloadAllCount": { + "description": "Download all button with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tracksCount": "{count, plural, =1{1 개의 트랙} other{{count} 개의 트랙}}", + "@tracksCount": { + "description": "Track count display", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackCopyFilePath": "파일 경로 복사", + "@trackCopyFilePath": { + "description": "Action - copy file path" + }, + "trackRemoveFromDevice": "기기에서 제거", + "@trackRemoveFromDevice": { + "description": "Action - delete downloaded file" + }, + "trackLoadLyrics": "가사 불러오기", + "@trackLoadLyrics": { + "description": "Action - fetch lyrics" + }, + "trackMetadata": "메타데이터", + "@trackMetadata": { + "description": "Tab title - track metadata" + }, + "trackFileInfo": "파일 정보", + "@trackFileInfo": { + "description": "Tab title - file information" + }, + "trackLyrics": "가사", + "@trackLyrics": { + "description": "Tab title - lyrics" + }, + "trackFileNotFound": "파일을 찾을 수 없음", + "@trackFileNotFound": { + "description": "Error - file doesn't exist" + }, + "trackOpenInDeezer": "Deezer에서 열기", + "@trackOpenInDeezer": { + "description": "Action - open track in Deezer app" + }, + "trackOpenInSpotify": "Spotify에서 열기", + "@trackOpenInSpotify": { + "description": "Action - open track in Spotify app" + }, + "trackTrackName": "트랙 이름", + "@trackTrackName": { + "description": "Metadata label - track title" + }, + "trackArtist": "아티스트", + "@trackArtist": { + "description": "Metadata label - artist name" + }, + "trackAlbumArtist": "앨범 아티스트", + "@trackAlbumArtist": { + "description": "Metadata label - album artist" + }, + "trackAlbum": "앨범", + "@trackAlbum": { + "description": "Metadata label - album name" + }, + "trackTrackNumber": "트랙 번호", + "@trackTrackNumber": { + "description": "Metadata label - track number" + }, + "trackDiscNumber": "디스크 번호", + "@trackDiscNumber": { + "description": "Metadata label - disc number" + }, + "trackDuration": "재생시간", + "@trackDuration": { + "description": "Metadata label - track length" + }, + "trackAudioQuality": "오디오 음질", + "@trackAudioQuality": { + "description": "Metadata label - audio quality" + }, + "trackReleaseDate": "발매일자", + "@trackReleaseDate": { + "description": "Metadata label - release date" + }, + "trackGenre": "장르", + "@trackGenre": { + "description": "Metadata label - music genre" + }, + "trackLabel": "레이블", + "@trackLabel": { + "description": "Metadata label - record label" + }, + "trackCopyright": "저작권", + "@trackCopyright": { + "description": "Metadata label - copyright information" + }, + "trackDownloaded": "다운로드됨", + "@trackDownloaded": { + "description": "Metadata label - download date" + }, + "trackCopyLyrics": "가사 복사", + "@trackCopyLyrics": { + "description": "Action - copy lyrics to clipboard" + }, + "trackLyricsSource": "출처: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "trackLyricsNotAvailable": "이 트랙의 가사를 사용할 수 없습니다", + "@trackLyricsNotAvailable": { + "description": "Message when lyrics not found" + }, + "trackLyricsNotInFile": "이 파일에서 가사를 찾을 수 없습니다", + "@trackLyricsNotInFile": { + "description": "Message when no embedded lyrics in audio file" + }, + "trackFetchOnlineLyrics": "온라인에서 가져오기", + "@trackFetchOnlineLyrics": { + "description": "Action - fetch lyrics from online providers" + }, + "trackLyricsTimeout": "요청 시간이 초과되었습니다. 나중에 다시 시도하세요", + "@trackLyricsTimeout": { + "description": "Message when lyrics request times out" + }, + "trackLyricsLoadFailed": "가사 불러오기 실패", + "@trackLyricsLoadFailed": { + "description": "Message when lyrics loading fails" + }, + "trackEmbedLyrics": "가사 삽입", + "@trackEmbedLyrics": { + "description": "Action - embed lyrics into audio file" + }, + "trackLyricsEmbedded": "가사 삽입 성공", + "@trackLyricsEmbedded": { + "description": "Snackbar - lyrics saved to file" + }, + "trackInstrumental": "반주 트랙", + "@trackInstrumental": { + "description": "Message when track is instrumental (no lyrics)" + }, + "trackCopiedToClipboard": "클립보드에 복사됨", + "@trackCopiedToClipboard": { + "description": "Snackbar - content copied" + }, + "trackDeleteConfirmTitle": "기기에서 제거하시겠습니까?", + "@trackDeleteConfirmTitle": { + "description": "Delete confirmation title" + }, + "trackDeleteConfirmMessage": "이렇게 하면 다운로드된 파일이 영구적으로 삭제되고 기록에서 제거됩니다", + "@trackDeleteConfirmMessage": { + "description": "Delete confirmation message" + }, + "dateToday": "오늘", + "@dateToday": { + "description": "Relative date - today" + }, + "dateYesterday": "어제", + "@dateYesterday": { + "description": "Relative date - yesterday" + }, + "dateDaysAgo": "{count} 일 전", + "@dateDaysAgo": { + "description": "Relative date - days ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dateWeeksAgo": "{count} 주 전", + "@dateWeeksAgo": { + "description": "Relative date - weeks ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dateMonthsAgo": "{count} 달 전", + "@dateMonthsAgo": { + "description": "Relative date - months ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeFilterAll": "모두", + "@storeFilterAll": { + "description": "Repo filter - all extensions" + }, + "storeFilterMetadata": "메타데이터", + "@storeFilterMetadata": { + "description": "Repo filter - metadata providers" + }, + "storeFilterDownload": "다운로드", + "@storeFilterDownload": { + "description": "Repo filter - download providers" + }, + "storeFilterUtility": "유틸리티", + "@storeFilterUtility": { + "description": "Repo filter - utility extensions" + }, + "storeFilterLyrics": "가사", + "@storeFilterLyrics": { + "description": "Repo filter - lyrics providers" + }, + "storeFilterIntegration": "연동", + "@storeFilterIntegration": { + "description": "Repo filter - integrations" + }, + "storeClearFilters": "필터 지우기", + "@storeClearFilters": { + "description": "Button to clear all filters" + }, + "storeAddRepoTitle": "확장 프로그램 레포지토리 추가", + "@storeAddRepoTitle": { + "description": "Store setup screen - heading when no repo is configured" + }, + "storeAddRepoDescription": "확장 프로그램을 찾아보고 설치하려면 registry.json 파일이 포함된 GitHub 레포지토리 URL을 입력하세요", + "@storeAddRepoDescription": { + "description": "Store setup screen - explanatory text" + }, + "storeRepoUrlLabel": "레포지토리 URL", + "@storeRepoUrlLabel": { + "description": "Label for the repository URL input field" + }, + "storeRepoUrlHint": "https://github.com/user/repo", + "@storeRepoUrlHint": { + "description": "Hint/placeholder for the repository URL input field" + }, + "storeAddRepoButton": "레포지토리 추가", + "@storeAddRepoButton": { + "description": "Button to submit a new repository URL" + }, + "storeChangeRepoTooltip": "레포지토리 변경", + "@storeChangeRepoTooltip": { + "description": "Tooltip for the change-repository icon button in the app bar" + }, + "storeRepoDialogTitle": "확장 프로그램 레포지토리", + "@storeRepoDialogTitle": { + "description": "Title of the change/remove repository dialog" + }, + "storeRepoDialogCurrent": "현재 레포지토리:", + "@storeRepoDialogCurrent": { + "description": "Label shown above the current repository URL in the dialog" + }, + "storeNewRepoUrlLabel": "새 레포지토리 URL", + "@storeNewRepoUrlLabel": { + "description": "Label for the new repository URL field inside the dialog" + }, + "storeLoadError": "레포지토리 불러오기 실패", + "@storeLoadError": { + "description": "Error heading when the store cannot be loaded" + }, + "storeEmptyNoExtensions": "사용 가능한 확장 프로그램이 없음", + "@storeEmptyNoExtensions": { + "description": "Message when store has no extensions" + }, + "storeEmptyNoResults": "확장 프로그램을 찾을 수 없음", + "@storeEmptyNoResults": { + "description": "Message when search/filter returns no results" + }, + "extensionId": "ID", + "@extensionId": { + "description": "Extension detail - unique ID" + }, + "extensionError": "오류", + "@extensionError": { + "description": "Extension detail - error message" + }, + "extensionCapabilities": "기능", + "@extensionCapabilities": { + "description": "Section header - extension features" + }, + "extensionMetadataProvider": "메타데이터 제공자", + "@extensionMetadataProvider": { + "description": "Capability - provides metadata" + }, + "extensionDownloadProvider": "다운로드 제공자", + "@extensionDownloadProvider": { + "description": "Capability - provides downloads" + }, + "extensionLyricsProvider": "가사 제공자", + "@extensionLyricsProvider": { + "description": "Capability - provides lyrics" + }, + "extensionUrlHandler": "URL 핸들러", + "@extensionUrlHandler": { + "description": "Capability - handles URLs" + }, + "extensionQualityOptions": "음질 옵션", + "@extensionQualityOptions": { + "description": "Capability - quality selection" + }, + "extensionPostProcessingHooks": "후처리 후크", + "@extensionPostProcessingHooks": { + "description": "Capability - post-processing" + }, + "extensionPermissions": "권한", + "@extensionPermissions": { + "description": "Section header - required permissions" + }, + "extensionSettings": "설정", + "@extensionSettings": { + "description": "Section header - extension settings" + }, + "extensionRemoveButton": "확장 프로그램 제거", + "@extensionRemoveButton": { + "description": "Button to uninstall extension" + }, + "extensionUpdated": "업데이트됨", + "@extensionUpdated": { + "description": "Extension detail - last update" + }, + "extensionMinAppVersion": "최소 앱 버전", + "@extensionMinAppVersion": { + "description": "Extension detail - minimum app version" + }, + "extensionCustomTrackMatching": "사용자 정의 트랙 매칭", + "@extensionCustomTrackMatching": { + "description": "Capability - custom track matching algorithm" + }, + "extensionPostProcessing": "후처리", + "@extensionPostProcessing": { + "description": "Capability - post-download processing" + }, + "extensionHooksAvailable": "{count} 개의 후크 사용 가능", + "@extensionHooksAvailable": { + "description": "Post-processing hooks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionPatternsCount": "{count} 개의 패턴", + "@extensionPatternsCount": { + "description": "URL patterns count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionStrategy": "전략: {strategy}", + "@extensionStrategy": { + "description": "Track matching strategy name", + "placeholders": { + "strategy": { + "type": "String" + } + } + }, + "extensionsProviderPrioritySection": "제공자 우선순위", + "@extensionsProviderPrioritySection": { + "description": "Section header - provider priority" + }, + "extensionsInstalledSection": "설치된 확장 프로그램", + "@extensionsInstalledSection": { + "description": "Section header - installed extensions" + }, + "extensionsNoExtensions": "설치된 확장 프로그램이 없음", + "@extensionsNoExtensions": { + "description": "Empty state - no extensions" + }, + "extensionsNoExtensionsSubtitle": "새 제공자를 추가하려면 .spotiflac-ext 파일을 설치하세요", + "@extensionsNoExtensionsSubtitle": { + "description": "Empty state subtitle" + }, + "extensionsInstallButton": "확장 프로그램 설치", + "@extensionsInstallButton": { + "description": "Button to install extension from file" + }, + "extensionsInfoTip": "확장 프로그램은 새 메타데이터와 다운로드 제공자를 추가할 수 있습니다. 신뢰할 수 있는 출처에서만 확장 프로그램을 설치하세요", + "@extensionsInfoTip": { + "description": "Security warning about extensions" + }, + "extensionsInstalledSuccess": "확장 프로그램 설치 성공", + "@extensionsInstalledSuccess": { + "description": "Success message after install" + }, + "extensionsInstalledCount": "{count} 개의 확장 프로그램 설치 성공", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "{attempted} 개의 확장 프로그램 중 {installed} 개가 설치됨", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "extensionsDownloadPriority": "다운로드 우선순위", + "@extensionsDownloadPriority": { + "description": "Setting - download provider order" + }, + "extensionsDownloadPrioritySubtitle": "다운로드 서비스 순서를 설정하세요", + "@extensionsDownloadPrioritySubtitle": { + "description": "Subtitle for download priority" + }, + "extensionsFallbackTitle": "대체 확장 프로그램", + "@extensionsFallbackTitle": { + "description": "Setting and page title for choosing which download extensions can be used during fallback" + }, + "extensionsFallbackSubtitle": "설치된 다운로드 확장 프로그램 중 대체 프로그램으로 사용할 항목을 선택하세요", + "@extensionsFallbackSubtitle": { + "description": "Subtitle for download fallback extensions menu" + }, + "extensionsNoDownloadProvider": "다운로드 제공자가 있는 확장 프로그램가 없음", + "@extensionsNoDownloadProvider": { + "description": "Empty state - no download providers" + }, + "extensionsMetadataPriority": "메타데이터 우선순위", + "@extensionsMetadataPriority": { + "description": "Setting - metadata provider order" + }, + "extensionsMetadataPrioritySubtitle": "검색 & 메타데이터 출처 순서 설정", + "@extensionsMetadataPrioritySubtitle": { + "description": "Subtitle for metadata priority" + }, + "extensionsNoMetadataProvider": "메타데이터 제공자가 있는 확장 프로그램이 없음", + "@extensionsNoMetadataProvider": { + "description": "Empty state - no metadata providers" + }, + "extensionsSearchProvider": "검색 제공자", + "@extensionsSearchProvider": { + "description": "Setting - search provider selection" + }, + "extensionsNoCustomSearch": "사용자 정의 검색이 있는 확장 프로그램이 없음", + "@extensionsNoCustomSearch": { + "description": "Empty state - no search providers" + }, + "extensionsSearchProviderDescription": "트랙 검색에 사용할 서비스를 선택하세요", + "@extensionsSearchProviderDescription": { + "description": "Search provider setting description" + }, + "extensionsCustomSearch": "사용자 정의 검색", + "@extensionsCustomSearch": { + "description": "Label for custom search provider" + }, + "extensionsErrorLoading": "확장 프로그램 불러오기 오류", + "@extensionsErrorLoading": { + "description": "Error message when extension fails to load" + }, + "qualityFlacLossless": "FLAC 무손실", + "@qualityFlacLossless": { + "description": "Quality option - CD quality FLAC" + }, + "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", + "@qualityFlacLosslessSubtitle": { + "description": "Technical spec for lossless" + }, + "qualityHiResFlac": "Hi-Res FLAC", + "@qualityHiResFlac": { + "description": "Quality option - high resolution FLAC" + }, + "qualityHiResFlacSubtitle": "24-bit / 최대 96kHz", + "@qualityHiResFlacSubtitle": { + "description": "Technical spec for hi-res" + }, + "qualityHiResFlacMax": "Hi-Res FLAC Max", + "@qualityHiResFlacMax": { + "description": "Quality option - maximum resolution FLAC" + }, + "qualityHiResFlacMaxSubtitle": "24-bit / 최대 192kHz", + "@qualityHiResFlacMaxSubtitle": { + "description": "Technical spec for hi-res max" + }, + "downloadLossy320": "손실 압축 320kbps", + "@downloadLossy320": { + "description": "Quality option label for lossy 320kbps" + }, + "downloadLossyFormat": "손실 압축 형식", + "@downloadLossyFormat": { + "description": "Setting title to pick output format for lossy downloads" + }, + "downloadLossy320Format": "손실 압축 320kbps 형식", + "@downloadLossy320Format": { + "description": "Title of the lossy format picker bottom sheet" + }, + "downloadLossy320FormatDesc": "320kbps 손실 다운로드의 출력 형식을 선택하세요. 필요에 따라 원본 스트림이 선택한 형식으로 변환됩니다", + "@downloadLossy320FormatDesc": { + "description": "Description in the lossy format picker" + }, + "downloadLossyMp3": "MP3 320kbps", + "@downloadLossyMp3": { + "description": "Lossy format option - MP3 320kbps" + }, + "downloadLossyMp3Subtitle": "최상의 호환성, 트랙당 약 10MB", + "@downloadLossyMp3Subtitle": { + "description": "Subtitle for MP3 320kbps lossy option" + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "최상의 모바일 호환성, M4A 컨테이너", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps lossy option" + }, + "downloadLossyOpus256": "Opus 256kbps", + "@downloadLossyOpus256": { + "description": "Lossy format option - Opus 256kbps" + }, + "downloadLossyOpus256Subtitle": "최고 음질 Opus, 트랙당 약 8MB", + "@downloadLossyOpus256Subtitle": { + "description": "Subtitle for Opus 256kbps lossy option" + }, + "downloadLossyOpus128": "Opus 128kbps", + "@downloadLossyOpus128": { + "description": "Lossy format option - Opus 128kbps" + }, + "downloadLossyOpus128Subtitle": "트랙당 최소 크기, 약 4MB", + "@downloadLossyOpus128Subtitle": { + "description": "Subtitle for Opus 128kbps lossy option" + }, + "downloadAskBeforeDownload": "다운로드 전 확인", + "@downloadAskBeforeDownload": { + "description": "Setting - show quality picker" + }, + "downloadDirectory": "다운로드 디렉토리", + "@downloadDirectory": { + "description": "Setting - download folder" + }, + "downloadSeparateSinglesFolder": "싱글 폴더 별도 다운로드", + "@downloadSeparateSinglesFolder": { + "description": "Setting - separate folder for singles" + }, + "downloadAlbumFolderStructure": "앨범 폴더 구조", + "@downloadAlbumFolderStructure": { + "description": "Setting - album folder organization" + }, + "albumFolderStructureDescription": "앨범 폴더 구조를 선택하세요", + "@albumFolderStructureDescription": { + "description": "Album folder structure picker description" + }, + "downloadUseAlbumArtistForFolders": "폴더에 앨범 아티스트 사용", + "@downloadUseAlbumArtistForFolders": { + "description": "Setting - choose whether artist folders use Album Artist or Track Artist" + }, + "downloadUsePrimaryArtistOnly": "폴더에 기본 아티스트만 사용", + "@downloadUsePrimaryArtistOnly": { + "description": "Setting - strip featured artists from folder name" + }, + "downloadUsePrimaryArtistOnlyEnabled": "폴더 이름에서 피처링 아티스트가 제거됩니다 (예: Justin Bieber, Quavo → Justin Bieber)", + "@downloadUsePrimaryArtistOnlyEnabled": { + "description": "Subtitle when primary artist only is enabled" + }, + "downloadUsePrimaryArtistOnlyDisabled": "폴더 이름에 전체 아티스트 문자열이 사용됩니다", + "@downloadUsePrimaryArtistOnlyDisabled": { + "description": "Subtitle when primary artist only is disabled" + }, + "downloadSelectQuality": "음질 선택", + "@downloadSelectQuality": { + "description": "Dialog title - choose audio quality" + }, + "downloadFrom": "다운로드 제공자 선택", + "@downloadFrom": { + "description": "Label - download source" + }, + "appearanceAmoledDark": "아몰레드 블랙", + "@appearanceAmoledDark": { + "description": "Theme option - pure black" + }, + "appearanceAmoledDarkSubtitle": "순수 검정 배경화면", + "@appearanceAmoledDarkSubtitle": { + "description": "Subtitle for AMOLED dark" + }, + "appearanceHeroAnimations": "히어로 애니메이션", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "화면 간 이동 시 표지 이미지가 날아가는 애니메이션을 표시합니다 (예시: 플레이어를 실행할 경우)", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, + "queueClearAll": "모두 지우기", + "@queueClearAll": { + "description": "Button - clear all queue items" + }, + "queueClearAllMessage": "모든 다운로드를 지우시겠습니까?", + "@queueClearAllMessage": { + "description": "Clear queue confirmation" + }, + "settingsAutoExportFailed": "실패한 다운로드 자동 내보내기", + "@settingsAutoExportFailed": { + "description": "Setting toggle for auto-export" + }, + "settingsAutoExportFailedSubtitle": "실패한 다운로드를 TXT 파일으로 자동 저장합니다", + "@settingsAutoExportFailedSubtitle": { + "description": "Subtitle for auto-export setting" + }, + "settingsDownloadNetwork": "다운로드 네트워크", + "@settingsDownloadNetwork": { + "description": "Setting for network type preference" + }, + "settingsDownloadNetworkAny": "WiFi + 모바일 네트워크", + "@settingsDownloadNetworkAny": { + "description": "Network option - use any connection" + }, + "settingsDownloadNetworkWifiOnly": "WiFi 전용", + "@settingsDownloadNetworkWifiOnly": { + "description": "Network option - only use WiFi" + }, + "settingsDownloadNetworkSubtitle": "다운로드에 사용할 네트워크를 선택하세요. Wi-Fi 전용으로 설정하면 모바일 데이터 사용 시 다운로드가 일시 중지됩니다", + "@settingsDownloadNetworkSubtitle": { + "description": "Subtitle explaining network preference" + }, + "settingsConcurrentDownloads": "동시 다운로드", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "여러 트랙을 동시에 다운로드하면 속도는 빨라지지만, 일부 제공자는 동시 요청을 제한할 수 있습니다", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "한 번에 1개의 트랙", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "한 번에 최대 {count} 개의 트랙", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "albumFolderArtistAlbum": "아티스트 / 앨범", + "@albumFolderArtistAlbum": { + "description": "Album folder option" + }, + "albumFolderArtistAlbumSubtitle": "앨범/아티스트 이름/앨범 이름/", + "@albumFolderArtistAlbumSubtitle": { + "description": "Folder structure example" + }, + "albumFolderArtistYearAlbum": "아티스트 / [연도] 앨범", + "@albumFolderArtistYearAlbum": { + "description": "Album folder option with year" + }, + "albumFolderArtistYearAlbumSubtitle": "앨범/아티스트 이름/[2005] 앨범 이름/", + "@albumFolderArtistYearAlbumSubtitle": { + "description": "Folder structure example" + }, + "albumFolderAlbumOnly": "앨범만", + "@albumFolderAlbumOnly": { + "description": "Album folder option" + }, + "albumFolderAlbumOnlySubtitle": "앨범/앨범 이름/", + "@albumFolderAlbumOnlySubtitle": { + "description": "Folder structure example" + }, + "albumFolderYearAlbum": "[연도] 앨범", + "@albumFolderYearAlbum": { + "description": "Album folder option with year" + }, + "albumFolderYearAlbumSubtitle": "앨범/[2005] 앨범 이름/", + "@albumFolderYearAlbumSubtitle": { + "description": "Folder structure example" + }, + "albumFolderArtistAlbumSingles": "아티스트 / 앨범 + 싱글", + "@albumFolderArtistAlbumSingles": { + "description": "Album folder option with singles inside artist" + }, + "albumFolderArtistAlbumSinglesSubtitle": "아티스트/앨범/ 및 아티스트/싱글/", + "@albumFolderArtistAlbumSinglesSubtitle": { + "description": "Folder structure example" + }, + "albumFolderArtistAlbumFlat": "아티스트 / 앨범 (싱글 플랫)", + "@albumFolderArtistAlbumFlat": { + "description": "Album folder option with singles directly in artist folder" + }, + "albumFolderArtistAlbumFlatSubtitle": "아티스트/앨범/ 및 아티스트/song.flac", + "@albumFolderArtistAlbumFlatSubtitle": { + "description": "Folder structure example for flat singles" + }, + "downloadedAlbumDeleteSelected": "선택 항목 삭제", + "@downloadedAlbumDeleteSelected": { + "description": "Button - delete selected tracks" + }, + "downloadedAlbumDeleteMessage": "앨범에서 {count} 개의 {count, plural, =1{트랙} other{트랙}}을 삭제하시겠습니까?\n\n저장소에서도 파일이 삭제됩니다", + "@downloadedAlbumDeleteMessage": { + "description": "Delete confirmation with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadedAlbumSelectedCount": "{count} 개 선택됨", + "@downloadedAlbumSelectedCount": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadedAlbumTapToSelect": "트랙을 탭하여 선택하세요", + "@downloadedAlbumTapToSelect": { + "description": "Selection hint" + }, + "downloadedAlbumDeleteCount": "{count} {count, plural, =1{트랙} other{트랙}} 삭제", + "@downloadedAlbumDeleteCount": { + "description": "Delete button text with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadedAlbumSelectToDelete": "삭제할 트랙 선택", + "@downloadedAlbumSelectToDelete": { + "description": "Placeholder when nothing selected" + }, + "downloadedAlbumDiscHeader": "디스크 {discNumber}", + "@downloadedAlbumDiscHeader": { + "description": "Header for disc separator in multi-disc albums", + "placeholders": { + "discNumber": { + "type": "int", + "example": "1" + } + } + }, + "recentTypeArtist": "아티스트", + "@recentTypeArtist": { + "description": "Recent access item type - artist" + }, + "recentTypeAlbum": "앨범", + "@recentTypeAlbum": { + "description": "Recent access item type - album" + }, + "recentTypeSong": "노래", + "@recentTypeSong": { + "description": "Recent access item type - song/track" + }, + "recentTypePlaylist": "재생목록", + "@recentTypePlaylist": { + "description": "Recent access item type - playlist" + }, + "recentEmpty": "최근 항목이 없음", + "@recentEmpty": { + "description": "Empty state text for recent access list" + }, + "recentShowAllDownloads": "모든 다운로드 표시", + "@recentShowAllDownloads": { + "description": "Button label to unhide hidden downloads in recent access" + }, + "recentPlaylistInfo": "재생목록: {name}", + "@recentPlaylistInfo": { + "description": "Snackbar message when tapping playlist in recent access", + "placeholders": { + "name": { + "type": "String", + "description": "Playlist name" + } + } + }, + "discographyDownload": "디스코그래피 다운로드", + "@discographyDownload": { + "description": "Button - download artist discography" + }, + "discographyDownloadAll": "모두 다운로드", + "@discographyDownloadAll": { + "description": "Option - download entire discography" + }, + "discographyDownloadAllSubtitle": "{albumCount} 개의 발매 음악에서 {count} 개의 트랙", + "@discographyDownloadAllSubtitle": { + "description": "Subtitle showing total tracks and albums", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographyAlbumsOnly": "앨범만", + "@discographyAlbumsOnly": { + "description": "Option - download only albums" + }, + "discographyAlbumsOnlySubtitle": "{albumCount} 개의 앨범에서 {count} 개의 트랙", + "@discographyAlbumsOnlySubtitle": { + "description": "Subtitle showing album tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySinglesOnly": "싱글 & EP만", + "@discographySinglesOnly": { + "description": "Option - download only singles" + }, + "discographySinglesOnlySubtitle": "{albumCount} 개의 싱글에서 {count} 개의 트랙", + "@discographySinglesOnlySubtitle": { + "description": "Subtitle showing singles tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySelectAlbums": "앨범 검색...", + "@discographySelectAlbums": { + "description": "Option - manually select albums to download" + }, + "discographySelectAlbumsSubtitle": "특정 앨범 또는 싱글을 선택하세요", + "@discographySelectAlbumsSubtitle": { + "description": "Subtitle for select albums option" + }, + "discographyFetchingTracks": "트랙을 가져오는 중...", + "@discographyFetchingTracks": { + "description": "Progress - fetching album tracks" + }, + "discographyFetchingAlbum": "{total} 개 중 {current} 개를 가져오는 중...", + "@discographyFetchingAlbum": { + "description": "Progress - fetching specific album", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "discographySelectedCount": "{count} 개 선택됨", + "@discographySelectedCount": { + "description": "Selection count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographyDownloadSelected": "선택 항목 다운로드", + "@discographyDownloadSelected": { + "description": "Button - download selected albums" + }, + "discographyAddedToQueue": "다운로드 목록에 {count} 개의 트랙이 추가됨", + "@discographyAddedToQueue": { + "description": "Snackbar - tracks added from discography", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographySkippedDownloaded": "{added} 개 추가됨, {skipped} 개 이미 다운로드됨", + "@discographySkippedDownloaded": { + "description": "Snackbar - with skipped tracks count", + "placeholders": { + "added": { + "type": "int" + }, + "skipped": { + "type": "int" + } + } + }, + "discographyNoAlbums": "사용 가능한 앨범이 없음", + "@discographyNoAlbums": { + "description": "Error - no albums found for artist" + }, + "discographyFailedToFetch": "일부 앨범 가져오기 실패", + "@discographyFailedToFetch": { + "description": "Error - some albums failed to load" + }, + "sectionStorageAccess": "저장소 접근", + "@sectionStorageAccess": { + "description": "Section header for storage access settings" + }, + "allFilesAccess": "모든 파일 접근", + "@allFilesAccess": { + "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" + }, + "allFilesAccessEnabledSubtitle": "모든 폴더에 쓰기 가능", + "@allFilesAccessEnabledSubtitle": { + "description": "Subtitle when all files access is enabled" + }, + "allFilesAccessDisabledSubtitle": "미디어 폴더에만 제한됨", + "@allFilesAccessDisabledSubtitle": { + "description": "Subtitle when all files access is disabled" + }, + "allFilesAccessDescription": "사용자 정의 폴더에 저장할 경우에 쓰기 오류가 발생하면 이 옵션을 활성화하세요. Android 13 이상에서는 기본적으로 특정 디렉터리에 대한 접근이 제한됩니다", + "@allFilesAccessDescription": { + "description": "Description explaining when to enable all files access" + }, + "allFilesAccessDeniedMessage": "권한이 거부되었습니다. 시스템 설정에서 '모든 파일 접근'를 수동으로 활성화하세요", + "@allFilesAccessDeniedMessage": { + "description": "Message when permission is permanently denied" + }, + "allFilesAccessDisabledMessage": "모든 파일 접근을 비활성화하였습니다. 앱은 제한된 저장소 접근을 사용합니다", + "@allFilesAccessDisabledMessage": { + "description": "Snackbar message when user disables all files access" + }, + "settingsLocalLibrary": "로컬 라이브러리", + "@settingsLocalLibrary": { + "description": "Settings menu item - local library" + }, + "settingsLocalLibrarySubtitle": "음악 스캔 & 중복 감지", + "@settingsLocalLibrarySubtitle": { + "description": "Subtitle for local library settings" + }, + "settingsCache": "저장소 & 캐시", + "@settingsCache": { + "description": "Settings menu item - cache management" + }, + "settingsCacheSubtitle": "크기 보기 및 캐시된 데이터 지우기", + "@settingsCacheSubtitle": { + "description": "Subtitle for cache management menu" + }, + "libraryTitle": "로컬 라이브러리", + "@libraryTitle": { + "description": "Library settings page title" + }, + "libraryScanSettings": "스캔 설정", + "@libraryScanSettings": { + "description": "Section header for scan settings" + }, + "libraryEnableLocalLibrary": "로컬 라이브러리 활성화", + "@libraryEnableLocalLibrary": { + "description": "Toggle to enable library scanning" + }, + "libraryEnableLocalLibrarySubtitle": "기존 음악을 스캔하고 추적하세요", + "@libraryEnableLocalLibrarySubtitle": { + "description": "Subtitle for enable toggle" + }, + "libraryFolder": "라이브러리 폴더", + "@libraryFolder": { + "description": "Folder selection setting" + }, + "libraryFolderHint": "탭하여 폴더를 선택하세요", + "@libraryFolderHint": { + "description": "Placeholder when no folder selected" + }, + "libraryShowDuplicateIndicator": "중복 표시기 표시", + "@libraryShowDuplicateIndicator": { + "description": "Toggle for duplicate indicator in search" + }, + "libraryShowDuplicateIndicatorSubtitle": "기존 트랙을 검색할 때 표시", + "@libraryShowDuplicateIndicatorSubtitle": { + "description": "Subtitle for duplicate indicator toggle" + }, + "libraryAutoScan": "자동 스캔", + "@libraryAutoScan": { + "description": "Setting for automatic library scanning" + }, + "libraryAutoScanSubtitle": "라이브러리에서 새 파일을 자동으로 스캔합니다", + "@libraryAutoScanSubtitle": { + "description": "Subtitle for auto scan setting" + }, + "libraryAutoScanOff": "끄기", + "@libraryAutoScanOff": { + "description": "Auto scan disabled" + }, + "libraryAutoScanOnOpen": "앱을 열 때마다", + "@libraryAutoScanOnOpen": { + "description": "Auto scan when app opens" + }, + "libraryAutoScanDaily": "매일", + "@libraryAutoScanDaily": { + "description": "Auto scan once per day" + }, + "libraryAutoScanWeekly": "주간", + "@libraryAutoScanWeekly": { + "description": "Auto scan once per week" + }, + "libraryActions": "작업", + "@libraryActions": { + "description": "Section header for library actions" + }, + "libraryScan": "라이브러리 스캔", + "@libraryScan": { + "description": "Button to start library scan" + }, + "libraryScanSubtitle": "오디오 파일 스캔", + "@libraryScanSubtitle": { + "description": "Subtitle for scan button" + }, + "libraryScanSelectFolderFirst": "먼저 폴더를 선택하세요", + "@libraryScanSelectFolderFirst": { + "description": "Message when trying to scan without folder" + }, + "libraryCleanupMissingFiles": "누락된 파일 정리", + "@libraryCleanupMissingFiles": { + "description": "Button to remove entries for missing files" + }, + "libraryCleanupMissingFilesSubtitle": "더 이상 존재하지 않는 파일에 대한 항목을 제거합니다", + "@libraryCleanupMissingFilesSubtitle": { + "description": "Subtitle for cleanup button" + }, + "libraryClear": "라이브러리 정리", + "@libraryClear": { + "description": "Button to clear all library entries" + }, + "libraryClearSubtitle": "스캔된 모든 트랙 제거", + "@libraryClearSubtitle": { + "description": "Subtitle for clear button" + }, + "libraryClearConfirmTitle": "라이브러리 정리", + "@libraryClearConfirmTitle": { + "description": "Dialog title for clear confirmation" + }, + "libraryClearConfirmMessage": "이렇게 하면 라이브러리에서 스캔된 모든 트랙이 제거됩니다. 실제 음악 파일은 삭제되지 않습니다", + "@libraryClearConfirmMessage": { + "description": "Dialog message for clear confirmation" + }, + "libraryAbout": "로컬 라이브러리에 대한 정보", + "@libraryAbout": { + "description": "Section header for about info" + }, + "libraryAboutDescription": "기존 음악 라이브러리를 검사하여 다운로드 시 중복 곡을 감지합니다. FLAC, ALAC, M4A, MP3, Opus, OGG, WAV, AIFF 및 APE 형식을 지원합니다. 가능한 경우 파일 태그의 메타데이터를 읽어 사용합니다", + "@libraryAboutDescription": { + "description": "Description of local library feature" + }, + "libraryTracksUnit": "{count, plural, =1{트랙} other{트랙}}", + "@libraryTracksUnit": { + "description": "Unit label for tracks count (without the number itself)", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryFilesUnit": "{count, plural, =1{파일} other{파일}}", + "@libraryFilesUnit": { + "description": "Unit label for files count during library scanning", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryLastScanned": "마지막 스캔 시간: {time}", + "@libraryLastScanned": { + "description": "Last scan time display", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "libraryLastScannedNever": "스캔한 적 없음", + "@libraryLastScannedNever": { + "description": "Shown when library has never been scanned" + }, + "libraryScanning": "스캔하는 중...", + "@libraryScanning": { + "description": "Status during scan" + }, + "libraryScanFinalizing": "라이브러리를 마무리하는 중...", + "@libraryScanFinalizing": { + "description": "Status shown after file scanning finishes but library persistence is still running" + }, + "libraryScanProgress": "{total} 개의 파일 중 {progress}%", + "@libraryScanProgress": { + "description": "Scan progress display", + "placeholders": { + "progress": { + "type": "String" + }, + "total": { + "type": "int" + } + } + }, + "libraryInLibrary": "in 라이브러리", + "@libraryInLibrary": { + "description": "Badge shown on tracks that exist in local library" + }, + "libraryRemovedMissingFiles": "라이브러리에서 {count} 개의 누락된 파일이 삭제됨", + "@libraryRemovedMissingFiles": { + "description": "Snackbar after cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryCleared": "라이브러리가 초기화됨", + "@libraryCleared": { + "description": "Snackbar after clearing library" + }, + "libraryStorageAccessRequired": "저장소 접근 권한 필요", + "@libraryStorageAccessRequired": { + "description": "Dialog title for storage permission" + }, + "libraryStorageAccessMessage": "SpotifyFLAC은 음악 라이브러리를 스캔하기 위해 저장소 접근 권한이 필요합니다. 설정에서 권한을 부여해 주세요", + "@libraryStorageAccessMessage": { + "description": "Dialog message for storage permission" + }, + "libraryFolderNotExist": "선택한 폴더가 존재하지 않음", + "@libraryFolderNotExist": { + "description": "Error when folder doesn't exist" + }, + "librarySourceDownloaded": "다운로드됨", + "@librarySourceDownloaded": { + "description": "Badge for tracks downloaded via SpotiFLAC" + }, + "librarySourceLocal": "로컬", + "@librarySourceLocal": { + "description": "Badge for tracks from local library scan" + }, + "libraryFilterAll": "모두", + "@libraryFilterAll": { + "description": "Filter chip - show all library items" + }, + "libraryFilterDownloaded": "다운로드됨", + "@libraryFilterDownloaded": { + "description": "Filter chip - show only downloaded items" + }, + "libraryFilterLocal": "로컬", + "@libraryFilterLocal": { + "description": "Filter chip - show only local library items" + }, + "libraryFilterTitle": "필터", + "@libraryFilterTitle": { + "description": "Filter bottom sheet title" + }, + "libraryFilterReset": "초기화", + "@libraryFilterReset": { + "description": "Reset all filters button" + }, + "libraryFilterApply": "적용", + "@libraryFilterApply": { + "description": "Apply filters button" + }, + "libraryFilterSource": "출처", + "@libraryFilterSource": { + "description": "Filter section - source type" + }, + "libraryFilterQuality": "음질", + "@libraryFilterQuality": { + "description": "Filter section - audio quality" + }, + "libraryFilterQualityHiRes": "Hi-Res (24bit)", + "@libraryFilterQualityHiRes": { + "description": "Filter option - high resolution audio" + }, + "libraryFilterQualityCD": "CD (16bit)", + "@libraryFilterQualityCD": { + "description": "Filter option - CD quality audio" + }, + "libraryFilterQualityLossy": "손실 압축", + "@libraryFilterQualityLossy": { + "description": "Filter option - lossy compressed audio" + }, + "libraryFilterFormat": "형식", + "@libraryFilterFormat": { + "description": "Filter section - file format" + }, + "libraryFilterMetadata": "메타데이터", + "@libraryFilterMetadata": { + "description": "Filter section - metadata completeness" + }, + "libraryFilterMetadataComplete": "전체 메타데이터", + "@libraryFilterMetadataComplete": { + "description": "Filter option - items with complete metadata" + }, + "libraryFilterMetadataMissingAny": "메타데이터 누락", + "@libraryFilterMetadataMissingAny": { + "description": "Filter option - items missing any tracked metadata field" + }, + "libraryFilterMetadataMissingYear": "연도 누락", + "@libraryFilterMetadataMissingYear": { + "description": "Filter option - items missing release year/date" + }, + "libraryFilterMetadataMissingGenre": "장르 누락", + "@libraryFilterMetadataMissingGenre": { + "description": "Filter option - items missing genre" + }, + "libraryFilterMetadataMissingAlbumArtist": "앨범 아티스트 누락", + "@libraryFilterMetadataMissingAlbumArtist": { + "description": "Filter option - items missing album artist" + }, + "libraryFilterSort": "정렬", + "@libraryFilterSort": { + "description": "Filter section - sort order" + }, + "libraryFilterSortLatest": "최신순", + "@libraryFilterSortLatest": { + "description": "Sort option - newest first" + }, + "libraryFilterSortOldest": "오래된순", + "@libraryFilterSortOldest": { + "description": "Sort option - oldest first" + }, + "libraryFilterSortAlbumAsc": "앨범 (오름차순)", + "@libraryFilterSortAlbumAsc": { + "description": "Sort option - album ascending" + }, + "libraryFilterSortAlbumDesc": "앨범 (내림차순)", + "@libraryFilterSortAlbumDesc": { + "description": "Sort option - album descending" + }, + "libraryFilterSortGenreAsc": "장르 (오름차순)", + "@libraryFilterSortGenreAsc": { + "description": "Sort option - genre ascending" + }, + "libraryFilterSortGenreDesc": "장르 (내림차순)", + "@libraryFilterSortGenreDesc": { + "description": "Sort option - genre descending" + }, + "timeJustNow": "방금 전", + "@timeJustNow": { + "description": "Relative time - less than a minute ago" + }, + "timeMinutesAgo": "{count, plural, =1{1 분 전} other{{count} 분 전}}", + "@timeMinutesAgo": { + "description": "Relative time - minutes ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeHoursAgo": "{count, plural, =1{1 시간 전} other{{count} 시간 전}}", + "@timeHoursAgo": { + "description": "Relative time - hours ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tutorialWelcomeTitle": "SpotiFLAC에 오신 것을 환영합니다!", + "@tutorialWelcomeTitle": { + "description": "Tutorial welcome page title" + }, + "tutorialWelcomeDesc": "좋아하는 음악을 무손실 음질로 다운로드하는 방법을 알아보겠습니다. 이 간단한 튜토리얼은 기본 사항을 보여줍니다", + "@tutorialWelcomeDesc": { + "description": "Tutorial welcome page description" + }, + "tutorialWelcomeTip1": "Spotify, Deezer 또는 지원되는 URL에서 음악을 다운로드할 수 있습니다", + "@tutorialWelcomeTip1": { + "description": "Tutorial welcome tip 1" + }, + "tutorialWelcomeTip2": "설치된 다운로드 확장 프로그램으로 FLAC 고음질 오디오를 다운로드할 수 있습니다", + "@tutorialWelcomeTip2": { + "description": "Tutorial welcome tip 2" + }, + "tutorialWelcomeTip3": "메타데이터, 표지 이미지 및 가사를 자동으로 추가할 수 있습니다", + "@tutorialWelcomeTip3": { + "description": "Tutorial welcome tip 3" + }, + "tutorialSearchTitle": "음악 찾기", + "@tutorialSearchTitle": { + "description": "Tutorial search page title" + }, + "tutorialSearchDesc": "다운로드하고 싶은 음악을 찾는 두 가지 쉬운 방법이 있습니다", + "@tutorialSearchDesc": { + "description": "Tutorial search page description" + }, + "tutorialDownloadTitle": "음악 다운로드", + "@tutorialDownloadTitle": { + "description": "Tutorial download page title" + }, + "tutorialDownloadDesc": "음악 다운로드는 간단하고 빠릅니다\\n작동 방식은 다음과 같습니다", + "@tutorialDownloadDesc": { + "description": "Tutorial download page description" + }, + "tutorialLibraryTitle": "내 라이브러리", + "@tutorialLibraryTitle": { + "description": "Tutorial library page title" + }, + "tutorialLibraryDesc": "다운로드된 모든 음악은 라이브러리 탭에 정리되어 있습니다", + "@tutorialLibraryDesc": { + "description": "Tutorial library page description" + }, + "tutorialLibraryTip1": "라이브러리 탭에서 다운로드 진행 상황과 다운로드 목록을 확인할 수 있습니다", + "@tutorialLibraryTip1": { + "description": "Tutorial library tip 1" + }, + "tutorialLibraryTip2": "아무 트랙을 탭하여 음악 플레이어로 재생할 수 있습니다", + "@tutorialLibraryTip2": { + "description": "Tutorial library tip 2" + }, + "tutorialLibraryTip3": "리스트 보기 또는 그리드 보기로 전환하여 더 나은 탐색을 할 수 있습니다", + "@tutorialLibraryTip3": { + "description": "Tutorial library tip 3" + }, + "tutorialExtensionsTitle": "확장 프로그램", + "@tutorialExtensionsTitle": { + "description": "Tutorial extensions page title" + }, + "tutorialExtensionsDesc": "커뮤니티 확장 프로그램을 사용하여 앱의 기능을 확장하세요", + "@tutorialExtensionsDesc": { + "description": "Tutorial extensions page description" + }, + "tutorialExtensionsTip1": "레포 탭을 탐색하여 유용한 확장 프로그램을 찾을 수 있습니다", + "@tutorialExtensionsTip1": { + "description": "Tutorial extensions tip 1" + }, + "tutorialExtensionsTip2": "새 다운로드 제공자 또는 검색 출처를 추가할 수 있습니다", + "@tutorialExtensionsTip2": { + "description": "Tutorial extensions tip 2" + }, + "tutorialExtensionsTip3": "가사, 향상된 메타데이터 및 더 많은 기능을 사용할 수 있습니다", + "@tutorialExtensionsTip3": { + "description": "Tutorial extensions tip 3" + }, + "tutorialSettingsTitle": "사용자 환경 맞춤 설정", + "@tutorialSettingsTitle": { + "description": "Tutorial settings page title" + }, + "tutorialSettingsDesc": "설정에서 앱을 원하는 대로 맞춤 설정하세요", + "@tutorialSettingsDesc": { + "description": "Tutorial settings page description" + }, + "tutorialSettingsTip1": "다운로드 위치 및 폴더 구성 변경", + "@tutorialSettingsTip1": { + "description": "Tutorial settings tip 1" + }, + "tutorialSettingsTip2": "기본 오디오 음질 및 형식 설정", + "@tutorialSettingsTip2": { + "description": "Tutorial settings tip 2" + }, + "tutorialSettingsTip3": "앱 테마 및 디자인 사용자 정의", + "@tutorialSettingsTip3": { + "description": "Tutorial settings tip 3" + }, + "tutorialReadyMessage": "모든 준비가 완료되었습니다! 지금 바로 좋아하는 음악을 다운로드하세요", + "@tutorialReadyMessage": { + "description": "Tutorial completion message" + }, + "libraryForceFullScan": "전제 스캔 강제 실행", + "@libraryForceFullScan": { + "description": "Button to force a complete rescan of library" + }, + "libraryForceFullScanSubtitle": "캐시를 무시하고 모든 파일을 다시 스캔합니다", + "@libraryForceFullScanSubtitle": { + "description": "Subtitle for force full scan button" + }, + "cleanupOrphanedDownloads": "불필요한 다운로드 파일 정리", + "@cleanupOrphanedDownloads": { + "description": "Button to remove history entries for deleted files" + }, + "cleanupOrphanedDownloadsSubtitle": "더 이상 존재하지 않는 파일의 기록 항목을 제거합니다", + "@cleanupOrphanedDownloadsSubtitle": { + "description": "Subtitle for orphaned cleanup button" + }, + "cleanupOrphanedDownloadsResult": "기록에서 {count} 개의 불필요한 항목이 제거됨", + "@cleanupOrphanedDownloadsResult": { + "description": "Snackbar after orphan cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cleanupOrphanedDownloadsNone": "불필요한 항목이 없습니다", + "@cleanupOrphanedDownloadsNone": { + "description": "Snackbar when no orphans found" + }, + "cacheTitle": "저장소 & 캐시", + "@cacheTitle": { + "description": "Cache management page title" + }, + "cacheSummaryTitle": "캐시 요약", + "@cacheSummaryTitle": { + "description": "Heading for cache summary card" + }, + "cacheSummarySubtitle": "캐시를 지워도 다운로드된 음악 파일은 삭제되지 않습니다", + "@cacheSummarySubtitle": { + "description": "Helper text for cache summary card" + }, + "cacheEstimatedTotal": "예상 캐시 사용량: {size}", + "@cacheEstimatedTotal": { + "description": "Total cache size shown in summary", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheSectionStorage": "캐시된 데이터", + "@cacheSectionStorage": { + "description": "Section header for cache entries" + }, + "cacheSectionMaintenance": "유지 관리", + "@cacheSectionMaintenance": { + "description": "Section header for cleanup actions" + }, + "cacheAppDirectory": "앱 캐시 디렉토리", + "@cacheAppDirectory": { + "description": "Cache item title for app cache directory" + }, + "cacheAppDirectoryDesc": "HTTP 응답, WebView 데이터 및 기타 임시 앱 데이터입니다", + "@cacheAppDirectoryDesc": { + "description": "Description of what app cache directory contains" + }, + "cacheTempDirectory": "임시 디렉토리", + "@cacheTempDirectory": { + "description": "Cache item title for temporary files directory" + }, + "cacheTempDirectoryDesc": "다운로드 및 오디오 변환으로 만들어진 임시 파일", + "@cacheTempDirectoryDesc": { + "description": "Description of what temporary directory contains" + }, + "cacheCoverImage": "표지 이미지 캐시", + "@cacheCoverImage": { + "description": "Cache item title for persistent cover images" + }, + "cacheCoverImageDesc": "다운로드된 앨범 및 트랙 표지 이미지입니다. 볼 때 다시 다운로드됩니다", + "@cacheCoverImageDesc": { + "description": "Description of what cover image cache contains" + }, + "cacheLibraryCover": "라이브러리 표지 캐시", + "@cacheLibraryCover": { + "description": "Cache item title for local library cover art images" + }, + "cacheLibraryCoverDesc": "로컬 음악 파일에서 추출된 표지 이미지입니다. 다음 스캔 시 다시 추출됩니다", + "@cacheLibraryCoverDesc": { + "description": "Description of what library cover cache contains" + }, + "libraryPlaybackNormalization": "볼륨 정규화", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "트랙에 ReplayGain 또는 R128 태그가 있는 경우에 이를 사용하여 트랙 간 음량을 일정하게 맞춥니다", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "오디오 분석 캐시", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "저장된 스펙트로그램과 분석 결과입니다. 다음에 실행할 경우에 다시 분석합니다", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, + "cacheExploreFeed": "탐색 피드 캐시", + "@cacheExploreFeed": { + "description": "Cache item title for explore home feed cache" + }, + "cacheExploreFeedDesc": "탐색 탭 콘텐츠(최신 발매 음악, 인기 콘텐츠)는 다음 방문 시 새로 고쳐집니다", + "@cacheExploreFeedDesc": { + "description": "Description of what explore feed cache contains" + }, + "cacheTrackLookup": "트랙 조회 캐시", + "@cacheTrackLookup": { + "description": "Cache item title for track ID lookup cache" + }, + "cacheTrackLookupDesc": "조회된 Spotify/Deezer 트랙 ID입니다. 지우면 속도가 느려질 수 있습니다", + "@cacheTrackLookupDesc": { + "description": "Description of what track lookup cache contains" + }, + "cacheCleanupUnusedDesc": "누락된 파일에 대한 불필요한 다운로드 기록 및 라이브러리 항목을 제거합니다", + "@cacheCleanupUnusedDesc": { + "description": "Description of what cleanup unused data does" + }, + "cacheNoData": "캐시된 데이터가 없음", + "@cacheNoData": { + "description": "Label when cache category has no data" + }, + "cacheSizeWithFiles": "{count} 개의 파일에 {size} 사용", + "@cacheSizeWithFiles": { + "description": "Cache size and file count", + "placeholders": { + "size": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cacheSizeOnly": "{size}", + "@cacheSizeOnly": { + "description": "Cache size only", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheEntries": "{count} 개의 항목", + "@cacheEntries": { + "description": "Track cache entry count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cacheClearSuccess": "지워짐: {target}", + "@cacheClearSuccess": { + "description": "Snackbar after clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearConfirmTitle": "캐시를 지우시겠습니까?", + "@cacheClearConfirmTitle": { + "description": "Dialog title before clearing one cache category" + }, + "cacheClearConfirmMessage": "''{target}''의 캐시된 데이터를 지웁니다. 다운로드된 음악 파일은 삭제되지 않습니다", + "@cacheClearConfirmMessage": { + "description": "Dialog message before clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearAllConfirmTitle": "모든 캐시를 지우시겠습니까?", + "@cacheClearAllConfirmTitle": { + "description": "Dialog title before clearing all caches" + }, + "cacheClearAllConfirmMessage": "이 페이지의 모든 캐시 카테고리가 지워집니다. 다운로드된 음악 파일은 삭제되지 않습니다", + "@cacheClearAllConfirmMessage": { + "description": "Dialog message before clearing all caches" + }, + "cacheClearAll": "모든 캐시 지우기", + "@cacheClearAll": { + "description": "Button label to clear all caches" + }, + "cacheCleanupUnused": "사용되지 않는 데이터 정리", + "@cacheCleanupUnused": { + "description": "Action title for cleaning unused entries" + }, + "cacheCleanupUnusedSubtitle": "불필요한 다운로드 기록 및 누락된 라이브러리 항목을 제거합니다", + "@cacheCleanupUnusedSubtitle": { + "description": "Subtitle for cleanup unused data action" + }, + "cacheCleanupResult": "정리 완료: {downloadCount} 개의 사용되지 않는 다운로드, {libraryCount} 개의 누락된 라이브러리 항목", + "@cacheCleanupResult": { + "description": "Snackbar after unused data cleanup", + "placeholders": { + "downloadCount": { + "type": "int" + }, + "libraryCount": { + "type": "int" + } + } + }, + "cacheRefreshStats": "통계 새로고침", + "@cacheRefreshStats": { + "description": "Button label to refresh cache statistics" + }, + "trackSaveCoverArt": "표지 이미지 저장", + "@trackSaveCoverArt": { + "description": "Menu action - save album cover art as file" + }, + "trackSaveLyrics": "가사 (.lrc) 저장", + "@trackSaveLyrics": { + "description": "Menu action - save lyrics as .lrc file" + }, + "trackSaveLyricsProgress": "가사를 저장하는 중...", + "@trackSaveLyricsProgress": { + "description": "Snackbar while saving lyrics to file" + }, + "trackReEnrich": "보강", + "@trackReEnrich": { + "description": "Menu action - re-embed metadata into audio file" + }, + "trackReEnrichOnlineSubtitle": "온라인에서 메타데이터를 검색하고 파일에 삽입", + "@trackReEnrichOnlineSubtitle": { + "description": "Subtitle for re-enrich metadata action for local items" + }, + "trackReEnrichFieldCover": "표지 이미지", + "@trackReEnrichFieldCover": { + "description": "Checkbox label for cover art field in re-enrich" + }, + "trackReEnrichFieldLyrics": "가사", + "@trackReEnrichFieldLyrics": { + "description": "Checkbox label for lyrics field in re-enrich" + }, + "trackReEnrichFieldBasicTags": "앨범, 앨범 아티스트", + "@trackReEnrichFieldBasicTags": { + "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" + }, + "trackReEnrichFieldTrackInfo": "트랙 & 디스크 번호", + "@trackReEnrichFieldTrackInfo": { + "description": "Checkbox label for track info in re-enrich" + }, + "trackReEnrichFieldReleaseInfo": "데이터 & ISRC", + "@trackReEnrichFieldReleaseInfo": { + "description": "Checkbox label for release info in re-enrich" + }, + "trackReEnrichFieldExtra": "장르, 레이블, 저작권", + "@trackReEnrichFieldExtra": { + "description": "Checkbox label for extra metadata in re-enrich" + }, + "trackReEnrichSelectAll": "모두 선택", + "@trackReEnrichSelectAll": { + "description": "Select all fields checkbox in re-enrich" + }, + "trackEditMetadata": "메타데이터 편집", + "@trackEditMetadata": { + "description": "Menu action - edit embedded metadata" + }, + "trackCoverSaved": "표지 이미지가 ''{fileName}''에 저장됨", + "@trackCoverSaved": { + "description": "Snackbar after cover art saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackCoverNoSource": "사용할 수 있는 표지 출처가 없음", + "@trackCoverNoSource": { + "description": "Snackbar when no cover art URL or embedded cover" + }, + "trackLyricsSaved": "가사가 ''{fileName}''에 저장됨", + "@trackLyricsSaved": { + "description": "Snackbar after lyrics saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackReEnrichProgress": "메타데이터를 다시 구성하는 중...", + "@trackReEnrichProgress": { + "description": "Snackbar while re-enriching metadata" + }, + "trackReEnrichSearching": "온라인에서 메타데이터를 검색하는 중...", + "@trackReEnrichSearching": { + "description": "Snackbar while searching metadata from internet for local items" + }, + "trackReEnrichSuccess": "메타데이터 재구성 성공", + "@trackReEnrichSuccess": { + "description": "Snackbar after successful re-enrichment" + }, + "trackReEnrichFfmpegFailed": "FFmpeg 메타데이터 삽입 실패", + "@trackReEnrichFfmpegFailed": { + "description": "Snackbar when FFmpeg embed fails for MP3/Opus" + }, + "queueFlacAction": "FLAC 다운로드 목록", + "@queueFlacAction": { + "description": "Action/button label for queueing FLAC redownloads for local tracks" + }, + "queueFlacConfirmMessage": "선택한 트랙에 대한 온라인 일치 항목을 검색하고 FLAC을 다운로드 목록에 추가합니다\n\n기존 파일은 수정되거나 삭제되지 않습니다\n\n신뢰도가 높은 일치 항목만 자동으로 대기열에 추가됩니다\n\n{count} 개가 선택되었습니다", + "@queueFlacConfirmMessage": { + "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFlacNoReliableMatches": "선택한 항목에 대한 신뢰할 수 있는 온라인 일치 항목을 찾을 수 없음", + "@queueFlacNoReliableMatches": { + "description": "Snackbar when no safe FLAC redownload matches were found" + }, + "queueFlacQueuedWithSkipped": "다운로드 목록에 {addedCount} 개의 트랙을 추가하고, {skippedCount} 개의 트랙을 건너뜀", + "@queueFlacQueuedWithSkipped": { + "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", + "placeholders": { + "addedCount": { + "type": "int" + }, + "skippedCount": { + "type": "int" + } + } + }, + "trackSaveFailed": "실패: {error}", + "@trackSaveFailed": { + "description": "Snackbar when save operation fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "trackConvertFormat": "형식 변환", + "@trackConvertFormat": { + "description": "Menu item - convert audio format" + }, + "trackConvertTitle": "오디오 변환", + "@trackConvertTitle": { + "description": "Title of convert bottom sheet" + }, + "trackConvertTargetFormat": "변경될 형식", + "@trackConvertTargetFormat": { + "description": "Label for format selection" + }, + "trackConvertBitrate": "비트레이트", + "@trackConvertBitrate": { + "description": "Label for bitrate selection" + }, + "trackConvertKeepOriginal": "원본 파일 유지", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "변환된 파일을 별도의 라이브러리 항목으로 추가합니다", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, + "trackConvertConfirmTitle": "변환 확인", + "@trackConvertConfirmTitle": { + "description": "Confirmation dialog title" + }, + "trackConvertConfirmMessage": "{bitrate} 비트레이트로 {sourceFormat}에서 {targetFormat}으로 변환하시겠습니까?\n\n변환 후 원본 파일이 삭제됩니다", + "@trackConvertConfirmMessage": { + "description": "Confirmation dialog message", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLossless": "{sourceFormat}에서 {targetFormat}으로 변환하시겠습니까? (무손실 — 음질 손실 없음)\n\n변환 후에 원본 파일이 삭제됩니다", + "@trackConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless-to-lossless conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "trackConvertConfirmKeepOriginal": "{sourceFormat}에서 {targetFormat}으로 변환하시겠습니까?\n\n원본 파일은 유지되고 변환된 파일은 별도의 라이브러리 항목으로 추가됩니다", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "trackConvertLosslessHint": "무손실 변환 — 음질 손실 없음", + "@trackConvertLosslessHint": { + "description": "Hint shown when converting between lossless formats" + }, + "trackConvertConverting": "오디오를 변환하는 중...", + "@trackConvertConverting": { + "description": "Snackbar while converting" + }, + "trackConvertSuccess": "{format}으로 변환 성공", + "@trackConvertSuccess": { + "description": "Snackbar after successful conversion", + "placeholders": { + "format": { + "type": "String" + } + } + }, + "trackConvertFailed": "변환 실패", + "@trackConvertFailed": { + "description": "Snackbar when conversion fails" + }, + "cueSplitTitle": "CUE 시트 분할", + "@cueSplitTitle": { + "description": "Title for CUE split bottom sheet" + }, + "cueSplitAlbum": "앨범: {album}", + "@cueSplitAlbum": { + "description": "Album name in CUE split sheet", + "placeholders": { + "album": { + "type": "String" + } + } + }, + "cueSplitArtist": "아티스트: {artist}", + "@cueSplitArtist": { + "description": "Artist name in CUE split sheet", + "placeholders": { + "artist": { + "type": "String" + } + } + }, + "cueSplitTrackCount": "{count} 개의 트랙", + "@cueSplitTrackCount": { + "description": "Number of tracks in CUE sheet", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitConfirmTitle": "CUE 앨범 분할", + "@cueSplitConfirmTitle": { + "description": "CUE split confirmation dialog title" + }, + "cueSplitConfirmMessage": "''{album}''을 {count} 개의 개별 FLAC 파일로 분할하시겠습니까?\n\n파일은 동일한 디렉토리에 저장됩니다", + "@cueSplitConfirmMessage": { + "description": "CUE split confirmation dialog message", + "placeholders": { + "album": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cueSplitSplitting": "CUE 시트를 분할하는 중... ({current}/{total})", + "@cueSplitSplitting": { + "description": "Snackbar while splitting CUE", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "cueSplitSuccess": "{count} 개의 트랙 분할 성공", + "@cueSplitSuccess": { + "description": "Snackbar after successful CUE split", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitFailed": "CUE 분할 실패", + "@cueSplitFailed": { + "description": "Snackbar when CUE split fails" + }, + "cueSplitNoAudioFile": "이 CUE 시트에 대한 오디오 파일을 찾을 수 없습니다", + "@cueSplitNoAudioFile": { + "description": "Error when CUE audio file is missing" + }, + "cueSplitButton": "트랙으로 분할", + "@cueSplitButton": { + "description": "Button text to start CUE splitting" + }, + "actionCreate": "만들기", + "@actionCreate": { + "description": "Generic action button - create" + }, + "collectionFoldersTitle": "내 폴더", + "@collectionFoldersTitle": { + "description": "Library section title for custom folders" + }, + "collectionWishlist": "위시리스트", + "@collectionWishlist": { + "description": "Custom folder for saved tracks to download later" + }, + "collectionLoved": "좋아요 표시한 음악", + "@collectionLoved": { + "description": "Custom folder for favorite tracks" + }, + "collectionFavoriteArtists": "좋아하는 아티스트", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionPlaylist": "재생목록", + "@collectionPlaylist": { + "description": "Single playlist label" + }, + "collectionAddToPlaylist": "재생목록에 추가", + "@collectionAddToPlaylist": { + "description": "Action to add a track to user playlist" + }, + "collectionCreatePlaylist": "재생목록 만들기", + "@collectionCreatePlaylist": { + "description": "Action to create a new playlist" + }, + "collectionNoPlaylistsYet": "아직 재생목록이 없음", + "@collectionNoPlaylistsYet": { + "description": "Empty state title when user has no playlists" + }, + "collectionPlaylistTracks": "{count, plural, =1{1 개의 트랙} other{{count} 개의 트랙}}", + "@collectionPlaylistTracks": { + "description": "Track count label for custom playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionArtistCount": "{count, plural, =1{1 명의 아티스트} other{{count} 명의 아티스트}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedToPlaylist": "''{playlistName}''에 추가됨", + "@collectionAddedToPlaylist": { + "description": "Snackbar after adding track to playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionAlreadyInPlaylist": "이미 ''{playlistName}''에 있음", + "@collectionAlreadyInPlaylist": { + "description": "Snackbar when track already exists in playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionPlaylistNameHint": "재생목록 이름", + "@collectionPlaylistNameHint": { + "description": "Hint text for playlist name input" + }, + "collectionPlaylistNameRequired": "재생목록 이름은 필수입니다", + "@collectionPlaylistNameRequired": { + "description": "Validation error for empty playlist name" + }, + "collectionRenamePlaylist": "재생목록 이름 변경", + "@collectionRenamePlaylist": { + "description": "Action to rename playlist" + }, + "collectionDeletePlaylist": "재생목록 삭제", + "@collectionDeletePlaylist": { + "description": "Action to delete playlist" + }, + "collectionPlaylistRenamed": "재생목록 이름 변경 완료", + "@collectionPlaylistRenamed": { + "description": "Snackbar after renaming playlist" + }, + "collectionWishlistEmptyTitle": "위시리스트가 비어 있음", + "@collectionWishlistEmptyTitle": { + "description": "Wishlist empty state title" + }, + "collectionWishlistEmptySubtitle": "나중에 다운로드할 트랙을 저장하려면 트랙에서 +를 탭하세요", + "@collectionWishlistEmptySubtitle": { + "description": "Wishlist empty state subtitle" + }, + "collectionLovedEmptyTitle": "'좋아요 표시한 음악' 폴더가 비어 있음", + "@collectionLovedEmptyTitle": { + "description": "Loved empty state title" + }, + "collectionLovedEmptySubtitle": "트랙에 하트를 탭하여 '좋아요'를 유지하세요", + "@collectionLovedEmptySubtitle": { + "description": "Loved empty state subtitle" + }, + "collectionFavoriteArtistsEmptyTitle": "아직 좋아하는 아티스트가 없음", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "아티스트 페이지에서 하트를 탭하여 여기에 추가하세요", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionPlaylistEmptyTitle": "재생목록이 비어 있음", + "@collectionPlaylistEmptyTitle": { + "description": "Playlist empty state title" + }, + "collectionPlaylistEmptySubtitle": "아무 트랙에서 +를 길게 탭하여 여기에 추가하세요", + "@collectionPlaylistEmptySubtitle": { + "description": "Playlist empty state subtitle" + }, + "collectionRemoveFromPlaylist": "재생목록에서 제거", + "@collectionRemoveFromPlaylist": { + "description": "Tooltip for removing track from playlist" + }, + "collectionRemoveFromFolder": "폴더에서 제거", + "@collectionRemoveFromFolder": { + "description": "Tooltip for removing track from wishlist/loved folder" + }, + "collectionAddedToLoved": "''{trackName}''이 '좋아요 표시한 음악'에 추가됨", + "@collectionAddedToLoved": { + "description": "Snackbar after adding track to loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromLoved": "''{trackName}''이 '좋아요 표시한 음악'에서 제거됨", + "@collectionRemovedFromLoved": { + "description": "Snackbar after removing track from loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToWishlist": "''{trackName}''가 위시리스트에 추가됨", + "@collectionAddedToWishlist": { + "description": "Snackbar after adding track to wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromWishlist": "''{trackName}''가 위시리스트에서 제거됨", + "@collectionRemovedFromWishlist": { + "description": "Snackbar after removing track from wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToFavoriteArtists": "''{artistName}''가 좋아하는 아티스트에 추가됨", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "''{artistName}''가 좋아하는 아티스트에서 제거됨", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "trackOptionAddToLoved": "좋아요 표시한 음악에 추가", + "@trackOptionAddToLoved": { + "description": "Bottom sheet action label - add track to loved folder" + }, + "trackOptionRemoveFromLoved": "좋아요 표시한 음악에서 제거", + "@trackOptionRemoveFromLoved": { + "description": "Bottom sheet action label - remove track from loved folder" + }, + "trackOptionAddToWishlist": "위시리스트에 추가", + "@trackOptionAddToWishlist": { + "description": "Bottom sheet action label - add track to wishlist" + }, + "trackOptionRemoveFromWishlist": "위시리스트에서 제거", + "@trackOptionRemoveFromWishlist": { + "description": "Bottom sheet action label - remove track from wishlist" + }, + "artistOptionAddToFavorites": "즐겨찾는 아티스트에 추가", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "즐겨찾는 아티스트에서 제거", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "collectionPlaylistChangeCover": "표지 이미지 변경", + "@collectionPlaylistChangeCover": { + "description": "Bottom sheet action to pick a custom cover image for a playlist" + }, + "collectionPlaylistRemoveCover": "표지 이미지 제거", + "@collectionPlaylistRemoveCover": { + "description": "Bottom sheet action to remove custom cover image from a playlist" + }, + "selectionShareCount": "{count} {count, plural, =1{트랙} other{트랙}} 공유", + "@selectionShareCount": { + "description": "Share button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionShareNoFiles": "공유할 수 있는 파일을 찾을 수 없음", + "@selectionShareNoFiles": { + "description": "Snackbar when no selected files exist on disk" + }, + "selectionConvertCount": "{count} {count, plural, =1{트랙} other{트랙}} 변환", + "@selectionConvertCount": { + "description": "Convert button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionConvertNoConvertible": "선택된 변환할 수 있는 트랙이 없음", + "@selectionConvertNoConvertible": { + "description": "Snackbar when no selected tracks support conversion" + }, + "selectionBatchConvertConfirmTitle": "일괄 변환", + "@selectionBatchConvertConfirmTitle": { + "description": "Confirmation dialog title for batch conversion" + }, + "selectionBatchConvertConfirmMessage": "{count} 개의 {count, plural, =1{트랙} other{트랙}}을 {bitrate} 비트레이트로 {format}으로 변환하시겠습니까?\n\n변환 후 원본 파일이 삭제됩니다", + "@selectionBatchConvertConfirmMessage": { + "description": "Confirmation dialog message for batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLossless": "{count} 개의 {count, plural, =1{트랙} other{트랙}}을 {format}으로 변환하시겠습니까? (무손실 — 음질 손실 없음)\n\n변환 후 원본 파일이 삭제됩니다", + "@selectionBatchConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmKeepOriginal": "{count} 개의 {count, plural, =1{트랙} other{트랙}}을 {format}으로 변환하시겠습니까?\n\n원본 파일은 유지되고 변환된 파일은 별도의 라이브러리 항목으로 추가됩니다", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "selectionBatchConvertSuccess": "{total} 개 중 {success} 개를 {format}로 변환 완료", + "@selectionBatchConvertSuccess": { + "description": "Snackbar after batch conversion completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadedAlbumDownloadedCount": "{count} 개 다운로드됨", + "@downloadedAlbumDownloadedCount": { + "description": "Downloaded tracks count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "앨범 아티스트 태그로 이름이 지정된 폴더", + "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { + "description": "Subtitle when album artist is used for folder names" + }, + "downloadUseAlbumArtistForFoldersTrackSubtitle": "트랙 아티스트 태그로 이름이 지정된 폴더", + "@downloadUseAlbumArtistForFoldersTrackSubtitle": { + "description": "Subtitle when track artist is used for folder names" + }, + "lyricsProvidersTitle": "가사 제공자 우선순위", + "@lyricsProvidersTitle": { + "description": "Settings item title for lyrics provider order" + }, + "lyricsProvidersDescription": "가사 출처를 활성화, 비활성화 및 재정렬할 수 있습니다. 가사가 발견될 때까지 위에서 아래로 제공자를 시도합니다", + "@lyricsProvidersDescription": { + "description": "Description on the lyrics provider priority page" + }, + "lyricsProvidersInfoText": "확장 프로그램 가사 제공자는 내부 가사 제공자보다 먼저 실행됩니다. 하나 이상의 제공자가 활성화되어 있어야 합니다", + "@lyricsProvidersInfoText": { + "description": "Info tip on lyrics provider priority page" + }, + "lyricsProvidersEnabledSection": "활성화됨 ({count})", + "@lyricsProvidersEnabledSection": { + "description": "Section header for enabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersDisabledSection": "비활성화됨 ({count})", + "@lyricsProvidersDisabledSection": { + "description": "Section header for disabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersAtLeastOne": "최소 한 명의 제공자가 활성화된 상태로 유지되어야 합니다", + "@lyricsProvidersAtLeastOne": { + "description": "Snackbar when user tries to disable the last enabled provider" + }, + "lyricsProvidersSaved": "가사 제공자 우선순위가 저장됨", + "@lyricsProvidersSaved": { + "description": "Snackbar after saving lyrics provider priority" + }, + "lyricsProvidersDiscardContent": "저장되지 않은 변경 사항이 손실됩니다", + "@lyricsProvidersDiscardContent": { + "description": "Body text of the discard-changes dialog on lyrics provider page" + }, + "lyricsProviderLrclibDesc": "오픈 소스 동기화 가사 데이터베이스", + "@lyricsProviderLrclibDesc": { + "description": "Description for LRCLIB provider" + }, + "lyricsProviderNeteaseDesc": "NetEase Cloud Music (아시아 노래에 적합)", + "@lyricsProviderNeteaseDesc": { + "description": "Description for Netease provider" + }, + "lyricsProviderMusixmatchDesc": "최대 규모의 가사 데이터베이스 (다국어 지원)", + "@lyricsProviderMusixmatchDesc": { + "description": "Description for Musixmatch provider" + }, + "lyricsProviderAppleMusicDesc": "단어별 동기화 가사 (프록시 경유)", + "@lyricsProviderAppleMusicDesc": { + "description": "Description for Apple Music provider" + }, + "lyricsProviderQqMusicDesc": "QQ Music (중국 노래에 적합, 프록시 경유)", + "@lyricsProviderQqMusicDesc": { + "description": "Description for QQ Music provider" + }, + "lyricsProviderLyricsPlusDesc": "단어별 노래방 가사 (Apple/Musixmatch/Spotify/QQ, 프록시 이용)", + "@lyricsProviderLyricsPlusDesc": { + "description": "Description for LyricsPlus provider" + }, + "lyricsProviderExtensionDesc": "확장 프로그램 제공자", + "@lyricsProviderExtensionDesc": { + "description": "Generic description for extension-based lyrics providers" + }, + "safMigrationTitle": "저장소 업데이트 필요", + "@safMigrationTitle": { + "description": "Title of SAF migration dialog" + }, + "safMigrationMessage1": "SpotiFLAC은 이제 다운로드에 Android 저장소 접근 프레임워크(SAF)를 사용합니다. 이로써 Android 10 이상에서 '권한 거부' 오류가 해결됩니다", + "@safMigrationMessage1": { + "description": "First paragraph of SAF migration dialog" + }, + "safMigrationMessage2": "새 저장소 시스템으로 전환하려면 다운로드 폴더를 다시 선택하세요", + "@safMigrationMessage2": { + "description": "Second paragraph of SAF migration dialog" + }, + "safMigrationSuccess": "다운로드 폴더가 SAF 모드로 업데이트됨", + "@safMigrationSuccess": { + "description": "Snackbar after successfully migrating to SAF" + }, + "settingsDonate": "개발 후원", + "@settingsDonate": { + "description": "Settings menu item - donate page" + }, + "settingsDonateSubtitle": "개발자에게 커피 한 잔 사주세요", + "@settingsDonateSubtitle": { + "description": "Subtitle for donate menu item" + }, + "settingsBackup": "백업 & 복원", + "@settingsBackup": { + "description": "Settings menu item - backup and restore page" + }, + "settingsBackupSubtitle": "라이브러리, 기록 및 설정을 새 기기로 옮겨보세요", + "@settingsBackupSubtitle": { + "description": "Subtitle for backup and restore settings item" + }, + "backupTitle": "백업 & 복원", + "@backupTitle": { + "description": "App bar title for the backup and restore page" + }, + "backupExportSectionTitle": "백업 생성", + "@backupExportSectionTitle": { + "description": "Section title for the export/backup card" + }, + "backupExportSectionDescription": "설정, 다운로드 기록, 좋아요 표시한 음악, 위시리스트, 즐겨찾는 아티스트 및 재생목록을 하나의 파일로 저장하여 보관하거나 다른 휴대전화로 옮길 수 있습니다", + "@backupExportSectionDescription": { + "description": "Description of what a backup contains" + }, + "backupExportButton": "백업 파일 생성", + "@backupExportButton": { + "description": "Button to create and share a backup file" + }, + "backupImportSectionTitle": "백업 복원", + "@backupImportSectionTitle": { + "description": "Section title for the import/restore card" + }, + "backupImportSectionDescription": "데이터를 복원할 백업 파일을 선택하세요. 이 작업을 수행하면 현재 기기에 저장된 설정, 기록 및 라이브러리가 백업 파일의 내용으로 대체됩니다", + "@backupImportSectionDescription": { + "description": "Description for the restore action" + }, + "backupImportButton": "백업 파일 선택", + "@backupImportButton": { + "description": "Button to pick a backup file to restore" + }, + "backupCreated": "백업 생성 완료", + "@backupCreated": { + "description": "Snackbar after a backup file is created" + }, + "backupCreateFailed": "백업 생성 실패", + "@backupCreateFailed": { + "description": "Snackbar when backup creation fails" + }, + "backupRestoreConfirmTitle": "이 백업을 복원하시겠습니까?", + "@backupRestoreConfirmTitle": { + "description": "Confirmation dialog title before restoring a backup" + }, + "backupRestoreConfirmMessage": "현재 설정, 다운로드 기록, 좋아요 표시한 음악, 위시리스트 및 재생목록이 백업 파일의 내용으로 대체됩니다. 이 작업은 되돌릴 수 없습니다", + "@backupRestoreConfirmMessage": { + "description": "Confirmation dialog message before restoring a backup" + }, + "backupRestoreConfirmButton": "복원", + "@backupRestoreConfirmButton": { + "description": "Confirm button to proceed with restore" + }, + "backupRestored": "백업 복원 성공", + "@backupRestored": { + "description": "Snackbar after a successful restore" + }, + "backupRestoreFailed": "백업 복원 실패", + "@backupRestoreFailed": { + "description": "Snackbar when restore fails" + }, + "backupInvalidFile": "이 파일은 유효한 SpotiFLAC 백업이 아닙니다", + "@backupInvalidFile": { + "description": "Snackbar when the chosen file is not a valid backup" + }, + "backupRestoreRestartHint": "모든 변경 사항을 적용하려면 앱을 다시 시작하세요", + "@backupRestoreRestartHint": { + "description": "Hint shown after restoring that an app restart is recommended" + }, + "backupContentsTitle": "백업 콘텐츠", + "@backupContentsTitle": { + "description": "Header above the list summarizing what the backup contains" + }, + "backupContentsSettings": "앱 설정", + "@backupContentsSettings": { + "description": "Backup contents row label for settings" + }, + "backupContentsHistory": "{count} 개의 기록 {count, plural, =1{항목} other{항목}}", + "@backupContentsHistory": { + "description": "Backup contents row for history count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsLiked": "{count} 개의 좋아요 표시한 {count, plural, =1{음악} other{음악}}", + "@backupContentsLiked": { + "description": "Backup contents row for liked tracks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsWishlist": "{count} 개의 위시리스트 {count, plural, =1{트랙} other{트랙}}", + "@backupContentsWishlist": { + "description": "Backup contents row for wishlist tracks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsPlaylists": "{count, plural, =1{1 개의 재생목록} other{{count} 개의 재생목록}}", + "@backupContentsPlaylists": { + "description": "Backup contents row for playlist count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsArtists": "{count, plural, =1{1 명의 좋아하는 아티스트} other{{count} 명의 좋아하는 아티스트}}", + "@backupContentsArtists": { + "description": "Backup contents row for favorite artists count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsExtensions": "{count, plural, =1{1 개의 확장 프로그램} other{{count} 개의 확장 프로그램}}", + "@backupContentsExtensions": { + "description": "Backup contents row for installed extensions count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupIncludeSecrets": "확장 프로그램 자격 증명 포함", + "@backupIncludeSecrets": { + "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" + }, + "backupIncludeSecretsDescription": "확장 프로그램의 토큰과 API 키가 백업 파일에 함께 저장됩니다. 백업 파일은 안전하게 보관하세요. 비활성화하면 복원 후 다시 입력해야 합니다", + "@backupIncludeSecretsDescription": { + "description": "Explanation for the include-credentials toggle" + }, + "backupExtensionsRestoreFailed": "{count} 개의 {count, plural, =1{확장 프로그램} other{확장 프로그램}}을 다시 설치할 수 없습니다. 레포에서 수동으로 설치하세요", + "@backupExtensionsRestoreFailed": { + "description": "Snackbar/hint when some extensions failed to reinstall during restore", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tooltipLoveAll": "모두 좋아요 표시", + "@tooltipLoveAll": { + "description": "Tooltip for the Love All button on album/playlist screens" + }, + "tooltipAddToPlaylist": "재생목록에 추가", + "@tooltipAddToPlaylist": { + "description": "Tooltip for the Add to Playlist button" + }, + "snackbarRemovedTracksFromLoved": "'좋아요 표시한 음악'에서 {count} 개의 트랙이 제거됨", + "@snackbarRemovedTracksFromLoved": { + "description": "Snackbar after removing multiple tracks from Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAddedTracksToLoved": "'좋아요 표시한 음악'에 {count} 개의 트랙이 추가됨", + "@snackbarAddedTracksToLoved": { + "description": "Snackbar after adding multiple tracks to Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dialogDownloadAllTitle": "모두 다운로드", + "@dialogDownloadAllTitle": { + "description": "Dialog title for bulk download confirmation" + }, + "dialogDownloadAllMessage": "{count} 개의 트랙을 다운로드하시겠습니까?", + "@dialogDownloadAllMessage": { + "description": "Body of the Download All confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "homeSkipAlreadyDownloaded": "이미 다운로드된 노래 건너뛰기", + "@homeSkipAlreadyDownloaded": { + "description": "Checkbox label in import dialog to skip already-downloaded songs" + }, + "homeGoToAlbum": "앨범으로 이동", + "@homeGoToAlbum": { + "description": "Context menu item to navigate to the album page" + }, + "homeAlbumInfoUnavailable": "앨범 정보를 사용할 수 없음", + "@homeAlbumInfoUnavailable": { + "description": "Snackbar when album info cannot be loaded" + }, + "snackbarLoadingCueSheet": "CUE 시트를 불러오는 중...", + "@snackbarLoadingCueSheet": { + "description": "Snackbar while loading a CUE sheet file" + }, + "snackbarMetadataSaved": "메타데이터 저장 성공", + "@snackbarMetadataSaved": { + "description": "Snackbar after successfully saving track metadata" + }, + "snackbarFailedToEmbedLyrics": "가사 삽입 실패", + "@snackbarFailedToEmbedLyrics": { + "description": "Snackbar when lyrics embedding fails" + }, + "snackbarFailedToWriteStorage": "저장소 다시 쓰기 실패", + "@snackbarFailedToWriteStorage": { + "description": "Snackbar when writing metadata back to file fails" + }, + "snackbarError": "오류: {error}", + "@snackbarError": { + "description": "Generic error snackbar with error detail", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "snackbarNoActionDefined": "이 버튼에 대해 정의된 작업이 없음", + "@snackbarNoActionDefined": { + "description": "Snackbar when an extension button has no action configured" + }, + "noTracksFoundForAlbum": "이 앨범에서 트랙을 찾을 수 없음", + "@noTracksFoundForAlbum": { + "description": "Empty state message when an album has no tracks" + }, + "downloadLocationSubtitle": "다운로드된 트랙을 저장할 위치를 선택하세요", + "@downloadLocationSubtitle": { + "description": "Subtitle shown in the download location picker sheet" + }, + "storageModeAppFolder": "앱 폴더 (추천)", + "@storageModeAppFolder": { + "description": "Storage mode option - app-managed folder" + }, + "storageModeAppFolderSubtitle": "기본적으로 Music/SpotiFLAC에 저장", + "@storageModeAppFolderSubtitle": { + "description": "Subtitle for app folder storage mode" + }, + "storageModeSaf": "사용자 정의 폴더 (SAF)", + "@storageModeSaf": { + "description": "Storage mode option - Storage Access Framework" + }, + "storageModeSafSubtitle": "SD 카드를 포함한 아무 폴더나 선택하세요", + "@storageModeSafSubtitle": { + "description": "Subtitle for SAF storage mode" + }, + "downloadFolderAccessLostTitle": "다운로드 폴더 접근 손실", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "폴더를 다시 선택할 때까지 다운로드할 수 없습니다", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "폴더 다시 선택", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF 권한이 잘못되었거나 취소되었습니다. 설정에서 다운로드 위치를 다시 설정하세요", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "다운로드 폴더 접근 권한이 없습니다. 설정에서 다운로드 폴더를 다시 설정하세요", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, + "downloadFilenameDescription": "''{artist}'', ''{title}'', ''{album}'', ''{track}'', ''{year}'', ''{date}'', ''{disc}''를 자리표시자로 사용하세요", + "@downloadFilenameDescription": { + "description": "Description shown in filename format editor" + }, + "downloadFilenameInsertTag": "태그를 삽입하려면 탭하세요:", + "@downloadFilenameInsertTag": { + "description": "Label above filename tag chips" + }, + "downloadSeparateSinglesEnabled": "싱글과 EP를 별도의 폴더에 저장합니다", + "@downloadSeparateSinglesEnabled": { + "description": "Subtitle when separate singles folder is on" + }, + "downloadSeparateSinglesDisabled": "싱글과 앨범을 같은 폴더에 저장합니다", + "@downloadSeparateSinglesDisabled": { + "description": "Subtitle when separate singles folder is off" + }, + "downloadArtistNameFilters": "아티스트 이름 필터", + "@downloadArtistNameFilters": { + "description": "Setting title for artist folder filter options" + }, + "downloadCreatePlaylistSourceFolder": "재생목록 소스 폴더", + "@downloadCreatePlaylistSourceFolder": { + "description": "Setting to create a subfolder per playlist source" + }, + "downloadCreatePlaylistSourceFolderEnabled": "각 재생 목록에 대한 하위 폴더를 만듭니다", + "@downloadCreatePlaylistSourceFolderEnabled": { + "description": "Subtitle when playlist folder is enabled" + }, + "downloadCreatePlaylistSourceFolderDisabled": "모든 트랙을 다운로드 폴더에 직접 저장합니다", + "@downloadCreatePlaylistSourceFolderDisabled": { + "description": "Subtitle when playlist folder is disabled" + }, + "downloadCreatePlaylistSourceFolderRedundant": "폴더 구성 설정에 의해 처리됨", + "@downloadCreatePlaylistSourceFolderRedundant": { + "description": "Subtitle when folder organization is already set to playlist" + }, + "downloadSongLinkRegion": "SongLink 지역", + "@downloadSongLinkRegion": { + "description": "Setting for SongLink region used during fallback resolution" + }, + "downloadNetworkCompatibilityMode": "네트워크 호환 모드", + "@downloadNetworkCompatibilityMode": { + "description": "Setting for legacy TLS/network handling" + }, + "downloadNetworkCompatibilityModeEnabled": "이전 네트워크에 대한 레거시 TLS 설정 사용", + "@downloadNetworkCompatibilityModeEnabled": { + "description": "Subtitle when network compatibility mode is on" + }, + "downloadNetworkCompatibilityModeDisabled": "표준 ​​네트워크 설정 사용", + "@downloadNetworkCompatibilityModeDisabled": { + "description": "Subtitle when network compatibility mode is off" + }, + "downloadAllowLocalNetwork": "로컬 네트워크 접근 허용", + "@downloadAllowLocalNetwork": { + "description": "Setting title for allowing requests to private/local network targets" + }, + "downloadAllowLocalNetworkEnabled": "로컬/사설 주소에 대한 요청이 허용됨 (로컬 프록시 또는 사용자 지정 DNS용)", + "@downloadAllowLocalNetworkEnabled": { + "description": "Subtitle when allow local network access is on" + }, + "downloadAllowLocalNetworkDisabled": "보안을 위해 로컬/사설 주소가 차단됨", + "@downloadAllowLocalNetworkDisabled": { + "description": "Subtitle when allow local network access is off" + }, + "downloadSelectServiceToEnable": "이 옵션을 활성화하려면 음질 옵션이 있는 공급자를 선택하세요", + "@downloadSelectServiceToEnable": { + "description": "Subtitle when quality picker is disabled due to extension service" + }, + "downloadEmbedLyricsDisabled": "먼저 메타데이터 삽입을 활성화하세요", + "@downloadEmbedLyricsDisabled": { + "description": "Subtitle when lyrics embedding is blocked by metadata toggle" + }, + "downloadNeteaseIncludeTranslation": "Netease: 번역 포함", + "@downloadNeteaseIncludeTranslation": { + "description": "Setting to include translated lyrics from Netease" + }, + "downloadNeteaseIncludeTranslationEnabled": "중국어 번역 포함", + "@downloadNeteaseIncludeTranslationEnabled": { + "description": "Subtitle when Netease translation is on" + }, + "downloadNeteaseIncludeTranslationDisabled": "원본 가사만", + "@downloadNeteaseIncludeTranslationDisabled": { + "description": "Subtitle when Netease translation is off" + }, + "downloadNeteaseIncludeRomanization": "Netease: 로마자 표기 포함", + "@downloadNeteaseIncludeRomanization": { + "description": "Setting to include romanized lyrics from Netease" + }, + "downloadNeteaseIncludeRomanizationEnabled": "로마자 표기 포함", + "@downloadNeteaseIncludeRomanizationEnabled": { + "description": "Subtitle when Netease romanization is on" + }, + "downloadNeteaseIncludeRomanizationDisabled": "로마자 표기 없음", + "@downloadNeteaseIncludeRomanizationDisabled": { + "description": "Subtitle when Netease romanization is off" + }, + "downloadAppleQqMultiPerson": "Apple / QQ: 다인용 가사", + "@downloadAppleQqMultiPerson": { + "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" + }, + "downloadAppleQqMultiPersonEnabled": "듀엣 및 그룹 트랙이 포함된 스피커 레이블", + "@downloadAppleQqMultiPersonEnabled": { + "description": "Subtitle when multi-person lyrics is on" + }, + "downloadAppleQqMultiPersonDisabled": "스피커 레이블이 없는 표준 가사", + "@downloadAppleQqMultiPersonDisabled": { + "description": "Subtitle when multi-person lyrics is off" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC 단어 동기화", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "단어별 타임스탬프 원본 유지", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "더 안전한 Apple Music 가사 (줄 단위)", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "downloadMusixmatchLanguage": "Musixmatch 언어", + "@downloadMusixmatchLanguage": { + "description": "Setting for Musixmatch lyrics translation language" + }, + "downloadMusixmatchLanguageAuto": "자동 (원본 언어)", + "@downloadMusixmatchLanguageAuto": { + "description": "Subtitle when no language is set" + }, + "downloadFilterContributing": "참여 아티스트 필터", + "@downloadFilterContributing": { + "description": "Setting to strip contributing artists from Album Artist folder name" + }, + "downloadFilterContributingEnabled": "앨범 아티스트 폴더 이름에서 제거된 참여 아티스트", + "@downloadFilterContributingEnabled": { + "description": "Subtitle when contributing artist filter is on" + }, + "downloadFilterContributingDisabled": "전체 앨범 아티스트 문자열 사용", + "@downloadFilterContributingDisabled": { + "description": "Subtitle when contributing artist filter is off" + }, + "downloadProvidersNoneEnabled": "활성화된 제공자가 없음", + "@downloadProvidersNoneEnabled": { + "description": "Shown when no lyrics providers are active" + }, + "downloadMusixmatchLanguageCode": "언어 코드", + "@downloadMusixmatchLanguageCode": { + "description": "Label for Musixmatch language input field" + }, + "downloadMusixmatchLanguageHint": "예시: en, de, ja", + "@downloadMusixmatchLanguageHint": { + "description": "Placeholder for Musixmatch language input" + }, + "downloadMusixmatchLanguageDesc": "Musixmatch에서 번역된 가사를 요청하려면 BCP-47 언어 코드를 입력하세요 (예시: ko, en, ja)", + "@downloadMusixmatchLanguageDesc": { + "description": "Description in Musixmatch language picker" + }, + "downloadMusixmatchAuto": "자동", + "@downloadMusixmatchAuto": { + "description": "Button to clear Musixmatch language (use auto)" + }, + "downloadNetworkAnySubtitle": "Wi-Fi 또는 모바일 네트워크 사용", + "@downloadNetworkAnySubtitle": { + "description": "Subtitle for any-network option in picker" + }, + "downloadNetworkWifiOnlySubtitle": "모바일 네트워크 사용 시 다운로드 일시 중지", + "@downloadNetworkWifiOnlySubtitle": { + "description": "Subtitle for WiFi-only option in picker" + }, + "downloadSongLinkRegionDesc": "SongLink를 통해 트랙 링크를 해결할 경우에 사용되는 지역입니다. 스트리밍 서비스를 이용할 수 있는 국가를 선택하세요", + "@downloadSongLinkRegionDesc": { + "description": "Description in SongLink region picker" + }, + "snackbarUnsupportedAudioFormat": "지원되지 않는 오디오 형식", + "@snackbarUnsupportedAudioFormat": { + "description": "Snackbar when the audio format is not supported for the requested operation" + }, + "cacheRefresh": "새로고침", + "@cacheRefresh": { + "description": "Tooltip for refresh button on cache management page" + }, + "dialogDownloadPlaylistsMessage": "{playlistCount} 개의 {playlistCount, plural, =1{재생목록} other{재생록록}}에서 {trackCount} 개의 {trackCount, plural, =1{트랙} other{트랙}}을 다운로드하시겠습니까?", + "@dialogDownloadPlaylistsMessage": { + "description": "Dialog message for bulk playlist download confirmation", + "placeholders": { + "trackCount": { + "type": "int" + }, + "playlistCount": { + "type": "int" + } + } + }, + "bulkDownloadPlaylistsButton": "{count} 개의 {count, plural, =1{재생목록} other{재생목록}} 다운로드", + "@bulkDownloadPlaylistsButton": { + "description": "Button label for bulk downloading selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "bulkDownloadSelectPlaylists": "다운로드할 재생목록 선택", + "@bulkDownloadSelectPlaylists": { + "description": "Button label when no playlists are selected for download" + }, + "snackbarSelectedPlaylistsEmpty": "선택한 재생목록에 트랙이 없습니다", + "@snackbarSelectedPlaylistsEmpty": { + "description": "Snackbar when selected playlists contain no tracks" + }, + "playlistsCount": "{count, plural, =1{1 개의 재생목록} other{{count} 개의 재생목록}}", + "@playlistsCount": { + "description": "Playlist count display", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFill": "온라인에서 자동 채우기", + "@editMetadataAutoFill": { + "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" + }, + "editMetadataAutoFillDesc": "온라인 메타데이터에서 자동으로 채워질 필드를 선택하세요", + "@editMetadataAutoFillDesc": { + "description": "Description for the auto-fill section" + }, + "editMetadataAutoFillFetch": "가져오기 & 채우기", + "@editMetadataAutoFillFetch": { + "description": "Button label to fetch online metadata and fill selected fields" + }, + "editMetadataAutoFillSearching": "온라인에서 검색하는 중...", + "@editMetadataAutoFillSearching": { + "description": "Snackbar shown while searching for online metadata" + }, + "editMetadataAutoFillNoResults": "온라인에서 일치하는 메타데이터를 찾을 수 없음", + "@editMetadataAutoFillNoResults": { + "description": "Snackbar when online metadata search returns no results" + }, + "editMetadataAutoFillDone": "온라인 메타데이터로부터 {count} 개의 {count, plural, =1{필드} other{필드}}가 채워짐", + "@editMetadataAutoFillDone": { + "description": "Snackbar confirming how many fields were auto-filled", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFillNoneSelected": "자동 채우기를 위해 하나 이상의 필드를 선택하세요", + "@editMetadataAutoFillNoneSelected": { + "description": "Snackbar when user taps Fetch without selecting any fields" + }, + "editMetadataFieldTitle": "제목", + "@editMetadataFieldTitle": { + "description": "Chip label for title field in auto-fill selector" + }, + "editMetadataFieldArtist": "아티스트", + "@editMetadataFieldArtist": { + "description": "Chip label for artist field in auto-fill selector" + }, + "editMetadataFieldAlbum": "앨범", + "@editMetadataFieldAlbum": { + "description": "Chip label for album field in auto-fill selector" + }, + "editMetadataFieldAlbumArtist": "앨범 아티스트", + "@editMetadataFieldAlbumArtist": { + "description": "Chip label for album artist field in auto-fill selector" + }, + "editMetadataFieldDate": "날짜", + "@editMetadataFieldDate": { + "description": "Chip label for date field in auto-fill selector" + }, + "editMetadataFieldTrackNum": "트랙 #", + "@editMetadataFieldTrackNum": { + "description": "Chip label for track number field in auto-fill selector" + }, + "editMetadataFieldDiscNum": "디스크 #", + "@editMetadataFieldDiscNum": { + "description": "Chip label for disc number field in auto-fill selector" + }, + "editMetadataFieldGenre": "장르", + "@editMetadataFieldGenre": { + "description": "Chip label for genre field in auto-fill selector" + }, + "editMetadataFieldIsrc": "ISRC", + "@editMetadataFieldIsrc": { + "description": "Chip label for ISRC field in auto-fill selector" + }, + "editMetadataFieldLabel": "레이블", + "@editMetadataFieldLabel": { + "description": "Chip label for label field in auto-fill selector" + }, + "editMetadataFieldCopyright": "저작권", + "@editMetadataFieldCopyright": { + "description": "Chip label for copyright field in auto-fill selector" + }, + "editMetadataFieldCover": "표지 이미지", + "@editMetadataFieldCover": { + "description": "Chip label for cover art field in auto-fill selector" + }, + "editMetadataSelectAll": "모두", + "@editMetadataSelectAll": { + "description": "Button to select all fields for auto-fill" + }, + "editMetadataSelectEmpty": "비어 있음만", + "@editMetadataSelectEmpty": { + "description": "Button to select only fields that are currently empty" + }, + "queueDownloadingCount": "다운로드하는 중 ({count})", + "@queueDownloadingCount": { + "description": "Header for active downloads section with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFilteringIndicator": "필터링하는 중...", + "@queueFilteringIndicator": { + "description": "Shown while filter results are being computed" + }, + "queueTrackCount": "{count, plural, =1{1 개의 트랙} other{{count} 개의 트랙}}", + "@queueTrackCount": { + "description": "Track count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueAlbumCount": "{count, plural, =1{1 개의 앨범} other{{count} 개의 앨범}}", + "@queueAlbumCount": { + "description": "Album count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyAlbums": "앨범 다운로드가 없음", + "@queueEmptyAlbums": { + "description": "Empty state title when no album downloads exist" + }, + "queueEmptyAlbumsSubtitle": "앨범에서 여러 트랙을 다운로드하면 여기에 표시됩니다", + "@queueEmptyAlbumsSubtitle": { + "description": "Empty state subtitle for album downloads" + }, + "queueEmptySingles": "싱글 다운로드가 없음", + "@queueEmptySingles": { + "description": "Empty state title when no single track downloads exist" + }, + "queueEmptySinglesSubtitle": "싱글 트랙 다운로드는 여기에 표시됩니다", + "@queueEmptySinglesSubtitle": { + "description": "Empty state subtitle for single track downloads" + }, + "queueEmptyHistory": "다운로드 기록이 없음", + "@queueEmptyHistory": { + "description": "Empty state title when download history is empty" + }, + "queueEmptyHistorySubtitle": "다운로드된 트랙이 여기에 표시됩니다", + "@queueEmptyHistorySubtitle": { + "description": "Empty state subtitle for download history" + }, + "selectionAllPlaylistsSelected": "모든 재생목록이 선택됨", + "@selectionAllPlaylistsSelected": { + "description": "Shown when all playlists are selected in selection mode" + }, + "selectionTapPlaylistsToSelect": "선택할 재생목록을 탭하세요", + "@selectionTapPlaylistsToSelect": { + "description": "Hint shown in playlist selection mode" + }, + "selectionSelectPlaylistsToDelete": "삭제할 재생 목록 선택", + "@selectionSelectPlaylistsToDelete": { + "description": "Hint shown when no playlists are selected for deletion" + }, + "audioAnalysisTitle": "오디오 음질 분석", + "@audioAnalysisTitle": { + "description": "Title for audio analysis section" + }, + "audioAnalysisDescription": "스펙트럼 분석으로 무손실 음질을 확인합니다", + "@audioAnalysisDescription": { + "description": "Description for audio analysis tap-to-analyze prompt" + }, + "audioAnalysisAnalyzing": "오디오를 분석하는 중...", + "@audioAnalysisAnalyzing": { + "description": "Loading text while analyzing audio" + }, + "audioAnalysisSampleRate": "샘플링 레이트", + "@audioAnalysisSampleRate": { + "description": "Sample rate metric label" + }, + "audioAnalysisCodec": "코덱", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "컨테이너", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "디코딩 형식", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisBitDepth": "비트 심도", + "@audioAnalysisBitDepth": { + "description": "Bit depth metric label" + }, + "audioAnalysisChannels": "채널", + "@audioAnalysisChannels": { + "description": "Channels metric label" + }, + "audioAnalysisDuration": "재생시간", + "@audioAnalysisDuration": { + "description": "Duration metric label" + }, + "audioAnalysisNyquist": "나이퀴스트", + "@audioAnalysisNyquist": { + "description": "Nyquist frequency metric label" + }, + "audioAnalysisFileSize": "크기", + "@audioAnalysisFileSize": { + "description": "File size metric label" + }, + "audioAnalysisDynamicRange": "다이나믹 레인지", + "@audioAnalysisDynamicRange": { + "description": "Dynamic range metric label" + }, + "audioAnalysisPeak": "최대 피크", + "@audioAnalysisPeak": { + "description": "Peak amplitude metric label" + }, + "audioAnalysisRms": "RMS", + "@audioAnalysisRms": { + "description": "RMS level metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "트루 피크", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "클리핑", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "클리핑 없음", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "주파수 컷오프", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisChannelStats": "채널별 통계", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "audioAnalysisSamples": "샘플", + "@audioAnalysisSamples": { + "description": "Total samples metric label" + }, + "audioAnalysisRescan": "다시 분석", + "@audioAnalysisRescan": { + "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" + }, + "audioAnalysisRescanning": "오디오를 다시 분석하는 중...", + "@audioAnalysisRescanning": { + "description": "Loading text while audio is being re-analyzed after an explicit refresh" + }, + "extensionsHomeFeedProvider": "홈 피드 제공자", + "@extensionsHomeFeedProvider": { + "description": "Extensions page - label for home feed provider selector" + }, + "extensionsHomeFeedDescription": "메인 화면에 홈 피드를 제공하는 확장 프로그램을 선택하세요", + "@extensionsHomeFeedDescription": { + "description": "Extensions page - description for home feed provider picker" + }, + "extensionsHomeFeedAuto": "자동", + "@extensionsHomeFeedAuto": { + "description": "Label for auto-selected search provider" + }, + "extensionsHomeFeedAutoSubtitle": "사용 가능한 최적의 항목을 자동으로 선택합니다", + "@extensionsHomeFeedAutoSubtitle": { + "description": "Extensions page - subtitle for auto home feed option" + }, + "extensionsHomeFeedOff": "끄기", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "메인 화면에 홈 피드를 표시하지 않습니다", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "extensionsHomeFeedUse": "{extensionName} 홈 피드 사용", + "@extensionsHomeFeedUse": { + "description": "Extensions page - subtitle for a specific extension home feed option", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "extensionsNoHomeFeedExtensions": "홈 피드가 있는 확장 프로그램가 없음", + "@extensionsNoHomeFeedExtensions": { + "description": "Extensions page - shown when no installed extension has home feed" + }, + "cancelDownloadTitle": "다운로드를 취소하시겠습니까?", + "@cancelDownloadTitle": { + "description": "Dialog title when confirming cancellation of an active download" + }, + "cancelDownloadContent": "''{trackName}''에 대한 활성 다운로드를 취소합니다", + "@cancelDownloadContent": { + "description": "Dialog body when confirming cancellation of an active download", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "cancelDownloadKeep": "유지", + "@cancelDownloadKeep": { + "description": "Dialog button - keep the active download (do not cancel)" + }, + "metadataSaveFailedFfmpeg": "FFmpeg를 통해 메타데이터 저장 실패", + "@metadataSaveFailedFfmpeg": { + "description": "Snackbar error when FFmpeg fails to write metadata" + }, + "metadataSaveFailedStorage": "저장소에 메타데이터 다시 쓰기 실패", + "@metadataSaveFailedStorage": { + "description": "Snackbar error when writing metadata file back to storage fails" + }, + "snackbarFolderPickerFailed": "폴더 선택기 열기 실패: {error}", + "@snackbarFolderPickerFailed": { + "description": "Snackbar shown when folder picker fails to open", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "notifDownloadingTrack": "''{trackName}''를 다운로드하는 중", + "@notifDownloadingTrack": { + "description": "Notification title while downloading a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifFinalizingTrack": "''{trackName}''를 마무리하는 중", + "@notifFinalizingTrack": { + "description": "Notification title while finalizing (embedding metadata) a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifEmbeddingMetadata": "메타데이터를 삽입하는 중...", + "@notifEmbeddingMetadata": { + "description": "Notification body while embedding metadata into a downloaded track" + }, + "notifAlreadyInLibraryCount": "이미 라이브러리에 있음 ({completed}/{total})", + "@notifAlreadyInLibraryCount": { + "description": "Notification title when track is already in library, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifAlreadyInLibrary": "이미 라이브러리에 있음", + "@notifAlreadyInLibrary": { + "description": "Notification title when track is already in library" + }, + "notifDownloadCompleteCount": "다운로드 완료 ({completed}/{total})", + "@notifDownloadCompleteCount": { + "description": "Notification title when download is complete, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifDownloadComplete": "다운로드 완료", + "@notifDownloadComplete": { + "description": "Notification title when a single download is complete" + }, + "notifDownloadsFinished": "다운로드 완료 ({completed} 개 완료, {failed} 개 실패)", + "@notifDownloadsFinished": { + "description": "Notification title when queue finishes with some failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifVerificationRequiredTitle": "인증 필요", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "앱을 실행하여 인증을 완료하고 다운로드를 재개하세요", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, + "notifAllDownloadsComplete": "모든 다운로드 완료", + "@notifAllDownloadsComplete": { + "description": "Notification title when all downloads finish successfully" + }, + "notifTracksDownloadedSuccess": "{count, plural, =1{1 개의 트랙 다운로드 성공} other{{count} 개의 트랙 다운로드 성공}}", + "@notifTracksDownloadedSuccess": { + "description": "Notification body for queue complete - how many tracks were downloaded", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 개의 트랙 다운로드 성공} other{{completed} 개의 트랙 다운로드 성공}}, {failed, plural, =1{1 개 실패} other{{failed} 개 실패}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "다운로드 취소됨", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 개의 다운로드가 사용자에 의해 취소됨} other{{count} 개의 다운로드가 사용자에 의해 취소됨}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifScanningLibrary": "로컬 라이브러리를 스캔하는 중", + "@notifScanningLibrary": { + "description": "Notification title while scanning local library" + }, + "notifLibraryScanProgressWithTotal": "{scanned}/{total} 개의 파일 • {percentage}%", + "@notifLibraryScanProgressWithTotal": { + "description": "Notification body for library scan progress when total is known", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanProgressNoTotal": "{scanned} 게의 파일이 스캔됨 • {percentage}%", + "@notifLibraryScanProgressNoTotal": { + "description": "Notification body for library scan progress when total is unknown", + "placeholders": { + "scanned": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanComplete": "라이브러리 스캔 완료", + "@notifLibraryScanComplete": { + "description": "Notification title when library scan finishes" + }, + "notifLibraryScanCompleteBody": "{count} 개의 트랙이 색인됨", + "@notifLibraryScanCompleteBody": { + "description": "Notification body for library scan complete - number of indexed tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanExcluded": "{count} 개가 제외됨", + "@notifLibraryScanExcluded": { + "description": "Library scan complete suffix - excluded track count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanErrors": "{count} 개의 오류", + "@notifLibraryScanErrors": { + "description": "Library scan complete suffix - error count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanFailed": "라이브러리 스캔 실패", + "@notifLibraryScanFailed": { + "description": "Notification title when library scan fails" + }, + "notifLibraryScanCancelled": "라이브러리 스캔이 취소됨", + "@notifLibraryScanCancelled": { + "description": "Notification title when library scan is cancelled by the user" + }, + "notifLibraryScanStopped": "스캔이 완료되기 전에 중단되었습니다", + "@notifLibraryScanStopped": { + "description": "Notification body when library scan is cancelled" + }, + "notifDownloadingUpdate": "SpotiFLAC Mobile v{version}을 다운로드하는 중", + "@notifDownloadingUpdate": { + "description": "Notification title while downloading an app update", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateProgress": "{received} / {total} MB • {percentage}%", + "@notifUpdateProgress": { + "description": "Notification body showing update download progress", + "placeholders": { + "received": { + "type": "String" + }, + "total": { + "type": "String" + }, + "percentage": { + "type": "int" + } + } + }, + "notifUpdateReady": "업데이트 준비 완료", + "@notifUpdateReady": { + "description": "Notification title when app update download is complete" + }, + "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} 다운로드 완료. 설치하려면 탭하세요", + "@notifUpdateReadyBody": { + "description": "Notification body when app update is ready to install", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateFailed": "업데이트 실패", + "@notifUpdateFailed": { + "description": "Notification title when app update download fails" + }, + "notifUpdateFailedBody": "업데이트를 다운로드할 수 없습니다. 나중에 다시 시도하세요", + "@notifUpdateFailedBody": { + "description": "Notification body when app update download fails" + }, + "searchTracks": "트랙", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "지원되는 URL을 붙여넣거나 검색...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "{providerName}으로 검색...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "CSV 가져오기", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV file into Home search" + }, + "homeChangeSearchProviderTooltip": "검색 제공자 변경", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "붙여넣기", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "tutorialSearchHint": "붙여넣기 또는 검색하기...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "다운로드 완료", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "다운로드를 진행하는 중", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "다운로드 시작", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "메타데이터 삽입", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "메타데이터, 표지 이미지 및 내장 가사를 파일에 기록", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "비활성화됨 (고급): 모든 메타데이터 삽입 건너뛰기", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "trackCoverNoEmbeddedArt": "내장된 표지 이미지가 없음", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "표지 교체", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "표지 선택", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "선택된 표지 지우기", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "현재 표지", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "선택된 표지", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "저장을 탭하면 선택한 표지가 현재 내장된 표지를 대체합니다", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "actionStop": "중지", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "다운로드를 마무리하는 중", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadedFileMissing": "다운로드된 파일이 없음", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "다운로드 완료", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "서비스 사용 제한됨", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "이 트랙은 아직 사용 가능할 수 있습니다. 몇 분 기다렸다가 병렬 다운로드를 줄인 후에 다시 시도하세요", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "강조 색상 {hex} 선택", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "자동 스크롤: ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "자동 스크롤: OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "로그 복사", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "로그 지우기", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP 차단 감지됨", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "ISP에서 다운로드 서비스 접속을 차단했을 수 있습니다", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "VPN을 사용하거나 DNS를 1.1.1.1 또는 8.8.8.8로 변경해 보세요", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "사용 제한", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "서비스에 대한 요청이 너무 많습니다", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "몇 분 기다린 후에 다시 시도하세요", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "네트워크 오류", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "연결 문제가 감지됨", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "인터넷 연결 상태를 확인하세요", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "트랙을 찾을 수 없음", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "일부 트랙은 다운로드 서비스에서 찾을 수 없습니다", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "트랙이 무손실 음질로 제공되지 않을 수 있습니다", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "아티스트를 검색하는 중...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} 정보를 사용할 수 없음", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "태그", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "정보", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "유틸리티 함수", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "닫기", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "폴더 변경", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "''{artistName}''의 트랙 ''{trackName}'' 열기", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "{itemType} {name} 열기", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "{title}, {count} 개의 {count, plural, =1{항목} other{항목}} 열기", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "''{artistName}''의 앨범 ''{albumName}'' 열기 ({trackCount} 번째 곡)", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "''{artistName}''의 ''{trackName}''", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "앨범 ''{albumName}'' 선택", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "앨범 ''{albumName}'' 열기", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "settingsFiles": "파일 & 폴더", + "@settingsFiles": { + "description": "Settings menu item - file and folder settings" + }, + "settingsFilesSubtitle": "다운로드 위치, 파일 이름, 폴더 구조", + "@settingsFilesSubtitle": { + "description": "Subtitle for files & folders settings" + }, + "settingsMetadata": "메타데이터", + "@settingsMetadata": { + "description": "Settings menu item - metadata settings" + }, + "settingsMetadataSubtitle": "표지 이미지, 태그, 리플레이게인, 제공자", + "@settingsMetadataSubtitle": { + "description": "Subtitle for metadata settings" + }, + "settingsLyrics": "가사", + "@settingsLyrics": { + "description": "Settings menu item - lyrics settings" + }, + "settingsLyricsSubtitle": "삽입, 모드, 제공자, 언어 옵션", + "@settingsLyricsSubtitle": { + "description": "Subtitle for lyrics settings" + }, + "settingsApp": "앱", + "@settingsApp": { + "description": "Settings menu item - app settings" + }, + "settingsAppSubtitle": "업데이트, 데이터, 확장프로그램 레포, 디버그", + "@settingsAppSubtitle": { + "description": "Subtitle for app settings" + }, + "sectionMetadataProviders": "제공자", + "@sectionMetadataProviders": { + "description": "Settings section header for metadata providers" + }, + "sectionDuplicates": "중복", + "@sectionDuplicates": { + "description": "Settings section header for deduplication" + }, + "sectionLyricsProviderOptions": "제공자 옵션", + "@sectionLyricsProviderOptions": { + "description": "Settings section header for per-provider lyrics options" + }, + "metadataProvidersTitle": "메타데이터 제공자 우선순위", + "@metadataProvidersTitle": { + "description": "Settings item title for metadata provider order" + }, + "metadataProvidersSubtitle": "드래그하여 검색 및 메타데이터 출처 순서를 설정하세요", + "@metadataProvidersSubtitle": { + "description": "Subtitle for metadata provider priority item" + }, + "downloadDeduplication": "중복 다운로드 건너뛰기", + "@downloadDeduplication": { + "description": "Setting - skip tracks already in download history" + }, + "downloadDeduplicationEnabled": "이미 다운로드된 트랙은 건너뜁니다", + "@downloadDeduplicationEnabled": { + "description": "Subtitle when deduplication is on" + }, + "downloadDeduplicationWithQualityVariants": "선택된 음질의 기존 파일은 건너뜁니다", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, + "downloadDeduplicationDisabled": "기록과 관계없이 모든 트랙이 다운로드됩니다", + "@downloadDeduplicationDisabled": { + "description": "Subtitle when deduplication is off" + }, + "downloadQualityVariants": "다양한 음질 버전 허용", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "선택된 음질을 파일 이름에 추가하고, 각 버전을 다운로드 기록에 유지합니다", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "다른 음질 다운로드", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, + "downloadFallbackExtensions": "대체 확장 프로그램", + "@downloadFallbackExtensions": { + "description": "Settings item for configuring fallback extension providers" + }, + "downloadFallbackExtensionsSubtitle": "대체 확장 프로그램으로 사용할 확장 프로그램을 선택하세요", + "@downloadFallbackExtensionsSubtitle": { + "description": "Subtitle for fallback extensions item" + }, + "editMetadataFieldDateHint": "YYYY-MM-DD 또는 YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "전체 트랙 수", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "전체 디스크 수", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "작곡가", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "주석", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "고급", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "트랙 번호 누락", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "디스크 번호 누락", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "아티스트 누락", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "ISRC 형식이 잘못됨", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingLabel": "레이블 누락", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "{count} 개의 {count, plural, =1{재생목록} other{재생목록}}을 삭제하시겠습니까?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} 개의 {count, plural, =1{재생목록} other{재생목록}}이 삭제됨", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "''{playlistName}''에 {count} 개의 {count, plural, =1{트랙} other{트랙}}이 추가됨", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "''{playlistName}''에 {count} 개의 {count, plural, =1{트랙} other{트랙}}이 추가됨 ({alreadyCount} 개의 트랙은 이미 재생목록에 있음)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} 개의 {count, plural, =1{항목} other{항목}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "메타데이터 재구성 성공 ({successCount}/{total}) - 실패: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "{count} {count, plural, =1{트랙} other{트랙}} 삭제", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "다운로드하는 중 - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "queueDownloadStarting": "시작하는 중...", + "queueCheckingDownloadSession": "다운로드 세션을 확인하는 중...", + "queueResolvingDownloadMetadata": "트랙 메타데이터를 확인하는 중...", + "queueResolvingDownloadStream": "오디오 스트림을 준비하는 중...", + "queueWaitingForVerification": "확인을 기다리는 중...", + "queueResumingAfterVerification": "확인 후 재개하는 중...", + "@queueDownloadStarting": { + "description": "Queue status before download progress is available" + }, + "a11ySelectTrack": "트랙 선택", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "트랙 선택 해제", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "''{artistName}''의 ''{trackName}'' 재생", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} 개의 {count, plural, =1{확장 프로그램} other{확장 프로그램}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "v{version} 이상 필요", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "이동", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "문제 요약", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "총 오류 수: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "영향받은 도메인: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "스캔이 취소됨", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "준비가 되면 스캔을 다시 시도할 수 있습니다", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "다운로드 기록에서 {count} 개 (목록에서 제외됨)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "기본 다운로드 워커", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "확장 프로그램 다운로드를 위한 Android 백그라운드 서비스", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "badgeBeta": "베타", + "@badgeBeta": { + "description": "Badge label for beta features" + }, + "extensionServiceStatus": "서비스 상태", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "서비스 상태", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} 개의 {count, plural, =1{검사} other{검사}}가 설정됨", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Spotify에 연결을 탭하여 이 필드를 채우세요", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "마지막 확인 시간: {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "상태 새로고침", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "사용자 정의 URL 처리", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "이 확장 프로그램은 다음 사이트의 링크를 처리할 수 있습니다", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "이 사이트의 링크를 SpotiFLAC Mobile로 공유하면 이 확장 프로그램이 처리합니다", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} 개의 {count, plural, =1{설정} other{설정}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "온라인", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "저하됨", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "오프라인", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "설정되지 않음", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "알 수 없음", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "필수", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "설정되지 않음", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "작업 실패", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "값을 입력하세요", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "서비스 온라인", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "서비스 저하됨", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "서비스 오프라인", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "서비스 상태 알 수 없음", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "스테레오", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "모노", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "{serviceName}에서 열기", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "내장", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "알 수 없는 앨범", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "알 수 없는 아티스트", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "오디오", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "저장소", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "알림", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "잘못된 폴더가 선택됨", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "storeAnyVersion": "모든", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "메타데이터", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "다운로드", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "유틸리티", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "가사", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "연동", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "발매 음악", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "없음", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "재시도 {count} 번 실패", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "다운로드 기록 저장", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "완료된 다운로드를 기록 및 라이브러리 보기에 유지합니다", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "다운로드 기록을 끄시겠습니까?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "기존 기록이 삭제됩니다. 다운로드된 파일은 삭제되지 않습니다", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "끄고 지우기", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "다른 서비스에서 열기", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "호환되는 다른 서비스가 없음", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "찾을 수 없음", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "링크 복사", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} 링크가 복사됨", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } + }, + "libraryPlayback": "재생", + "@libraryPlayback": { + "description": "Section header for playback settings in library settings" + }, + "libraryExternalPlayer": "외부 플레이어", + "@libraryExternalPlayer": { + "description": "Setting option to use an external music player" + }, + "libraryExternalPlayerSubtitle": "감상용으로 권장됩니다. 최고 음질, 갭리스 재생, EQ 및 다양한 오디오 형식을 지원합니다", + "@libraryExternalPlayerSubtitle": { + "description": "Subtitle for external player option" + }, + "libraryBuiltInPreviewPlayer": "내부 미리듣기 플레이어", + "@libraryBuiltInPreviewPlayer": { + "description": "Setting option to use the built-in preview player" + }, + "libraryBuiltInPreviewPlayerSubtitle": "SpotiFLAC Mobile에서 빠른 로컬 미리듣기 전용이며, 일반적인 음악 감상에는 권장되지 않습니다", + "@libraryBuiltInPreviewPlayerSubtitle": { + "description": "Subtitle for built-in preview player option" + }, + "libraryBuiltInPlayerInfo": "내부 플레이어는 로컬 트랙을 빠르게 미리듣기 위한 도구입니다. 실제 음악 감상은 외부 음악 플레이어를 이용하는 것을 권장합니다", + "@libraryBuiltInPlayerInfo": { + "description": "Info note explaining the built-in player is for previews only" + }, + "nowPlayingTitle": "현재 재생 중", + "@nowPlayingTitle": { + "description": "Title for the now playing screen" + }, + "nowPlayingNothingPlaying": "재생 중인 노래가 없음", + "@nowPlayingNothingPlaying": { + "description": "Empty state when no track is currently playing" + }, + "nowPlayingMinimize": "최소화", + "@nowPlayingMinimize": { + "description": "Tooltip for minimizing the now playing screen" + }, + "nowPlayingUpNext": "다음 곡", + "@nowPlayingUpNext": { + "description": "Title for the playback queue sheet" + }, + "nowPlayingDetails": "트랙 세부 정보", + "@nowPlayingDetails": { + "description": "Menu item and section title for track metadata details" + }, + "nowPlayingOpenInExternalPlayer": "외부 플레이어에서 열기", + "@nowPlayingOpenInExternalPlayer": { + "description": "Menu item to open the current track in an external player" + }, + "nowPlayingTabPlayer": "플레이어", + "@nowPlayingTabPlayer": { + "description": "Tab label for the player view" + }, + "nowPlayingTabLyrics": "가사", + "@nowPlayingTabLyrics": { + "description": "Tab label for the lyrics view" + }, + "nowPlayingNoLyrics": "이 파일에는 가사가 없음", + "@nowPlayingNoLyrics": { + "description": "Empty state when the playing file has no embedded lyrics" + }, + "nowPlayingLibraryEmpty": "라이브러리가 비어 있음", + "@nowPlayingLibraryEmpty": { + "description": "Snackbar when shuffle library is requested but library has no tracks" + }, + "nowPlayingShuffleLibraryFailed": "라이브러리에서 셔플을 사용할 수 없음: {error}", + "@nowPlayingShuffleLibraryFailed": { + "description": "Snackbar when shuffling the library fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "nowPlayingShuffleOn": "셔플 켜기", + "@nowPlayingShuffleOn": { + "description": "Tooltip when shuffle mode is enabled" + }, + "nowPlayingPlayInOrder": "순서대로 재생", + "@nowPlayingPlayInOrder": { + "description": "Tooltip when shuffle mode is disabled" + }, + "nowPlayingShuffleLibrary": "라이브러리 셔플", + "@nowPlayingShuffleLibrary": { + "description": "Button label to shuffle and play the entire local library" + }, + "nowPlayingQueueEmpty": "현재 다운로드 목록이 비어 있음", + "@nowPlayingQueueEmpty": { + "description": "Empty state when the playback queue has no items" + }, + "nowPlayingNoMetadata": "사용할 수 있는 메타데이터가 없음", + "@nowPlayingNoMetadata": { + "description": "Empty state when track metadata cannot be loaded" + }, + "announcementUnableToOpenLink": "링크를 열 수 없습니다. 다시 시도해 주세요", + "@announcementUnableToOpenLink": { + "description": "Snackbar shown when an announcement CTA link cannot be opened" + }, + "trackConvertLosslessOutputWithCap": "{quality} 제한이 있는 무손실 출력", + "@trackConvertLosslessOutputWithCap": { + "description": "Hint shown when lossless conversion will cap bit depth or sample rate", + "placeholders": { + "quality": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLosslessCapped": "{sourceFormat}에서 {targetFormat}({quality})으로 변환하시겠습니까?\n\n출력은 무손실 코덱을 유지하지만 비트 심도/샘플 속도가 제한됩니다. 변환 후 원본 파일이 삭제됩니다", + "@trackConvertConfirmMessageLosslessCapped": { + "description": "Confirmation dialog message for capped lossless conversion of a single file", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLosslessCapped": "{count} 개의 {count, plural, =1{트랙} other{트랙}}을 {format}({quality})으로 변환하시겠습니까?\n\n출력은 무손실 코덱을 유지하지만 비트 심도/샘플 속도가 제한됩니다. 변환 후 원본 파일이 삭제됩니다", + "@selectionBatchConvertConfirmMessageLosslessCapped": { + "description": "Confirmation dialog message for capped lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "trackConvertActionLabelLossless": "{sourceFormat} → {targetFormat} ({quality})", + "@trackConvertActionLabelLossless": { + "description": "Convert button label for lossless conversion with quality cap", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", + "@trackConvertActionLabelLossy": { + "description": "Convert button label for lossy conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "aboutPaxsenixSubtitle": "Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou 및 Genius용 가사 프록시", + "@aboutPaxsenixSubtitle": { + "description": "Subtitle for Paxsenix special thanks entry on the about page" + }, + "snackbarPlayingNext": "다음 곡 재생", + "@snackbarPlayingNext": { + "description": "Snackbar when a track is inserted as the next queue item" + }, + "snackbarAddedToQueueGeneric": "현재 다운로드 목록에 추가됨", + "@snackbarAddedToQueueGeneric": { + "description": "Snackbar when a track is added to the playback queue without naming it" + }, + "selectionDeletePlaylistsCount": "{count} {count, plural, =1{재생목록} other{재생목록}} 삭제", + "@selectionDeletePlaylistsCount": { + "description": "Button label for deleting multiple selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "actionShuffle": "셔플", + "@actionShuffle": { + "description": "Tooltip for shuffle playback action" + }, + "downloadPrimaryArtistOnlyOn": "기본 아티스트만: ON", + "@downloadPrimaryArtistOnlyOn": { + "description": "Status label when primary-artist-only folder naming is enabled" + }, + "downloadPrimaryArtistOnlyOff": "기본 아티스트만: OFF", + "@downloadPrimaryArtistOnlyOff": { + "description": "Status label when primary-artist-only folder naming is disabled" + }, + "downloadAlbumArtistMetadataPrimaryOnly": "앨범 아티스트 메타데이터: 기본만", + "@downloadAlbumArtistMetadataPrimaryOnly": { + "description": "Status label when album-artist folder filtering uses primary artist only" + }, + "downloadAlbumArtistMetadataFull": "앨범 아티스트 메타데이터: 전체", + "@downloadAlbumArtistMetadataFull": { + "description": "Status label when album-artist folder filtering uses full metadata" + }, + "trackConvertOriginal": "원본", + "@trackConvertOriginal": { + "description": "Label for keeping original bit depth or sample rate during conversion" + }, + "trackConvertOriginalQuality": "원본 음질", + "@trackConvertOriginalQuality": { + "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" + }, + "trackConvertLosslessSuffix": "무손실", + "@trackConvertLosslessSuffix": { + "description": "Suffix used in converted lossless quality labels" + }, + "trackConvertDithering": "디더링", + "@trackConvertDithering": { + "description": "Section label for lossless conversion dithering options" + }, + "trackConvertResampler": "리샘플러", + "@trackConvertResampler": { + "description": "Section label for lossless conversion resampler options" + }, + "trackConvertDitherNone": "없음", + "@trackConvertDitherNone": { + "description": "Lossless conversion dither option with no dithering applied" + }, + "trackConvertDitherTriangular": "TPDF", + "@trackConvertDitherTriangular": { + "description": "Lossless conversion triangular probability density function dither option" + }, + "trackConvertDitherTriangularHp": "삼각형 HP", + "@trackConvertDitherTriangularHp": { + "description": "Lossless conversion high-pass triangular dither option" + }, + "trackConvertResamplerSwr": "SWR", + "@trackConvertResamplerSwr": { + "description": "Lossless conversion default FFmpeg swresample resampler option" + }, + "trackConvertResamplerSoxr": "SoXr", + "@trackConvertResamplerSoxr": { + "description": "Lossless conversion SoX resampler option" + }, + "updateSeeReleaseNotes": "자세한 내용은 릴리스 노트를 참조하세요", + "@updateSeeReleaseNotes": { + "description": "Fallback changelog text when release notes cannot be parsed" + }, + "unknownTitle": "알 수 없는 제목", + "@unknownTitle": { + "description": "Fallback track title when metadata is missing" + }, + "trackPlayNext": "다음 곡 재생", + "@trackPlayNext": { + "description": "Menu action to play a track as the next queue item" + }, + "trackAddToQueue": "다운로드 목록에 추가", + "@trackAddToQueue": { + "description": "Menu action to add a track to the playback queue" + }, + "snackbarExtensionInstalledEnable": "''{extensionName}''이 설치됨. '설정 > 확장 프로그램'에서 활성화하세요", + "@snackbarExtensionInstalledEnable": { + "description": "Snackbar after installing an extension from the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarExtensionUpdatedVersion": "''{extensionName}''이 v{version}으로 업데이트됨", + "@snackbarExtensionUpdatedVersion": { + "description": "Snackbar after updating an extension from the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + }, + "version": { + "type": "String" + } + } + }, + "snackbarFailedToInstallNamed": "{extensionName} 설치 실패", + "@snackbarFailedToInstallNamed": { + "description": "Snackbar when extension install fails in the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarFailedToUpdateNamed": "{extensionName} 업데이트 실패", + "@snackbarFailedToUpdateNamed": { + "description": "Snackbar when extension update fails in the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "releaseTypeEp": "EP", + "@releaseTypeEp": { + "description": "Badge label for EP releases" + }, + "releaseTypeSingle": "싱글", + "@releaseTypeSingle": { + "description": "Badge label for single releases" + }, + "trackCoverOnline": "온라인 표지", + "@trackCoverOnline": { + "description": "Label shown when metadata autofill downloaded cover art from the internet" + }, + "regionCountryUS": "미국", + "@regionCountryUS": { + "description": "Country name for SongLink region picker" + }, + "regionCountryGB": "영국", + "@regionCountryGB": { + "description": "Country name for SongLink region picker" + }, + "regionCountryFR": "프랑스", + "@regionCountryFR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryDE": "독일", + "@regionCountryDE": { + "description": "Country name for SongLink region picker" + }, + "regionCountryJP": "일본", + "@regionCountryJP": { + "description": "Country name for SongLink region picker" + }, + "regionCountryKR": "한국", + "@regionCountryKR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryIN": "인도", + "@regionCountryIN": { + "description": "Country name for SongLink region picker" + }, + "regionCountryID": "인도네시아", + "@regionCountryID": { + "description": "Country name for SongLink region picker" + }, + "regionCountryBR": "브라질", + "@regionCountryBR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryMX": "멕시코", + "@regionCountryMX": { + "description": "Country name for SongLink region picker" + }, + "regionCountryAU": "호주", + "@regionCountryAU": { + "description": "Country name for SongLink region picker" + }, + "regionCountryCA": "캐나다", + "@regionCountryCA": { + "description": "Country name for SongLink region picker" + }, + "regionCountryXK": "코소보", + "@regionCountryXK": { + "description": "Country name for SongLink region picker" + }, + "extensionVerificationBrowserTitle": "인증 브라우저", + "@extensionVerificationBrowserTitle": { + "description": "Settings option title for extension verification browser preference" + }, + "extensionVerificationBrowserSubtitleExternal": "인증을 기본 브라우저에서 먼저 실행합니다", + "@extensionVerificationBrowserSubtitleExternal": { + "description": "Subtitle when external browser is preferred for extension verification" + }, + "extensionVerificationBrowserSubtitleInApp": "인증을 앱 내 브라우저에서 먼저 실행합니다", + "@extensionVerificationBrowserSubtitleInApp": { + "description": "Subtitle when in-app browser is preferred for extension verification" + }, + "extensionVerificationBrowserExternal": "외부", + "@extensionVerificationBrowserExternal": { + "description": "Chip label for external browser verification mode" + }, + "extensionVerificationBrowserInApp": "내부", + "@extensionVerificationBrowserInApp": { + "description": "Chip label for in-app browser verification mode" + }, + "extensionVerificationHelpTitleManual": "수동으로 인증 열기", + "@extensionVerificationHelpTitleManual": { + "description": "Dialog title when automatic browser launch for verification fails" + }, + "extensionVerificationHelpTitleWaiting": "아직 인증을 기다리는 중", + "@extensionVerificationHelpTitleWaiting": { + "description": "Dialog title when verification is taking longer than expected" + }, + "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile에서 브라우저를 자동으로 열지 못하였습니다. 아래 링크를 브라우저에서 열거나 직접 복사하세요", + "@extensionVerificationHelpMessageManual": { + "description": "Dialog message when automatic browser launch for verification fails" + }, + "extensionVerificationHelpMessageWaiting": "브라우저가 열리지 않았거나 인증을 완료한 후에도 SpotiFLAC Mobile로 돌아오지 않았다면, 아래 링크를 다시 열거나 직접 복사하세요", + "@extensionVerificationHelpMessageWaiting": { + "description": "Dialog message when verification may need manual browser help" + }, + "extensionVerificationClose": "닫기", + "@extensionVerificationClose": { + "description": "Button to dismiss the extension verification help dialog" + }, + "extensionVerificationCopyLink": "링크 복사", + "@extensionVerificationCopyLink": { + "description": "Button to copy the extension verification URL" + }, + "extensionVerificationLinkCopied": "인증 링크가 복사됨", + "@extensionVerificationLinkCopied": { + "description": "Snackbar after copying the extension verification URL" + }, + "extensionVerificationOpenBrowser": "브라우저 열기", + "@extensionVerificationOpenBrowser": { + "description": "Button to open the extension verification URL in a browser" + } +} diff --git a/lib/l10n/arb/app_pt_PT.arb b/lib/l10n/arb/app_pt_PT.arb index 9fdbe334..3eae4c3a 100644 --- a/lib/l10n/arb/app_pt_PT.arb +++ b/lib/l10n/arb/app_pt_PT.arb @@ -143,7 +143,7 @@ "description": "Share button tooltip" }, "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "extensionsInstallButton": "Instalar Extensão", "@extensionsInstallButton": { @@ -317,7 +317,7 @@ }, "optionsExtensionStore": "Repositório de extensões", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", "@libraryDownloadsHistoryExcluded": { @@ -459,7 +459,7 @@ }, "storeFilterDownload": "Baixar", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "@collectionAddToPlaylist": { "description": "Action to add a track to user playlist" @@ -613,7 +613,7 @@ "@logClearLogsTitle": { "description": "Clear logs dialog title" }, - "storageModeSafSubtitle": "Pick any folder, including SD card", + "storageModeSafSubtitle": "Escolha qualquer pasta, incluindo o cartão SD", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, @@ -1151,7 +1151,7 @@ }, "storeFilterMetadata": "Metadados", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "shareSheetCopyLink": "Copy Link", "errorRateLimitedMessage": "Muitas solicitações. Por favor, aguarde um momento antes de pesquisar novamente.", @@ -1575,7 +1575,7 @@ "@artistOptionRemoveFromFavorites": { "description": "Action label - remove artist from favorite artists" }, - "collectionPlaylistEmptyTitle": "Playlist is empty", + "collectionPlaylistEmptyTitle": "A lista de reprodução está vazia", "@collectionPlaylistEmptyTitle": { "description": "Playlist empty state title" }, @@ -1732,7 +1732,7 @@ }, "storeFilterUtility": "Utilidade", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "collectionAddedToPlaylist": "Added to \"{playlistName}\"", "@collectionAddedToPlaylist": { @@ -3328,7 +3328,7 @@ }, "libraryPlayback": "Playback", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "aboutApp": "Aplicativo", "@aboutApp": { @@ -3348,7 +3348,7 @@ "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", "storeFilterIntegration": "Integração", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "@lyricsProvidersAtLeastOne": { "description": "Snackbar when user tries to disable the last enabled provider" @@ -3471,7 +3471,7 @@ "@recentTypeArtist": { "description": "Recent access item type - artist" }, - "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", + "collectionPlaylistEmptySubtitle": "", "artistCompilations": "Compilações", "@artistCompilations": { "description": "Section header for compilations" @@ -3538,7 +3538,7 @@ }, "storeTitle": "Repositório de extensões", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "libraryCleared": "Library cleared", "@libraryCleared": { @@ -3853,7 +3853,7 @@ }, "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "extensionPostProcessing": "Pós-Processamento", "@searchTracks": { @@ -4167,7 +4167,7 @@ } } }, - "notifLibraryScanCancelled": "Library scan cancelled", + "notifLibraryScanCancelled": "Escaneamento de biblioteca cancelado", "@notifLibraryScanCancelled": { "description": "Notification title when library scan is cancelled by the user" }, @@ -4444,7 +4444,7 @@ "appName": "SpotiFLAC Mobile", "storeRepoDialogCurrent": "Repositório atual:", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "@trackLyrics": { "description": "Tab title - lyrics" @@ -4557,7 +4557,7 @@ "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "storeSearch": "Pesquisar extensões...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "aboutTelegramChat": "Comunidade do Telegram", "lyricsModeBoth": "Ambos", @@ -5013,7 +5013,7 @@ "@cueSplitNoAudioFile": { "description": "Error when CUE audio file is missing" }, - "notifLibraryScanStopped": "Scan stopped before completion.", + "notifLibraryScanStopped": "", "@settingsMetadata": { "description": "Settings menu item - metadata settings" }, @@ -5716,7 +5716,7 @@ "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", "extensionVerificationHelpTitleManual": "Open verification manually", "dialogDiscard": "Descartar", - "storageModeSaf": "Custom Folder (SAF)", + "storageModeSaf": "", "errorRateLimited": "Tráfico Limitado (Rate Limited)", "downloadSelectQuality": "Selecionar Qualidade", "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", @@ -5883,5 +5883,144 @@ "extensionsSearchProviderDescription": "Escolha qual serviço utilizar para pesquisar faixas", "albumFolderAlbumOnly": "Somente Álbum", "nowPlayingOpenInExternalPlayer": "Open in external player", - "cueSplitButton": "Split into Tracks" + "cueSplitButton": "Split into Tracks", + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification..." } diff --git a/lib/l10n/arb/app_ru.arb b/lib/l10n/arb/app_ru.arb index ad9dd3e9..105fc736 100644 --- a/lib/l10n/arb/app_ru.arb +++ b/lib/l10n/arb/app_ru.arb @@ -143,7 +143,7 @@ "description": "Share button tooltip" }, "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "extensionsInstallButton": "Установить расширение", "@extensionsInstallButton": { @@ -317,7 +317,7 @@ }, "optionsExtensionStore": "Репозиторий расширения", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", "@libraryDownloadsHistoryExcluded": { @@ -459,7 +459,7 @@ }, "storeFilterDownload": "Скачивание", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "@collectionAddToPlaylist": { "description": "Action to add a track to user playlist" @@ -1151,7 +1151,7 @@ }, "storeFilterMetadata": "Метаданные", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "shareSheetCopyLink": "Copy Link", "errorRateLimitedMessage": "Слишком много запросов. Пожалуйста, подождите минуту перед повторным поиском.", @@ -1732,7 +1732,7 @@ }, "storeFilterUtility": "Утилиты", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "collectionAddedToPlaylist": "Добавлено в \"{playlistName}\"", "@collectionAddedToPlaylist": { @@ -3328,7 +3328,7 @@ }, "libraryPlayback": "Playback", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "aboutApp": "Приложение", "@aboutApp": { @@ -3348,7 +3348,7 @@ "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", "storeFilterIntegration": "Интеграция", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "@lyricsProvidersAtLeastOne": { "description": "Snackbar when user tries to disable the last enabled provider" @@ -3538,7 +3538,7 @@ }, "storeTitle": "Репозиторий расширения", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "libraryCleared": "Библиотека очищена", "@libraryCleared": { @@ -3853,7 +3853,7 @@ }, "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "extensionPostProcessing": "Постобработка", "@searchTracks": { @@ -4444,7 +4444,7 @@ "appName": "Spotify", "storeRepoDialogCurrent": "Текущий репозиторий:", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "@trackLyrics": { "description": "Tab title - lyrics" @@ -4557,7 +4557,7 @@ "downloadUseAlbumArtistForFoldersTrackSubtitle": "Папка названная в честь тега Трека Артиста", "storeSearch": "Поиск расширений...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "aboutTelegramChat": "Сообщество в Telegram", "lyricsModeBoth": "Оба варианта", @@ -5883,5 +5883,144 @@ "extensionsSearchProviderDescription": "Выберите, какой сервис использовать для поиска треков", "albumFolderAlbumOnly": "Только альбом", "nowPlayingOpenInExternalPlayer": "Open in external player", - "cueSplitButton": "Разделить на Треки" + "cueSplitButton": "Разделить на Треки", + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification..." } diff --git a/lib/l10n/arb/app_tr.arb b/lib/l10n/arb/app_tr.arb index 5ba29461..370d2200 100644 --- a/lib/l10n/arb/app_tr.arb +++ b/lib/l10n/arb/app_tr.arb @@ -143,7 +143,7 @@ "description": "Share button tooltip" }, "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "extensionsInstallButton": "Uzantı Yükle", "@extensionsInstallButton": { @@ -317,7 +317,7 @@ }, "optionsExtensionStore": "Eklenti Deposu", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", "@libraryDownloadsHistoryExcluded": { @@ -459,7 +459,7 @@ }, "storeFilterDownload": "İndir", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "@collectionAddToPlaylist": { "description": "Action to add a track to user playlist" @@ -1151,7 +1151,7 @@ }, "storeFilterMetadata": "Meta Veri", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "shareSheetCopyLink": "Copy Link", "errorRateLimitedMessage": "Çok fazla istek. Lütfen arama yapmadan önce biraz bekleyin.", @@ -1732,7 +1732,7 @@ }, "storeFilterUtility": "Araç", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "collectionAddedToPlaylist": "\"{playlistName}\"e eklendi", "@collectionAddedToPlaylist": { @@ -3328,7 +3328,7 @@ }, "libraryPlayback": "Playback", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "aboutApp": "Uygulama", "@aboutApp": { @@ -3348,7 +3348,7 @@ "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", "storeFilterIntegration": "Entegrasyon", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "@lyricsProvidersAtLeastOne": { "description": "Snackbar when user tries to disable the last enabled provider" @@ -3538,7 +3538,7 @@ }, "storeTitle": "Uzantı Deposu", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "libraryCleared": "Kütüphane temizlendi", "@libraryCleared": { @@ -3853,7 +3853,7 @@ }, "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "extensionPostProcessing": "Son İşlem", "@searchTracks": { @@ -4444,7 +4444,7 @@ "appName": "SpotiFLAC Mobile", "storeRepoDialogCurrent": "Mevcut depo:", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "@trackLyrics": { "description": "Tab title - lyrics" @@ -4557,7 +4557,7 @@ "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "storeSearch": "Eklenti ara...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "aboutTelegramChat": "Telegram Grubu", "lyricsModeBoth": "Her ikisi de", @@ -5883,5 +5883,144 @@ "extensionsSearchProviderDescription": "Parça aramak için hangi servisin kullanılacağını seçin", "albumFolderAlbumOnly": "Yalnızca Albüm", "nowPlayingOpenInExternalPlayer": "Open in external player", - "cueSplitButton": "Parçalara Ayrılmış" + "cueSplitButton": "Parçalara Ayrılmış", + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification..." } diff --git a/lib/l10n/arb/app_uk.arb b/lib/l10n/arb/app_uk.arb index a6521e49..a83eb3af 100644 --- a/lib/l10n/arb/app_uk.arb +++ b/lib/l10n/arb/app_uk.arb @@ -143,7 +143,7 @@ "description": "Share button tooltip" }, "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "extensionsInstallButton": "Встановити розширення", "@extensionsInstallButton": { @@ -317,7 +317,7 @@ }, "optionsExtensionStore": "Репозиторій розширень", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", "@libraryDownloadsHistoryExcluded": { @@ -459,7 +459,7 @@ }, "storeFilterDownload": "Завантажити", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "@collectionAddToPlaylist": { "description": "Action to add a track to user playlist" @@ -1151,7 +1151,7 @@ }, "storeFilterMetadata": "Метадані", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "shareSheetCopyLink": "Copy Link", "errorRateLimitedMessage": "Забагато запитів. Будь ласка, зачекайте хвилинку, перш ніж шукати знову.", @@ -1732,7 +1732,7 @@ }, "storeFilterUtility": "Утиліта", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "collectionAddedToPlaylist": "Додано до \"{playlistName}\"", "@collectionAddedToPlaylist": { @@ -3328,7 +3328,7 @@ }, "libraryPlayback": "Playback", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "aboutApp": "Додаток", "@aboutApp": { @@ -3348,7 +3348,7 @@ "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", "storeFilterIntegration": "Інтеграція", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "@lyricsProvidersAtLeastOne": { "description": "Snackbar when user tries to disable the last enabled provider" @@ -3538,7 +3538,7 @@ }, "storeTitle": "Репозиторій розширень", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "libraryCleared": "Бібліотека очищена", "@libraryCleared": { @@ -3853,7 +3853,7 @@ }, "lyricsProviderMusixmatchDesc": "Найбільша база даних текстів пісень (багатомовна)", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "extensionPostProcessing": "Післяобробка", "@searchTracks": { @@ -4444,7 +4444,7 @@ "appName": "SpotiFLAC Mobile", "storeRepoDialogCurrent": "Поточний репозиторій:", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "@trackLyrics": { "description": "Tab title - lyrics" @@ -4557,7 +4557,7 @@ "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", "storeSearch": "Розширення пошуку...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "aboutTelegramChat": "Telegram Спільнота", "lyricsModeBoth": "Обидва", @@ -5883,5 +5883,144 @@ "extensionsSearchProviderDescription": "Виберіть, який сервіс використовувати для пошуку треків", "albumFolderAlbumOnly": "Тільки альбом", "nowPlayingOpenInExternalPlayer": "Open in external player", - "cueSplitButton": "Розділити на треки" + "cueSplitButton": "Розділити на треки", + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification..." } diff --git a/lib/l10n/supported_locales.dart b/lib/l10n/supported_locales.dart index d70362d1..ff65548b 100644 --- a/lib/l10n/supported_locales.dart +++ b/lib/l10n/supported_locales.dart @@ -14,6 +14,7 @@ const int translationThreshold = 70; /// Only these languages will be available in the app. const List filteredSupportedLocales = [ Locale('en'), + Locale('ko'), Locale('fr'), Locale('es', 'ES'), Locale('de'), @@ -28,6 +29,7 @@ const List filteredSupportedLocales = [ /// Set of locale codes for quick lookup. const Set filteredLocaleCodes = { 'en', + 'ko', 'fr', 'es_ES', 'de', diff --git a/lib/screens/settings/appearance_settings_page.dart b/lib/screens/settings/appearance_settings_page.dart index 9fef4db7..f1dc1db9 100644 --- a/lib/screens/settings/appearance_settings_page.dart +++ b/lib/screens/settings/appearance_settings_page.dart @@ -694,6 +694,7 @@ class _LanguageSelector extends StatelessWidget { ('es_ES', 'Español (España)', Icons.language), ('fr', 'Français', Icons.language), ('ja', '日本語', Icons.language), + ('ko', '한국어', Icons.language), ('pt', 'Português', Icons.language), ('pt_PT', 'Português (Brasil)', Icons.language), ('ru', 'Русский', Icons.language), diff --git a/lib/screens/setup_screen.dart b/lib/screens/setup_screen.dart index 2500763f..aceae6d7 100644 --- a/lib/screens/setup_screen.dart +++ b/lib/screens/setup_screen.dart @@ -710,6 +710,7 @@ class _SetupScreenState extends ConsumerState { ('es_ES', 'Español (España)', Icons.language), ('fr', 'Français', Icons.language), ('ja', '日本語', Icons.language), + ('ko', '한국어', Icons.language), ('pt', 'Português', Icons.language), ('pt_PT', 'Português (Brasil)', Icons.language), ('ru', 'Русский', Icons.language),